DXScriptでゲーム作成 その4

今回で一気に完成まで持っていきます。
完成品はこちら(sample4.zip)


長くなるので重要じゃない部分は省略。


・プレイヤーを敵クラスと同様クラス化
・プレイヤーの向きに黄色い弾を連射するように。
 プレイヤーの弾クラスを敵の弾クラスから派生して作成




1.当たり判定
当たり判定を作成します。
弾はグループ化してあるので、そこから取り出して一つ一つ判定します。
高速化の工夫は無し!

	// 敵の弾を格納するGroup
	var eb_group = new Group();
	scene.addChild(eb_group);
	enemy.eb_group = eb_group;
	
	// プレイヤーの弾を格納するGroup
	var pb_group = new Group();
	scene.addChild(pb_group);
	player.pb_group = pb_group;
	
	// 当たり判定を処理するダミーノード
	var colli_dummy = new Node();

弾の移動→当たり判定と処理したいので、当たり判定を受け持つダミーノードを作っています。
SceneやGroupに追加されたアイテムは先に追加されたほうから処理されるので・・・


Nodeクラスは描画部品の親クラスです。
素の状態だとなにも描画せず、イベントハンドラだけ動作します。

	colli_dummy.addEventListener(ONFRAME, function() {
		// プレーヤーの当たり判定を作成
		var padding = 9; // 左右を画像の空白分削る
		var pl_colli = new BoxCollision(player.width - padding * 2, player.height);
		pl_colli.x = player.x + padding;
		pl_colli.y = player.y;
		
		// 弾と一つ一つ判定
		for (var i=0; i<eb_group._children.length; i++) {
			var bullet = eb_group._children[i];
			
			// 弾の当たり判定が無効になっていれば判定しない
			if (!bullet.available) {
				continue;
			}
			
			var colli = new CircleCollision(bullet.r);
			colli.x = bullet.x;
			colli.y = bullet.y;
			
			if (Collision.collide(pl_colli, colli)) {
				dxs.print("player hit!");
				bullet.available = false; // 弾の判定を無効に
				player.life--; // ライフ減少
				playerLife.life = (player.life / PL_LIFE) * 100;
			}
		}
		
		// 敵の当たり判定を作成
		var en_colli = new BoxCollision(enemy.width , enemy.height);
		en_colli.x = enemy.x;
		en_colli.y = enemy.y;
		
		// 弾と一つ一つ判定
		for (var i=0; i<pb_group._children.length; i++) {
			var bullet = pb_group._children[i];
			
			// 弾の当たり判定が無効になっていれば判定しない
			if (!bullet.available) {
				continue;
			}
			
			var colli = new CircleCollision(bullet.r);
			colli.x = bullet.x;
			colli.y = bullet.y;
			
			if (Collision.collide(en_colli, colli)) {
				dxs.print("enemy hit!");
				bullet.available = false; // 弾の判定を無効に
				enemy.life--; // ライフ減少
				enemyLife.life = (enemy.life / EN_LIFE) * 100;
			}
		}
		
		// ライフ判定
		if (player.life <= 0) {
			// 敗北
			dxs.alert("敗北・・・");
			dxs.exit();
			return;
		}
		
		if (enemy.life <= 0) {
			// 敗北
			dxs.alert("勝利!");
			dxs.exit();
			return;
		}
	});
	scene.addChild(colli_dummy);

	// ライフバー
	var playerLife = new LifeBar(640, 5);
	playerLife.x = 0;
	playerLife.y = 10;
	scene.addChild(playerLife);

	var enemyLife = new LifeBar(640, 5);
	enemyLife.x = 0;
	enemyLife.y = 20;
	enemyLife.color = dxs.GetColor(255, 0, 0);
	scene.addChild(enemyLife);


BoxCollision、CircleCollisionは当たり判定クラスです。
座標をセットして、Collision.collide()で判定。


当たっていたらプレイヤーか敵のライフを減少させます。
どちらかのライフが0になったらゲーム終了します。
dxs.exit()はアプリを終了させる関数です。


あと画面上部にライフバーを描画します。




2.ライフバー
ライフバーを描画するクラスです。

// ライフバー
var LifeBar = Class.create(Node, {
	initialize: function(width, height) {
		Node.apply(this, arguments);
		
		this.x = 0;
		this.y = 0;
		this.width = width;
		this.height = height;
		this.color = dxs.GetColor(0, 0, 255);
		this.life = 100;
	},
	ondraw: function() {
		width = this.width * this.life / 100;
		dxs.DrawBox(this.x, this.y, this.x + width, this.y + this.height, this.color, true);
	}
});


Nodeクラスから派生します。
ondraw関数定義して描画処理を書けば、勝手に描画してくれる描画アイテムになります。
ここではDrawBox()で細長い四角を描いています。




だいぶやっつけですがこれで一応ゲームの形になりました。
ここまで大体4時間くらいでコーディングしてます。
2Dのゲームだったらさくさく書けますね。


3D系の関数を実装すればさらに画期的な環境になりそうだけど気力が・・・