児童書のおすすめ本59選

JavaScript:ゆらゆらした動き

シューティングゲームなどでの敵の動きは、ただまっすぐに直進するだけでは単調だ。
sinやcosなどを使うとゆらゆらした動きが再現できる。

JavaScriptのゲームエンジンenchant.jsを使っている。

ソースコード

HTML部分

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>enchant.js基本03</title>
<script type="text/javascript" src="enchant.js"></script>
<script type="text/javascript" src="game.js"></script>
<style type="text/css">
	body{ margin: 0;}
</style>
</head>
<body>
</body>
</html>

JavaScript部分

// -------------------------------------------------------------------------
//  enchant.js基本03: キーボードで動かしてみる
// 					created at 2013-06-11 on MRGARITA.NET
// -------------------------------------------------------------------------
enchant();
window.onload = function(){
	var game = new Game(320, 320);
	game.rootScene.backgroundColor = "#ffcc00";
	game.fps = 30;
	game.preload("player.png");
	game.preload("teki.png");
	
	game.onload = function(){
		// プレイヤー
		var player = new Sprite(64, 64);
		player.image = game.assets["player.png"];
		player.x = player.y = 120;
		player.addEventListener("enterframe", function(){
			// キーボードによる移動
			var input = game.input;
			if(input.left) player.x -= 4;
			if(input.right) player.x += 4;
			if(input.up) player.y -= 4;
			if(input.down) player.y += 4;
			// 当たり判定
			if(player.within(teki)) game.rootScene.removeChild(player);
		});
		// 敵
		var teki = new Sprite(64, 64);
		teki.image = game.assets["teki.png"];
		teki.x = 320;
		teki.y = Math.random() * 320;
		teki.speed = 1;
		teki.addEventListener("enterframe", function(){
			teki.x -= teki.speed;
			teki.y = teki.y + 4 * Math.sin(game.frame / 10);	// ゆらゆらした動き
			if(teki.x < 0){
				teki.x = 340;
				teki.y = Math.random() * 320;
				teki.speed ++;
				if(teki.speed > 25) teki.speed = 1;
			}
		});
		game.rootScene.addChild(player);
		game.rootScene.addChild(teki);
	}
	game.start();
}

今回は、敵が画面の右から左にゆらゆらと移動するため敵のy座標の計算にsinを使っている。

teki.y = teki.y + 4 * Math.sin(game.frame / 10);

game.frameはenchant.jsでは、フレームカウント数である。

game.fps = 30;

の設定により、一秒間に30ずつgame.frameの値が増えていく。
これを利用してsinの引数にしている。game.frameを使わなくても自分でフレーム毎にカウントする変数を作るなどしてsinの引数に使えば同じように動作する。10で割ったり4を掛けたりしているのは、適当にそれらしい動きになっただけで、値を変えてみれば、大きな弧を描いたりもすると思う。わたしも数学は得意ではないので、あまり気にせずやってみることが大切なのではないかと思う。
数学が得意だから面白いゲームが作れるわけでもないし。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA