当たり判定をどこに置くべきか
投稿者 : かの(202.248.41.136)
- 2010/02/10(Wed) 14:31
No.12636
|
|
|
|
|
12636.zip
はじめまして。現在アクションゲームでボス戦を作成しています。
ボスが腕を振るい、その腕の部分に攻撃を当てるとボスがダメージを受けるプログラムを作りたいのですが、 当たり判定を何処に置いても正常な動作がされません。
・ボス部分のプログラム(boss) extends SpriteChar;
bossHP=20; randomize(); bosscounter=0; zOrder=2;
while(1){ if (rnd(100)==0) { for (i=0;i<5 ;i++){update();} appear(new bossarm(x,y)); for (i=0;i<40;i++){update();}
} update(); }
・腕部分(bossarm) extends SpriteChar;
f=$boss.f; p=$pat_boss+0;
x=$boss.x+100; y=$boss.y+85;
vx= -3*f; //X方向の初速 vy= 4; //Y方向の初速
zOrder=3;
for (i=0;i<25;i++){ //25回繰り返して消去 vy+=0.1; //重力付加 vx=vx*0.99; //X方向減速 x+=vx; y+=vy; update(); atarihantei(); }
function atarihantei(){
for (e in $chars){ if (e is mychara2 && crashTo(e) && getkey(88) && $boss.bosscounter==0) {$boss.bosscounter=1;$boss.bossHP--;} if (e is mychara2 && crashTo(e) && getkey(90) && $boss.bosscounter==0) {$boss.bosscounter=1;$boss.bossHP--;} }
if ($boss.bosscounter!=0 ) $boss.bosscounter++; if ($boss.bosscounter==100) $boss.bosscounter=0; if ($boss.bosscounter%2==1) $boss.setVisible(0); else $boss.setVisible(1); if ($boss.bossHP==0) $boss.die(); //HPが0で死亡
}
現在のこの状態だと、for内でatarihanteiを繰り返してしまい bossごと消えて現れてを繰り返します。 while(1)内部でforを動かすと、25回繰り返して消去されてほしいにもかかわらず25回以上繰り返さないと消去されませんでした。
・bossのwhile(1)内に当たり判定を置いた場合のfunction atarihantei
function atarihantei(){
for (e in $chars){ if (e is mychara2 && $bossarm.crashTo(e) && getkey(88) && bosscounter==0) {bosscounter=1;bossHP--;} if (e is mychara2 && $bossarm.crashTo(e) && getkey(90) && bosscounter==0) {bosscounter=1;bossHP--;} }
if (bosscounter!=0 ) bosscounter++; if (bosscounter==100) bosscounter=0; if (bosscounter%2==1) setVisible(0); else setVisible(1); if (bossHP==0) die(); //HPが0で死亡
}
この場合だと「$bossarmは初期化されていないため、crashToを呼び出せません」というエラーが出てしまいます。
この状況を解決する良い方法はないでしょうか。 宜しくお願いします。
|
Re: 当たり判定をどこに置くべきか
投稿者 : みけCAT(i58-95-5-18.s04.a012.ap.plala.or.jp)
- 2010/02/11(Thu) 07:33
No.12637
|
|
|
|
ボス部分のプログラムより引用 >appear(new bossarm(x,y)); この方法だと、$bossarmには何も入っていないので、初期化されていないとエラーが出ます。 bossのatarihanteiメソッドをこうするとこのエラーは解決されると思います。 (根本的な解決になるかはわかりません) function atarihantei(){
for (e in $chars){ for ( a in $chars) { if ( a is bossarm) { if (e is mychara2 && a.crashTo(e) && getkey(88) && bosscounter==0) {bosscounter=1;bossHP--;} if (e is mychara2 && a.crashTo(e) && getkey(90) && bosscounter==0) {bosscounter=1;bossHP--;} } } }
if (bosscounter!=0 ) bosscounter++; if (bosscounter==100) bosscounter=0; if (bosscounter%2==1) setVisible(0); else setVisible(1); if (bossHP==0) die(); //HPが0で死亡
}
|
Re: 当たり判定をどこに置くべきか
投稿者 : かの(202.248.41.136)
- 2010/02/12(Fri) 10:20
No.12638
|
|
|
|
ありがとうございます。
みけCATさんの方法で動き自体は思い通りのものになったのですが 今度は自キャラが攻撃をしても当たり判定が働かず、腕に当ててもボスにダメージがいかない状況です。 やはりbossarm内に当たり判定を置いたほうがいいのでしょうか。
|
Re: 当たり判定をどこに置くべきか
投稿者 : みけCAT(i121-114-179-75.s04.a012.ap.plala.or.jp)
- 2010/02/14(Sun) 21:20
No.12639
|
|
|
|
12639.zip
当たり判定 for (e in $chars){ if (e is mychara2 && crashTo(e) && getkey(88) && $boss.bosscounter==0) {$boss.bosscounter=1;$boss.bossHP--;} if (e is mychara2 && crashTo(e) && getkey(90) && $boss.bosscounter==0) {$boss.bosscounter=1;$boss.bossHP--;} } の部分と、 ボスの表示 if ($boss.bosscounter!=0 ) $boss.bosscounter++; if ($boss.bosscounter==100) $boss.bosscounter=0; if ($boss.bosscounter%2==1) $boss.setVisible(0); else $boss.setVisible(1); if ($boss.bossHP==0) $boss.die(); //HPが0で死亡 を分けたほうがいいと思います。
|
Re: 当たり判定をどこに置くべきか
投稿者 : みけCAT(i121-114-179-75.s04.a012.ap.plala.or.jp)
- 2010/02/14(Sun) 21:22
No.12640
|
|
|
|
補足 「一気に3本ぐらい出てくるの防止」の時に当たり判定を忘れている可能性があるので、 サンプルのようにonUpdateメソッドを使ってみてください。
|
Re: 当たり判定をどこに置くべきか
投稿者 : かの(202.248.41.136)
- 2010/02/15(Mon) 09:38
No.12641
|
|
|
|
思っていたとおりの動きができました! みけCATさん、ありがとうございました。
|
|