1. HOME»
  2. プログラミング・Web»
  3. JavaScript»
  4. JavaScriptでRPGを作ろう!スマホにも対応したゲームの作り方

JavaScriptでRPGを作ろう!スマホにも対応したゲームの作り方

アル

ねぇ、りこちゃん。「くろねこラビリンス」のラビリンスってなんだろう……

りこ

ラビリンス? うーん。むずかしい言葉ことばだよね

アル

ねぇ、山田先生。ラビリンスってなに?

山田

迷宮めいきゅうって意味いみだべよ……まぁ迷路めいろのことだべ

アル

あぁ、迷路のことだったんだ!

目次
  1. シーンを関数にまとめてみよう!
  2. タイトルシーンを作ろう!
  3. シーンを切り替えてみよう!

シーンを関数にまとめてみよう!

つづいて、プログラムをもっと見やすくするために、シーンを関数かんすうにまとめてみようと思います。

山田

さてアルくん、このあとはタイトルシーンを作りたいべけど、いまはメインシーンということで、変数へんすうsceneにいろんなものを追加ついかして動かしてるべ
では、タイトルシーンとメインシーン、2つのシーンを作るにはどうすればいいべ?

アル

えっと、タイトルシーン用の変数をべつに作って、そこにタイトルに表示させたいいろんなものを追加すればいいのかな

山田

まぁ、その方法ほうほうもあるべな……けど、もっといい方法として、関数を使う方法と、クラスを使う方法があるべ

アル

どうやるの?

山田

もしクラスを使うなら、メインシーンとタイトルシーンのクラスを作って、Sceneクラスを継承けいしょうするべ

アル

継承……それむずかしいから、ぼく苦手にがてなんだよな……

山田

そういうと思ったべ。でも安心するべ。今回は関数を使った方法で、シーンをまとめてみようと思うべ

アル

関数ならまだ分かるかも!

山田

ではまず、メインシーンを関数にまとめてみるべ!

js/main.js

'use strict'

