ライフ
投稿者 : 毎度おさがわせなピッコロ(i226043.ppp.asahi-net.or.jp)
- 2004/05/10(Mon) 22:08
No.6196
|
|
|
|
|
6196.txt
No.1098の記事を参考にライフをとりつけようとしたのですが、敵が地面に沈んでいったり、自機の降下中に僕の書いたライフゲージの画像に自機がかわったり、当たると-1だけ自機のライフが減るように設定したはずの敵に1回当たると1発で死んでしまったりという悲劇が起こります。 どうしたらよいのでしょうか?
〜自機〜 extends SpriteChar;
function onDie() { appear(new Bomb($ninjaa.x , $ninjaa.y ,$pat_bomb+0)); } $map.setBGColor(color(0,200,255)); // 背景色を設定 anim=newAnimation(); while (1) { hp=8;//HPを決める if(hp>0)drawSprite($screenWidth-20,20,$pat_life+7,0,0);//ライフが0より多いとき if(hp>1)drawSprite($screenWidth-40,20,$pat_life+6,0,0); if(hp>2)drawSprite($screenWidth-60,20,$pat_life+5,0,0); if(hp>3)drawSprite($screenWidth-80,20,$pat_life+4,0,0); if(hp>4)drawSprite($screenWidth-100,20,$pat_life+3,0,0); if(hp>5)drawSprite($screenWidth-120,20,$pat_life+2,0,0); if(hp>6)drawSprite($screenWidth-140,20,$pat_life+1,0,0); if(hp>7)drawSprite($screenWidth-160,20,$pat_life+0,0,0); if(hp<=0)die();//HPが0になったら死ぬ anim.pause(); if (getkey(39) && $map.getAt(x+16,y)!=$pat_kabe+1) { if (getkey(32)==1) appear(new shuriken(x,y,$pat_shuriken+0)); if (getkey(88)==1) appear(new bunsin(x,y,$pat_ninja2+0)); x+=3; f=0; anim.swing($pat_ninja1+0,$pat_ninja1+2,5); } // ↑ カーソルキー右が押され、さらに右側が壁でなければ右へ移動 if (getkey(37) && $map.getAt(x-16,y)!=$pat_kabe+1) { if (getkey(88)==1) appear(new bunsin(x,y,$pat_ninja2+0)); if (getkey(32)==1) appear(new shuriken2(x,y,$pat_shuriken+0)); x-=3; f=1; anim.swing($pat_ninja1+0,$pat_ninja1+2,5); } // ↑ カーソルキー左が押され、さらに左側が壁でなければ左へ移動 if (getkey(38) && $map.getAt(x,y-16)!=$pat_kabe+1) { y-=3; f=0; anim.swing($pat_ninja1+0,$pat_ninja1+2,5); } // ↑ カーソルキー上が押され、さらに上側が壁でなければ上へ移動 y+=vy; // vy: y 方向の速度。 yにvy を加える if ($map.getAt(x,y+24)==$pat_kabe+1 ) { // ブロックに当たっていたら vy=0; // 落下速度を0にする if (getkey(38)) vy=-10; // ↑ カーソルキー上を押したらジャンプ } else { // ブロックに当たっていなかったら vy+=0.5; // 落下速度を上げる } $map.scrollTo(x-$screenWidth/2,y-$screenHeight/2); // スクロールする y+=vy; // vy: y 方向の速度。 yにvy を加える if ($map.getAt(x,y+24)==$pat_kabe+1 ) { // ブロックに当たっていたら vy=0; // 落下速度を0にする } else { // ブロックに当たっていなかったら vy+=0.5; // 落下速度を上げる if($map.getAt(x,y+38+vy)!=$pat_kabe+1){ if(vy<0) {anim.swing($pat_ninja2+3);} else {anim.swing($pat_ninja2+4);}} } update(); }
〜敵〜 extends SpriteChar; vx=2; // 進行方向 a=newAnimation(); // AnimationAdapterを作成 a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション while (1) { y+=2; if (crashTo($ninjaa)){die();$ninjaa.hp-=1;}//自機に衝突したら自機のHPを減らす for (t in $chars) { if ( t is shuriken && crashTo(t) ) die(); } for (t in $chars) { if ( t is bunsin && crashTo(t) ) die(); } for (t in $chars) { if ( t is shuriken2 && crashTo(t) ) die(); } if (crashTo($ninjaa)) { // 自機とぶつかったら if ( $ninjaa.y < y-8 && $ninjaa.vy>0 ) { // 自機は敵より少し上にいて、下方向に速度をもっているならば die(); // 敵が死ぬ $ninjaa.vy=-5; // 自機がはねあがる } else { $ninjaa.die(); // そうでなければ自機が死ぬ } { die(); $score=$score+10; } } if ($map.getAt(x+vx,y)==$pat_kabe+1 ) { // 進行方向のマップパターンがブロック a.pause(); // 待機前にアニメーションを止める updateEx(30); // 30フレーム待機 a.resume(); // 待機後にアニメーション再開 vx=-vx; // 進行方向を反転する } x+=vx; // 進行方向へ進む if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転 y+=vy; // vy: y 方向の速度。 yにvy を加える if ($map.getAt(x,y+24)==$pat_kabe+1 ) { // ブロックに当たっていたら vy=0; // 落下速度を0にする } else { // ブロックに当たっていなかったら vy+=0.5; // 落下速度を上げる } update(); }
あと、ロック○ンで使われているようなライフゲージにするにはどうすればいいのでしょうか? 僕が参考にしたやり方は、食らうたびに画像が減っていく方法だと思うのですが。どうなのでしょう?
|
Re: ライフ
投稿者 : ごま太郎(o096154.ap.plala.or.jp)
- 2004/05/11(Tue) 18:53
No.6202
|
|
|
|
私の説明は分かりづらいので、分かりやすい(そして正しい)説明が出てくるまでの場繋ぎということで。 //---自機について--- while (1) { hp=8; if(hp>0)drawSprite($screenWidth-20,20,$pat_life+7,0,0); 以下略
まず、whileの後に書かれたもの繰り返されます。詳しいことは書くと混乱しますが、これじゃダメということです。 //---自機について--- hp=8; while (1) { if(hp==1)drawSprite($screenWidth-20,20,$pat_ライフが1の時の画像,0,0); 以下略 //------------------
----以下点線内は読まなくてもよい---- while(){〜}だと、〜の中に書かれたものは毎フレームごとに宣言されて、常に一定の値になります。 ------------------------------------
if(hp==1)drawSprite($screenWidth-20,20,$pat_ライフが1の時の画像,0,0); についてですが、画像の用意の仕方が分からないのでなんとも言いがたいですが、整数のみでライフ計算を行うならばこのように直接数字を指示したほうがいいです。 元の書き方だと、プログラム側でも変な動きをすると思われます。これがライフの表示が変になった理由です。
一撃で死んでしまうのは…敵に自機とぶつかったときの処理が二箇所あるのが原因ですかね。 {die();$ninjaa.hp-=1;}だと順序として先に敵が死んでしまうので、忍者のライフが減らない気がするのは私だけでしょうか?(すみません、ここらへんは私もよく分からないです) で、ジャンプしたとき関係にいつも処理が持ってかれて結果死亡していると思われます。
ちなみに、プログラムを落としてないので他に原因があったらまったく分かりません。説明が間違っているかもしれないので、他の方もよろしくお願いしますm(_ _)m
|
追記
投稿者 : ごま太郎(o096154.ap.plala.or.jp)
- 2004/05/11(Tue) 18:56
No.6203
|
|
|
|
ライフゲージをロックマン風にするには、四角形を描写します。変数で長さを指示するんですが…これってけっこうめんどくて最初バグが多いんですよね^^;
ソラで書いたら確実に間違うので、アップセンターより「おにぎり」で検索してみてください。「おにぎり求めて三千里」というやつがいくつか出てくると思います。最新のが一番見やすいと思いますので、参考にどうぞ。
質問掲示板かアップか分かりませんが、「巫女」で出てくると思われるアクションゲームでは画像のライフを使ってますので、見つかったら参考にでもどうぞ。
|
Re: ライフ
投稿者 : 毎度おさがわせなピッコロ(i226043.ppp.asahi-net.or.jp)
- 2004/05/11(Tue) 20:46
No.6204
|
|
|
|
ごま太郎さん、分かりやすい説明を書いてくださってどうもありがとうございますm(_ _)mペコリ ライフ設置を頑張ります^^ あと、一撃で死んでしまわないようにするにはどうすればいいのでしょうか?ご迷惑ばかりおかけして申し訳ありません。「おにぎり」でさっそく検索しようと思いますw
|
わかりやすいコード
投稿者 : nuntora(acc7-ppp214.per.dialup.connect.net.au)
- 2004/05/12(Wed) 01:55
No.6206
|
|
|
|
まず、プログラムを見やすくしましょう。これでは、見るほうも大変です。 〜敵〜 for (t in $chars) { if ( t is shuriken && crashTo(t) ) die(); } for (t in $chars) { if ( t is bunsin && crashTo(t) ) die(); } for (t in $chars) { if ( t is shuriken2 && crashTo(t) ) die(); } は 〜敵〜 for (t in $chars) { if ( (t is shuriken || t is bunsin || t is shuriken2) && crashTo(t) ) die(); } と同じことです。調べる回数が減るので単純に処理も早くなります。
一発で自機が死なないようにするということのようですが、いろいろと問題があります。ひとまず、間違えている部分を指摘しますと、
if (crashTo($ninjaa)){die();$ninjaa.hp-=1;}//自機に衝突したら自機のHPを減らす
の部分と
if (crashTo($ninjaa)) { // 自機とぶつかったら if ( $ninjaa.y < y-8 && $ninjaa.vy>0 ) { // 自機は敵より少し上にいて、下方向に速度をもっているならば die(); // 敵が死ぬ $ninjaa.vy=-5; // 自機がはねあがる } else { $ninjaa.die(); // そうでなければ自機が死ぬ } { die(); $score=$score+10; } } はninjyaaというオブジェクトに衝突した場合について書いてあると思うのですが、「$ninjaa.die(); // そうでなければ自機が死ぬ」の部分でninjyaaというオブジェクトが必ず殺されるように設定されています。その部分を修正してください。
ファイルを添付していただいた方が、的確な判断もできると思います。御一考下さい。
|
Re: ライフ
投稿者 : ごま太郎(u178203.ap.plala.or.jp)
- 2004/05/12(Wed) 22:38
No.6208
|
|
|
|
普通に理解できてればそれでけっこうですが。 else { $ninjaa.die(); // そうでなければ自機が死ぬ } ここのことです。 常にここが呼び出されているので忍者がぶつかっただけで死亡するわけで、処理を整理すれば自然に治るかも?(笑) とりあえず、すぐには死なないようにしたいなら else { $ninjaa.hp--; } ということです。プログラムを整理したらこの書き込みは無意味かな?^^;
|
Re: ライフ
投稿者 : 毎度おさがわせなピッコロ(i226043.ppp.asahi-net.or.jp)
- 2004/05/12(Wed) 23:34
No.6210
|
|
|
|
nuntoraさん、ごま太郎さん、ありがとうございます^^これでなんとかできるかもしれません♪ 本当にお二人方のおかげです!! あと、添付したいのですがエラーみたいな感じになってできません。(つд`)
|
添付条件
投稿者 : nuntora(acc11-ppp52.per.dialup.connect.net.au)
- 2004/05/13(Thu) 00:07
No.6212
|
|
|
|
画面上方の「使い方」を見て確かめてみてください。
画像などのバイナリーファイルをアップロードすることが可能です。
添付可能ファイル : TEXT, LHA, ZIP, MIDI 最大投稿データ量 : 100 KB
ファイルを添付される際にLZHやZIPに圧縮されましたか? 100KBを超えていませんか?
|
Re: ライフ
投稿者 : 毎度おさわがせのピッコロ(i226043.ppp.asahi-net.or.jp)
- 2004/05/13(Thu) 17:52
No.6213
|
|
|
|
6213.zip
圧縮してませんでした(^^; なんとかライフはできたのですが、右端のほうになぜか設置されています。 どうすれば座標を変えれるのでしょうか? ライフのオブジェクトをつくらないといけないのでしょうか?
hp=9;//HPを決める while(1){ anim.pause(); if(hp==1)drawSprite($screenWidth-20,20,$pat_life3+7,0,0); if(hp==2)drawSprite($screenWidth-40,20,$pat_life3+6,0,0); if(hp==3)drawSprite($screenWidth-60,20,$pat_life3+5,0,0); if(hp==4)drawSprite($screenWidth-80,20,$pat_life3+4,0,0); if(hp==5)drawSprite($screenWidth-100,20,$pat_life3+3,0,0); if(hp==6)drawSprite($screenWidth-120,20,$pat_life3+2,0,0); if(hp==7)drawSprite($screenWidth-140,20,$pat_life3+1,0,0); if(hp==8)drawSprite($screenWidth-160,20,$pat_life3+0,0,0); if(hp==0)die();//HPが0になったら死ぬ やっとできたと思ったら・・・ 本当に申し訳ないですm(´д`)m m(_ _)mぺこり
|
Re: ライフ
投稿者 : ごま太郎(s109109.ap.plala.or.jp)
- 2004/05/13(Thu) 18:02
No.6214
|
|
|
|
別の質問は別スレで…とはいっても、ライフ関係だからいいのかな? ここらへんの区別はさだかでないんですが…。 トップよりスクロールのサンプルを参照しましょう。 ちなみに、サンプルは記述に間違いがある気がしてならないのですが^^;
$screenWidthとは、左端から右端までのこと。 つまり、$screenWidth-20では右端から20ドット左にという意味になります。スクロールさせてもちゃんと左端(に表示させたいのかな?)に置くには、$screenWidth-620(画面サイズ640x240の場合)という風に記述します。 右端から何ドットかということです。
このライフ表示、同じことの繰り返しなので単純化できそうですが…まあ、そこまでやったらたぶんこんがらがります。ゆっくり頑張ってください。
|
Re: ライフ
投稿者 : 毎度おさわがせのピッコロ(i226043.ppp.asahi-net.or.jp)
- 2004/05/13(Thu) 21:35
No.6215
|
|
|
|
ごま太郎さんの言った通りにしたらできました^^ やった〜!!ありがとうございます♪ これでこのスレも終わりかな。
|
|