HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0213
KODB弾の連射7解決


KODB

リンク

2009/2/13(Fri) 22:57:46|NO.23376

Easy3Dで3Dシューティングを作っています。
今、弾の発射のところで困っています。

;tamaidはtamaの形状ID if (keybuf.'X' = 1)& (tamatime<1) { tamatime = 300 } if tamatime>0 { tamatime = tamatime-1 E3DPosForward tamaid, 300 ;弾移動 }
とりあえず、このように書いてみました。弾は発射されました。
しかし、困ったことに、この記述の仕方だと、
一発目が消えないと(tamatimeが0にならないと)2発目が撃てません。
連射できるようにするにはどうすればいいでしょう。



この記事に返信する


GENKI

リンク

2009/2/14(Sat) 02:11:26|NO.23386

弾は画面に表示したい数だけ、あらかじめ用意しておく必要があります。


HSP2ですが、関連資料:
http://homepage3.nifty.com/ghpk/e3d/hsp2/e3d013.htm



KODB

リンク

2009/2/15(Sun) 16:08:17|NO.23407

読み込み時にrepeat命令とloop命令を使って、画面に表示したい分だけ用意しましたが
発射時の処理がわかりません。
Xキーで弾を発射しました。しかし、次の弾を発射するには、1発目の弾が消えてからじゃないと
発射できないわけです。連射できません。
そこで、1発目弾の移動の処理中に2発目の弾を発射したいわけです。
イメージとしては、ピストルの回転式弾装ってやつです。
撃ったら次の弾がセットされて撃ったら次の弾がセットされて・・・



SYAM

リンク

2009/2/15(Sun) 16:38:15|NO.23408

弾を3つ撃てるとすると、
弾の座標を3組用意しますよね。これを弾1、2、3とします。
それと、弾が今使われているかどうかを示すフラグも3つ用意します。
または、弾の座標がありえない値(マイナスとか)なら、その弾はまだ使われていない、でもいいですね。
もちろん、最初は弾1、2、3全部が「使われていない」です。


で、いざ弾を撃つことになったら、
まず弾1が使われていないので、弾1を撃ちます。

で次に撃つことになったら、
弾1…は今使ってる、弾2…はまだ使われていないので、弾2を撃ちます。

弾はそのまま消えてしまったとします。
弾が的に当たったり、画面外に消えたら、「使われていない」状態にします。


また弾を撃つことになったら、弾1を撃ちます。
さらに弾2も撃ちました。
さらに撃とうとすると、弾1…は使ってる、弾2もダメ、弾3が残っているようなので弾3を撃ちます。

…ここで、
弾2だけが的に当たり、消えました。
ここで弾を撃つことになったら、
弾1…は今使ってる、
弾2…は使われていないので、弾2を撃ちます。



GENKI

リンク

2009/2/15(Sun) 17:55:48|NO.23411

すこしややこしいので簡単なサンプル見たほうがいいのかなという気がします。
提示した資料のほうでも一応解説してたとは思いますが、
HSP2用でしかもちょっとみにくいので簡単なのを書いてみました。


;弾を使用する数の分だけ用意する(20個用意します。) dim px,20 ;弾丸の移動座標データ dim py,20 dim ftama, 20 ;弾丸 px0 = 100 ;弾丸の初期位置 py0 = 100 vx = 3 vy = 0 *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 stick key ;使ってない玉を捜して発射する if key&16 { repeat 20 if ftama(cnt)=0 { ftama(cnt)=1 break } loop } ;弾の移動 repeat 20 if ftama(cnt) = 1 { ;使用中の弾の処理 px(cnt) += vx py(cnt) += vy ;一定の距離進んだら弾丸の使用をやめる if (px(cnt) >= 300) or (py(cnt) >= 300) { ftama(cnt) = 0 ;未使用にする px(cnt) = 0 : py(cnt) = 0 ;移動座標の初期化 } } loop ;弾の描画 repeat 20 if ftama(cnt) = 1 { ;使用中の弾の処理 pos px(cnt)+px0, py(cnt)+py0 mes "弾\n"+cnt } loop goto *main

書いている内容はほぼSYAMさんの解説のとおりです。
両方見てよく考えてから、Easy3D用に書き直してくださいね。



コンテスト出品者

リンク

2009/2/15(Sun) 19:00:42|NO.23412

もしかすると質問主さんは配列変数をご存じないのではないでしょうか?



KODB

リンク

2009/2/16(Mon) 20:27:55|NO.23433

返事遅れました;;
すいません。やってみます。



KODB

リンク

2009/2/16(Mon) 21:53:55|NO.23434

おお。うまくいったです^^
みなさん、ありがとうございました^^



ONION software Copyright 1997-2023(c) All rights reserved.