//ブラウザがページを完全に読みこむまで待つ
addEventListener( 'load', () => {

	//変数gameに、あなたはゲームですよ、と教える
	const game = new Game();

	//メインシーン
	const mainScene = () => {

		//マップの作成
		const map = [
			[11,11,11,11,11,11,11,11,11,11],
			[11,10,10,10,10,10,10,10,10,11],
			[11, 4, 4, 4, 4, 4, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4,11,11,11,11,10,10, 4,11],
			[11, 4,11,10,10,11, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4, 9, 4, 4, 9,10,11, 4,11],
			[11, 4, 4, 4, 4, 4, 4,11, 4,11],
			[11,11,11,11,11,11,11,11,11,11]
		];
		//タイルのサイズ
		const TILE_SIZE = 32;
		//歩く速さ
		const WALKING_SPEED = 4;

		//変数sceneに、あなたはシーンですよ、と教える
		const scene = new Scene();

		//変数tilemapに、あなたはタイルマップですよ、と教える
		const tilemap = new Tilemap( 'img/tile.png' );
		//tilemap.dataに、どんなマップなのか教える
		tilemap.data = map;
		//マップ全体の位置をずらす
		tilemap.x = TILE_SIZE*4 - TILE_SIZE/2;
		tilemap.y = TILE_SIZE*3 - TILE_SIZE/2;
		//移動できないタイルを指定する
		tilemap.obstacles = [0, 3, 6, 7, 8, 9, 10, 11];
		//マップを登録する
		scene.add( tilemap );

		//変数startに、あなたはスタートのタイルですよ、と教える
		const start = new Tile( 'img/start.png' );
		//マップ左上からの座標を指定する
		start.x = TILE_SIZE;
		start.y = TILE_SIZE*2;
		//スタートのタイルを、tilemapに追加して、とお願いする
		tilemap.add( start );

		//変数goalに、あなたはゴールのタイルですよ、と教える
		const goal = new Tile( 'img/goal.png' );
		//マップ左上からの座標を指定する
		goal.x = TILE_SIZE*8;
		goal.y = TILE_SIZE*8;
		//ゴールのタイルを、tilemapに追加して、とお願いする
		tilemap.add( goal );

		//変数yamadaに、あなたは山田先生のキャラクタータイルですよ、と教える
		const yamada = new CharacterTile( 'img/yamada.png' );
		//山田先生を画面の中央に配置
		yamada.x = yamada.y = TILE_SIZE*5 - TILE_SIZE/2;
		//タイルマップの動きと同期させない
		yamada.isSynchronize = false;
		//tilemapに、山田先生のタイルを追加して、とお願いする
		tilemap.add( yamada );

		//キャラクターのアニメーションのための変数
		let toggleForAnimation = 0;
		//ゴールのテキストが表示されているかどうかの変数
		let hasDisplayedGoalText = false;
		//移動可能かどうかの変数
		let isMovable = true;

		//ループから常に呼び出される
		scene.onenterframe = () => {
			//タイルマップの位置がタイルのサイズで割り切れるとき
			if ( ( tilemap.x - TILE_SIZE/2 ) % TILE_SIZE === 0 && ( tilemap.y - TILE_SIZE/2 ) % TILE_SIZE === 0 ) {
				//タイルマップの移動速度に0を代入する
				tilemap.vx = tilemap.vy = 0;
				//山田先生の画像を切り替える
				yamada.animation = 1;

				//山田先生のタイルがゴールのタイルと重なっているとき、イベントを発生させる
				if ( yamada.isOverlapped( goal ) ) {
					//ゴールのテキストが表示されていないとき
					if ( !hasDisplayedGoalText ) {
						//変数goalTextに、あなたは「ゴールだべ!」というテキストだよ、と教える
						const goalText = new Text( 'ゴールだべ!' );
						//テキストサイズを変更
						goalText.size = 50;
						//テキストを上下左右中央の位置にする
						goalText.center().middle();
						//シーンにテキストを追加
						scene.add( goalText );
						//ゴールのテキストが表示されているかどうかの変数にtrueを代入
						hasDisplayedGoalText = true;
						//移動ができないようにする
						isMovable = false;
					}
				}

				//移動可能なとき
				if ( isMovable ) {
					//方向キーが押されているときは、タイルマップの移動速度と、山田先生の向きに、それぞれの値を代入する
					if ( game.input.left ) {
						tilemap.vx = WALKING_SPEED;
						yamada.direction = 1;
					}
					else if ( game.input.right ) {
						tilemap.vx = -1 * WALKING_SPEED;
						yamada.direction = 2;
					}
					else if ( game.input.up ) {
						tilemap.vy = WALKING_SPEED;
						yamada.direction = 3;
					}
					else if ( game.input.down ) {
						tilemap.vy = -1 * WALKING_SPEED;
						yamada.direction = 0;
					}

					//移動後のマップ座標を求める
					const yamadaCoordinateAfterMoveX = yamada.mapX - tilemap.vx/WALKING_SPEED;
					const yamadaCoordinateAfterMoveY = yamada.mapY - tilemap.vy/WALKING_SPEED;
					//もし移動後のマップ座標に障害物があるならば、移動量に0を代入する
					if ( tilemap.hasObstacle( yamadaCoordinateAfterMoveX, yamadaCoordinateAfterMoveY ) ) tilemap.vx = tilemap.vy = 0;
				}
			}
			//タイルマップのXとY座標両方がタイルのサイズで割り切れるとき以外で、タイルの半分のサイズで割り切れるとき
			else if ( ( tilemap.x + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 && ( tilemap.y + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 ) {
				//0と1を交互に取得できる
				toggleForAnimation ^= 1;
				//toggleForAnimationの数値によって、山田先生の画像を切り替える
				if ( toggleForAnimation === 0 ) yamada.animation = 2;
				else yamada.animation = 0;
			}
		} //scene.onenterframe 終了

		//作ったシーンを返す
		return scene;

	} //mainScene() 終了

	//gameに、シーンを追加して、とお願いする
	game.add( mainScene() );

	//gameに、ゲームをスタートして、とお願いする
	game.start();

} );
山田

まず、10行目〜145行目のように、mainSceneという関数を作って、メインシーンの部分ぶぶんを中に入れているべ
さらに143行目で、作ったシーンを返しているんだべ
そして148行目は、さきほど返したシーンを、gameに追加しているんだべ

りこ

へぇ、こうすると、メインシーンがどこにあるのかが分かりやすいね!

山田

ブラウザ確認かくにんすると、いままでと同じように動くべ!

実行結果は変わらないがメインシーンをつくることができた

タイトルシーンを作ろう!

つづいて、タイトルシーンを作ってみましょう!

山田

つづいて、タイトルシーンを作ってみるべ!

アル

きっとメインシーンと同じように作ればいいんだね!

js/main.js

'use strict'

//ブラウザがページを完全に読みこむまで待つ
addEventListener( 'load', () => {

	//変数gameに、あなたはゲームですよ、と教える
	const game = new Game();

	//タイトルシーン
	const titleScene = () => {

		//変数sceneに、あなたはシーンですよ、と教える
		const scene = new Scene();

		//変数titleTextに、あなたは「くろねこラビリンス」というテキストだよ、と教える
		const titleText = new Text( 'くろねこラビリンス' );
		//テキストを上下左右中央の位置にする
		titleText.center().middle();
		//シーンにテキストを追加
		scene.add( titleText );

		//作ったシーンを返す
		return scene;

	} //titleScene() 終了

	//メインシーン
	const mainScene = () => {

		//マップの作成
		const map = [
			[11,11,11,11,11,11,11,11,11,11],
			[11,10,10,10,10,10,10,10,10,11],
			[11, 4, 4, 4, 4, 4, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4,11,11,11,11,10,10, 4,11],
			[11, 4,11,10,10,11, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4, 9, 4, 4, 9,10,11, 4,11],
			[11, 4, 4, 4, 4, 4, 4,11, 4,11],
			[11,11,11,11,11,11,11,11,11,11]
		];
		//タイルのサイズ
		const TILE_SIZE = 32;
		//歩く速さ
		const WALKING_SPEED = 4;

		//変数sceneに、あなたはシーンですよ、と教える
		const scene = new Scene();

		//変数tilemapに、あなたはタイルマップですよ、と教える
		const tilemap = new Tilemap( 'img/tile.png' );
		//tilemap.dataに、どんなマップなのか教える
		tilemap.data = map;
		//マップ全体の位置をずらす
		tilemap.x = TILE_SIZE*4 - TILE_SIZE/2;
		tilemap.y = TILE_SIZE*3 - TILE_SIZE/2;
		//移動できないタイルを指定する
		tilemap.obstacles = [0, 3, 6, 7, 8, 9, 10, 11];
		//マップを登録する
		scene.add( tilemap );

		//変数startに、あなたはスタートのタイルですよ、と教える
		const start = new Tile( 'img/start.png' );
		//マップ左上からの座標を指定する
		start.x = TILE_SIZE;
		start.y = TILE_SIZE*2;
		//スタートのタイルを、tilemapに追加して、とお願いする
		tilemap.add( start );

		//変数goalに、あなたはゴールのタイルですよ、と教える
		const goal = new Tile( 'img/goal.png' );
		//マップ左上からの座標を指定する
		goal.x = TILE_SIZE*8;
		goal.y = TILE_SIZE*8;
		//ゴールのタイルを、tilemapに追加して、とお願いする
		tilemap.add( goal );

		//変数yamadaに、あなたは山田先生のキャラクタータイルですよ、と教える
		const yamada = new CharacterTile( 'img/yamada.png' );
		//山田先生を画面の中央に配置
		yamada.x = yamada.y = TILE_SIZE*5 - TILE_SIZE/2;
		//タイルマップの動きと同期させない
		yamada.isSynchronize = false;
		//tilemapに、山田先生のタイルを追加して、とお願いする
		tilemap.add( yamada );

		//キャラクターのアニメーションのための変数
		let toggleForAnimation = 0;
		//ゴールのテキストが表示されているかどうかの変数
		let hasDisplayedGoalText = false;
		//移動可能かどうかの変数
		let isMovable = true;

		//ループから常に呼び出される
		scene.onenterframe = () => {
			//タイルマップの位置がタイルのサイズで割り切れるとき
			if ( ( tilemap.x - TILE_SIZE/2 ) % TILE_SIZE === 0 && ( tilemap.y - TILE_SIZE/2 ) % TILE_SIZE === 0 ) {
				//タイルマップの移動速度に0を代入する
				tilemap.vx = tilemap.vy = 0;
				//山田先生の画像を切り替える
				yamada.animation = 1;

				//山田先生のタイルがゴールのタイルと重なっているとき、イベントを発生させる
				if ( yamada.isOverlapped( goal ) ) {
					//ゴールのテキストが表示されていないとき
					if ( !hasDisplayedGoalText ) {
						//変数goalTextに、あなたは「ゴールだべ!」というテキストだよ、と教える
						const goalText = new Text( 'ゴールだべ!' );
						//テキストサイズを変更
						goalText.size = 50;
						//テキストを上下左右中央の位置にする
						goalText.center().middle();
						//シーンにテキストを追加
						scene.add( goalText );
						//ゴールのテキストが表示されているかどうかの変数にtrueを代入
						hasDisplayedGoalText = true;
						//移動ができないようにする
						isMovable = false;
					}
				}

				//移動可能なとき
				if ( isMovable ) {
					//方向キーが押されているときは、タイルマップの移動速度と、山田先生の向きに、それぞれの値を代入する
					if ( game.input.left ) {
						tilemap.vx = WALKING_SPEED;
						yamada.direction = 1;
					}
					else if ( game.input.right ) {
						tilemap.vx = -1 * WALKING_SPEED;
						yamada.direction = 2;
					}
					else if ( game.input.up ) {
						tilemap.vy = WALKING_SPEED;
						yamada.direction = 3;
					}
					else if ( game.input.down ) {
						tilemap.vy = -1 * WALKING_SPEED;
						yamada.direction = 0;
					}

					//移動後のマップ座標を求める
					const yamadaCoordinateAfterMoveX = yamada.mapX - tilemap.vx/WALKING_SPEED;
					const yamadaCoordinateAfterMoveY = yamada.mapY - tilemap.vy/WALKING_SPEED;
					//もし移動後のマップ座標に障害物があるならば、移動量に0を代入する
					if ( tilemap.hasObstacle( yamadaCoordinateAfterMoveX, yamadaCoordinateAfterMoveY ) ) tilemap.vx = tilemap.vy = 0;
				}
			}
			//タイルマップのXとY座標両方がタイルのサイズで割り切れるとき以外で、タイルの半分のサイズで割り切れるとき
			else if ( ( tilemap.x + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 && ( tilemap.y + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 ) {
				//0と1を交互に取得できる
				toggleForAnimation ^= 1;
				//toggleForAnimationの数値によって、山田先生の画像を切り替える
				if ( toggleForAnimation === 0 ) yamada.animation = 2;
				else yamada.animation = 0;
			}
		} //scene.onenterframe 終了

		//作ったシーンを返す
		return scene;

	} //mainScene() 終了

	//gameに、シーンを追加して、とお願いする
	game.add( titleScene() );
	game.add( mainScene() );

	//gameに、ゲームをスタートして、とお願いする
	game.start();

} );
山田

9〜25行目で、タイトルシーンを作っているべ
さらに166行目で、作ったタイトルシーンを、ゲームに追加ついかしているんだべ

りこ

へぇ。関数にまとめるだけでも、どこからどこまでがひとつのシーンなのかが分かりやすくなるね!

アル

はやくブラウザで見てみようよ!

りこ

わー、タイトルが表示された!

アル

あれ? でも、ゲームをはじめるにはどうすればいいの?

山田

まだシーンを切り替える機能きのうをつくってないべから、はじまらないべよ

アル

そんなぁ

山田

でも、いまからその機能を作っていくべ!

アル

わーい

シーンを切り替えてみよう!

つづいて、シーンを切り替える機能を作ってみましょう!

山田

つぎは、シーンを切り替える機能を作っていくべよ!

アル

これでゲームをはじめられるようになるんだね!

りこ

楽しみ!

js/main.js

'use strict'

//ブラウザがページを完全に読みこむまで待つ
addEventListener( 'load', () => {

	//変数gameに、あなたはゲームですよ、と教える
	const game = new Game();
	//使いたいキーとして、スペースキーを登録する
	game.keybind( 'space', ' ' );

	//タイトルシーン
	const titleScene = () => {

		//変数sceneに、あなたはシーンですよ、と教える
		const scene = new Scene();

		//変数titleTextに、あなたは「くろねこラビリンス」というテキストだよ、と教える
		const titleText = new Text( 'くろねこラビリンス' );
		//テキストを上下左右中央の位置にする
		titleText.center().middle();
		//シーンにテキストを追加
		scene.add( titleText );

		//ループから常に呼び出される
		scene.onenterframe = () => {
			//スペースキーが押されたとき、メインシーンに切り替える
			if ( game.input.space ) game.currentScene = mainScene();
		} //scene.onenterframe() 終了

		//作ったシーンを返す
		return scene;

	} //titleScene() 終了

	//メインシーン
	const mainScene = () => {

		//マップの作成
		const map = [
			[11,11,11,11,11,11,11,11,11,11],
			[11,10,10,10,10,10,10,10,10,11],
			[11, 4, 4, 4, 4, 4, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4,11,11,11,11,10,10, 4,11],
			[11, 4,11,10,10,11, 4, 4, 4,11],
			[11, 4,11, 4, 4,11,11,11, 4,11],
			[11, 4, 9, 4, 4, 9,10,11, 4,11],
			[11, 4, 4, 4, 4, 4, 4,11, 4,11],
			[11,11,11,11,11,11,11,11,11,11]
		];
		//タイルのサイズ
		const TILE_SIZE = 32;
		//歩く速さ
		const WALKING_SPEED = 4;

		//変数sceneに、あなたはシーンですよ、と教える
		const scene = new Scene();

		//変数tilemapに、あなたはタイルマップですよ、と教える
		const tilemap = new Tilemap( 'img/tile.png' );
		//tilemap.dataに、どんなマップなのか教える
		tilemap.data = map;
		//マップ全体の位置をずらす
		tilemap.x = TILE_SIZE*4 - TILE_SIZE/2;
		tilemap.y = TILE_SIZE*3 - TILE_SIZE/2;
		//移動できないタイルを指定する
		tilemap.obstacles = [0, 3, 6, 7, 8, 9, 10, 11];
		//マップを登録する
		scene.add( tilemap );

		//変数startに、あなたはスタートのタイルですよ、と教える
		const start = new Tile( 'img/start.png' );
		//マップ左上からの座標を指定する
		start.x = TILE_SIZE;
		start.y = TILE_SIZE*2;
		//スタートのタイルを、tilemapに追加して、とお願いする
		tilemap.add( start );

		//変数goalに、あなたはゴールのタイルですよ、と教える
		const goal = new Tile( 'img/goal.png' );
		//マップ左上からの座標を指定する
		goal.x = TILE_SIZE*8;
		goal.y = TILE_SIZE*8;
		//ゴールのタイルを、tilemapに追加して、とお願いする
		tilemap.add( goal );

		//変数yamadaに、あなたは山田先生のキャラクタータイルですよ、と教える
		const yamada = new CharacterTile( 'img/yamada.png' );
		//山田先生を画面の中央に配置
		yamada.x = yamada.y = TILE_SIZE*5 - TILE_SIZE/2;
		//タイルマップの動きと同期させない
		yamada.isSynchronize = false;
		//tilemapに、山田先生のタイルを追加して、とお願いする
		tilemap.add( yamada );

		//キャラクターのアニメーションのための変数
		let toggleForAnimation = 0;
		//ゴールのテキストが表示されているかどうかの変数
		let hasDisplayedGoalText = false;
		//移動可能かどうかの変数
		let isMovable = true;

		//ループから常に呼び出される
		scene.onenterframe = () => {
			//タイルマップの位置がタイルのサイズで割り切れるとき
			if ( ( tilemap.x - TILE_SIZE/2 ) % TILE_SIZE === 0 && ( tilemap.y - TILE_SIZE/2 ) % TILE_SIZE === 0 ) {
				//タイルマップの移動速度に0を代入する
				tilemap.vx = tilemap.vy = 0;
				//山田先生の画像を切り替える
				yamada.animation = 1;

				//山田先生のタイルがゴールのタイルと重なっているとき、イベントを発生させる
				if ( yamada.isOverlapped( goal ) ) {
					//ゴールのテキストが表示されていないとき
					if ( !hasDisplayedGoalText ) {
						//変数goalTextに、あなたは「ゴールだべ!」というテキストだよ、と教える
						const goalText = new Text( 'ゴールだべ!' );
						//テキストサイズを変更
						goalText.size = 50;
						//テキストを上下左右中央の位置にする
						goalText.center().middle();
						//シーンにテキストを追加
						scene.add( goalText );
						//ゴールのテキストが表示されているかどうかの変数にtrueを代入
						hasDisplayedGoalText = true;
						//移動ができないようにする
						isMovable = false;
						//6秒たったら、タイトルシーンに切り替える
						setTimeout( () => {
							game.currentScene = titleScene();
						}, 6000 );
					}
				}

				//移動可能なとき
				if ( isMovable ) {
					//方向キーが押されているときは、タイルマップの移動速度と、山田先生の向きに、それぞれの値を代入する
					if ( game.input.left ) {
						tilemap.vx = WALKING_SPEED;
						yamada.direction = 1;
					}
					else if ( game.input.right ) {
						tilemap.vx = -1 * WALKING_SPEED;
						yamada.direction = 2;
					}
					else if ( game.input.up ) {
						tilemap.vy = WALKING_SPEED;
						yamada.direction = 3;
					}
					else if ( game.input.down ) {
						tilemap.vy = -1 * WALKING_SPEED;
						yamada.direction = 0;
					}

					//移動後のマップ座標を求める
					const yamadaCoordinateAfterMoveX = yamada.mapX - tilemap.vx/WALKING_SPEED;
					const yamadaCoordinateAfterMoveY = yamada.mapY - tilemap.vy/WALKING_SPEED;
					//もし移動後のマップ座標に障害物があるならば、移動量に0を代入する
					if ( tilemap.hasObstacle( yamadaCoordinateAfterMoveX, yamadaCoordinateAfterMoveY ) ) tilemap.vx = tilemap.vy = 0;
				}
			}
			//タイルマップのXとY座標両方がタイルのサイズで割り切れるとき以外で、タイルの半分のサイズで割り切れるとき
			else if ( ( tilemap.x + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 && ( tilemap.y + TILE_SIZE/2 ) % ( TILE_SIZE/2 ) === 0 ) {
				//0と1を交互に取得できる
				toggleForAnimation ^= 1;
				//toggleForAnimationの数値によって、山田先生の画像を切り替える
				if ( toggleForAnimation === 0 ) yamada.animation = 2;
				else yamada.animation = 0;
			}
		} //scene.onenterframe 終了

		//作ったシーンを返す
		return scene;

	} //mainScene() 終了

	//gameに、シーンを追加して、とお願いする
	game.add( titleScene() );
	game.add( mainScene() );

	//gameに、ゲームをスタートして、とお願いする
	game.start();

} );
山田

まず9行目で、スペースキーを使いたいキーとして登録しているべ

りこ

あっ、後ろの引数には、半角スペースを使うのね!

山田

ちょっと不思議な使い方だべけど、そうなんだべ
そして、25〜28行目のように、常に呼び出されるonenterframeを使って、スペースキーが押されるのを待つべ

アル

そっか。キーが押されてるかどうか、常に確かめてるんだね

山田

だべさ
そして27行目。スペースキーが押されたとき、game.currentSceneにメインシーンを代入しているんだべ

りこ

これでシーンが切り替わるんだ!

山田

さらに129〜131行目は、ゴールしたあと6秒待って、game.currentSceneにタイトルシーンを代入しているんだべ

アル

6秒って、結構けっこう長いよね……なんでそんなにつの?

山田

ゴールしたあとにながしたいサウンドが6秒だからだべ

アル

なるほど、そういうことか!

山田

では、ブラウザ確認かくにんしてみるべよ!

シーンを切り替えることができる!
りこ

わぁ、ゴールしたあとももどるから、なんどもあそべるね!

次のページでは、スプライトの回転かいてんと、ゲームがスマホ対応たいおうするようにしていきたいと思います。

このシリーズの一覧はこちら

  1. 小学生からのプログラミング入門。プログラミングってなぁに?
  2. Scratchの使い方と、ゲーム作りの基礎知識を学ぼう! 小学生からのプログラミング入門
  3. Scratchでじゃんけんゲームを作ろう! 小学生からのプログラミング入門
  4. Scratchでシューティングゲームを作ろう! 小学生からのプログラミング入門
  5. Scratchでピアノ鍵盤を作って音を鳴らそう! 小学生からのプログラミング入門
  6. テキストエディタ(Visual Studio Code)をインストールしてみよう! 小学生からのプログラミング入門
  7. Visual Studio Codeを日本語化してみよう! 小学生からのプログラミング入門
  8. JavaScriptでおみくじを作ろう! 小学生からのプログラミング入門
  9. JavaScriptで今月の残り日数を計算してみよう! 小学生からのプログラミング入門
  10. JavaScriptで画像を表示してみよう! 小学生からのプログラミング入門
  11. JavaScriptで画像を移動してみよう! 小学生からのプログラミング入門
  12. 【JavaScript】キー入力でキャラを動かしてみよう! 小学生からのプログラミング入門
  13. 【JavaScript】ファイルを分けて管理してみよう! 小学生からのプログラミング入門
  14. 【JavaScript】オブジェクトを使ってみよう! 小学生からのプログラミング入門
  15. 【JavaScript】ゲームのメインループを作ってみよう! 小学生からのプログラミング入門
  16. 【JavaScript】キャラを決まった間隔ずつ動かす! 小学生からのプログラミング入門
  17. HTML5とCanvasを使ってみよう! 小学生からのプログラミング入門
  18. 【JavaScript】迷路やRPGで使えるマップを作ってみよう! 小学生からのプログラミング入門
  19. 【JavaScript】マップでキャラを動かせるようにしよう! 小学生からのプログラミング入門
  20. 【JavaScript】クラスの概念をしっかりと理解しよう! 小学生からのプログラミング入門
  21. 【JavaScript】プログラム全体をクラスを使って作ってみよう! 小学生からのプログラミング入門
  22. 【JavaScript】文字を表示するクラスを作ってみよう! 小学生からのプログラミング入門
  23. 【JavaScript】改行と一文字ずつ画面に表示する方法! 小学生からのプログラミング入門
  24. 【JavaScript】ノベルゲーム風にキー入力で文字を切り替える方法! 小学生からのプログラミング入門
  25. JavaScriptでRPGを作ろう!スマホにも対応したゲームの作り方
  26. webpackを使ってゲームエンジンを作ろう!(JSライブラリの作り方)
  27. WindowsにPythonをインストールしてみよう!小学生からのPython入門
  28. MacにPythonをインストールしてみよう!小学生からのPython入門
  29. Pythonでじゃんけんゲームを作ってみよう!小学生からのPython入門
  30. Pythonのtkinterを使って、ウィンドウを表示してみよう!
  31. Pythonのtkinterで、画像つきのおみくじゲームを作ろう!
オリジナルゲーム.com