Cocos2dでゲーム作成[1-2]

明日の目標は
・爆弾爆発のパーティクル処理、引火。
・爆弾を升のフィールドに配置。

var test = cc.ParticleFire.create();
	test.setTexture(cc.TextureCache.getInstance().addImage(s_ship));
	test.setPosition(100,100);
	this.addChild(test);

これで火だせた。

アニメーションの登録

	//爆発のエモーション
	var fire = cc.ParticleFire.create();
	fire.setTexture(cc.TextureCache.getInstance().addImage(s_ship));
	fire.setPosition(cc.p(this.boms[i].getPosition()));
	//var animation = cc.MoveTo.create(1,cc.p(i+i*400 ,i*200));
	this.addChild(fire);	//thisはLayerとかね
	
	var spawn = cc.Spawn.create(
	    cc.MoveBy.create(1,cc.p(0,300)),//上 Byは現在位置からの相対値
	    //cc.Blink.create(3,16)
	    cc.ScaleTo.create(1,0.1),
	    cc.FadeTo.create(1,0)
	);
	fire.runAction(spawn);
	//アニメーションの解放

・setTextureで貼った画像がFadeToで消えない。なんでだろう。

thisはLayerクラスを指す。
this.removeChild(fire)でLayerから消すことができる。

火力についてもcountで数秒後に消すというのがいいかもしれない。
アニメーションが終わったら実行する関数(cc.CallFunc)があるらしい。その為表示の段階でのカウンタの実装はいらなくなりました。

・cc.Node.addChild(): child already added. It can’t be added again のエラー
addChild(bom)を2回実行していた為。

・var fire = cc.ParticleFire.create();
fire0.setTexture(cc.TextureCache.getInstance().addImage(s_ship));

initの中でcc.ParticleFire.create();、setTextureをすると、なぜかy軸がずれた。
onBomFireの中で毎回create、setTextureを呼ぶようにすれば位置ずれはなくなった。
原因不明。→オブジェクト削除しているから毎回作らないといけないのは当たり前か。
オブジェクトを消すときは考慮しておかねば。

パーティクル処理とアニメーション完了。
次引火判定

Uncaught TypeError: Cannot read property ‘x’ of undefined
aPos = this.boms[j].getPosition();してなかった

爆発後の爆弾を消すかor画面外におくか。
とりあえず画面外においといたほうが処理は簡単。今回は画面外で。複雑なゲームだとばぐの原因になりそう。

明日、引火判定の処理を考える。

	/* 引火判定 */
	for(var j = 0; j<this.boms.length; j++){//3は最大bom所持数
	    aPos = this.boms[j].getPosition();
	    bPos = this.boms[i].getPosition();
	    
	    if(i==j){
		cc.log("引火できない" + j + i);//何もしない;
		//現在の爆弾とx軸もしくは、y軸が重なっていれば
	    }
	    else if( (aPos.x -30) < bPos.x && bPos.x < (aPos.x + 30) ){
		cc.log("引火しました" + aPos.x + " " + bPos.x);
		//
		//this.onBomFire(j)
	    }
	    else{
		cc.log("引火しませんでした");
	    }
	}

x軸の引火処理完成
全爆弾に対して引火判定のループ。
if(i=j)//もし自分自身であれば
自分の爆弾に対しては何もしない。
else if(自分自身の爆弾以外に対してx軸が重なっている爆弾があるか?)
(本来の処理)重なっていたらbomのインスタンスを消す。
(今回の処理)bomのインスタンスの位置を移動する。←これにより無限ループに陥らない。
引火先の爆弾 this.onBomFire(j)を呼ぶ(再帰)
else
引火した爆弾はない。

for(var j = 0; j<this.boms.length; j++){
	    aPos = this.boms[j].getPosition();
	    bPos = this.boms[i].getPosition();
	    
	    if(i==j){
		cc.log("引火できない" + j + i);//何もしない;
		//現在の爆弾とx軸もしくは、y軸が重なっていれば
	    }
	    else if( (aPos.x -30) < bPos.x && bPos.x < (aPos.x + 30) ){
		cc.log("引火しました" + aPos.x + " " + bPos.x);
		//爆発したら爆弾は場外に飛ばす
		this.boms[i].setPosition(bPos.x + 300, bPos.y);
		//
		this.onBomFire(j)
	    }
	    else{
		cc.log("引火しませんでした");
	    }
	}

↑ 0と1、0と2の引火判定は正常だが、0,1,2の場合は0,1しか判定がない。
1,2の場合も判定がない。

見直す。

OK

そもそも引火判定は設置している爆弾同士で判定すべきだった。
boms[].state == 0は未設置状態なので まずboms[i]とboms[j]の論理積ANDを条件にした。

爆発したら場外に飛ばすって書いてるけどX軸を同じところに飛ばしてたから再帰で無限ループにはいった。
違う座標に飛ばせば無限ループは回避できるけど、これで解決するのはまずいので条件きつくした。

まぁ爆発したらインスタンスを消し、クリックで作成するってのが一番いいと思うけど。


	/* 引火判定 */
	for(var j = 0; j<this.boms.length; j++){
	    aPos = this.boms[j].getPosition();
	    bPos = this.boms[i].getPosition();
	    if(this.boms[j].state && this.boms[i].state){//比較する爆弾が設置されていれば
		if(i==j){
		    cc.log("何もしない。" + aPos.x + " " + bPos.x + "  "+ i + j);
		}
		else if( ( (aPos.x -30) < bPos.x && bPos.x < (aPos.x + 30) ) ){
		    cc.log("引火しました。" + aPos.x + " " + bPos.x + "  "+ i + j);
		    //爆発したら爆弾は場外に飛ばし、ステートも未設置状態にする
		    this.boms[i].setPosition(600, bPos.y);
		    this.boms[i].state = 0;
		    this.onBomFire(j)
		}
		else{
		    cc.log("引火しませんでした。" + aPos.x + " " + bPos.x + "  "+ i + j);
		}
	    }
	}

//最後の爆弾は引火判定で爆発できない(else ifに入れない)為ここで判定爆発さしてあげる
	if(this.boms[i].state == 1){
	    this.boms[i].setPosition(bPos.x + 300, bPos.y);
	}

スポンサーリンク
RESAD
RESAD

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
RESAD