flandlescarlet's diary【情報工学生の備忘録】

元機械工学科所属だった情報工学生です。JavaScriptで適当に何かを作ったり、絵を描いていたりします。

JavaScriptを使ったライブラリを使わないRPGの作り方(入門編)2

マップ場でキャラクターを動かす方法

マップでキャラクターが動く原理について説明していきます。

まず動かすために扱うイベントを作成します。

「移動」ということですので矢印キーを使用していこうと思います。

各キーコードについては

// ↑:38
// ←:37
// ↓:40
// →:39

これらの値が格納されています。

ハンドラの種類はonkeydownで行います。

※キー値取得はIEとFirefox郡ブラウザで異なるので注意(最後に処理をまとめる)

Sample1

function move_chara(e){
        switch(e.keyCode){
		case 37://←:こっちに移動する時
			
			if( b == 0){ b++; }
			document.getElementById("chip" + flan_move[a][b-1]).innerHTML = "<img src='" + image_dot[2] + "'>";
			document.getElementById("chip" + flan_move[a][b] ).innerHTML = "<img src='" + image_dot[0] + "'>";
			b--;
			break;

		case 38://↑:こっちに移動する時
			
			if( a == 0){ a++; }
			document.getElementById("chip" + flan_move[a-1][b]).innerHTML = "<img src='" + image_dot[2] + "'>";
			document.getElementById("chip" + flan_move[a][b] ).innerHTML = "<img src='" + image_dot[0] + "'>";
			a--;
			break;

		case 39://→こっちに移動する時
			
			if( b == 7){ b--; }
			document.getElementById("chip" + flan_move[a][b+1]).innerHTML = "<img src='" + image_dot[2] + "'>";
			document.getElementById("chip" + flan_move[a][b] ).innerHTML = "<img src='" + image_dot[0] + "'>";
			b++;
			break;

		case 40://↓こっちに移動する時
			
			if( a == 7){ a--; }
			document.getElementById("chip" + flan_move[a+1][b]).innerHTML = "<img src='" + image_dot[2] + "'>";
			document.getElementById("chip" + flan_move[a][b] ).innerHTML = "<img src='" + image_dot[0] + "'>";
			a++;
			break;

	}



}

document.onkeydown = move_chara;

</script>

まとめて説明していきます。

  • document.onkeydown = move_chara;

によってキーを押された時に関数を呼ぶようにします。

そこからmove_charaという名前をつけた関数に同時にキー値も送ります

  • IEではevent.keyCode
  • Firefox郡ブラウザでは引数に適当な文字を入力しその引数.keyCodeに値が格納されます。

今回は入力されるキーが4つであることからifよりもswitchを使う方を優先します。

caseの中身の処理ですが、配列の中身を交換しています。

8×8のマップを二次元配列でflan_move[a][b]としています。

aは縦軸そしてb軸は横軸となります。

  • aを負に→上に移動
  • aを正に→下に移動
  • bを負に→左に移動
  • bを正に→右に移動

キャラクター本体のチップの位置座標を動かして再度innerHTMLで画像を上書きします。

それでこのままでは、元の所にあったキャラクターの画像が残ったままになってしまうため。

移動させるごとにキャラクターの画像が残されてしまうという形になってしまいます。

ですので、元の画像を草原のチップに変えるようにしています。

 

そしてもう一つてを加えて、端に行ってしまった時に、座標がマイナスになってしまうのを防ぐために

if分を追加しておき、a,b各最大と最小値である0と7の範囲になっていたときそれぞれに適応する値を入れていきます

例)もしa値が0であるならば、1を足しておきます結果的にアルゴリズムはaが1になりますが、後半のデクリメントでまた0になり結果は変わりません = 移動していない状態となる。

 

実際のソースについてはDemo版から見てください。

これが一番単純なキャラクター移動の原理となります。

Demo

http://yatagarasu0495.web.fc2.com/javascript/blog/map/map02.html