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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0406
ひよっこシューティングゲームの弾が動かない6解決


ひよっこ

リンク

2011/4/6(Wed) 19:55:31|NO.38184

HSPでシューティングゲームを作っています。

初心者なりにがんばってシューティングゲームを作っているんですが、弾を発射する(?)ところまで
きています。



screen 0,700,400 dim ammo,40 dim ammo_x,40 dim ammo_y,40 *main gsel 0 color 225,225,225 boxf y=350 color 0,0,0 pos x,y mes "@" *key await 50 stick k,149:if k!0:goto *mv goto *key *mv if k&1:x=x-5 if k&4:x=x+5 if k&16:goto *shota if x<0:x=0 if x>645:x=645 if k&128:end goto *main *shota repeat 40 if ammo(cnt)=0{ ammo(cnt)=1 ammo_x=x ammo_y=y break } loop repeat 40 if ammo_y(cnt) < 0 : ammo(cnt) = 0 if ammo(cnt) = 1 { ammo_y(cnt)=-10 pos ammo_x(cnt)+40 ,ammo_y(cnt)+y+7 mes "-" } loop redraw 0 redraw 1 if x<0:x=0 if x>645:x=645 goto *main <pre/> さまざまなサイトを見て工夫したりしたのですが、弾が前に進みません・・・ただ点滅するだけです;; ソースはコピペですぐ使えるように直しました。 「@」がキャラで、「-」が弾です。 ちなみにキャラが左右にしか動けないのはわざとです。 弾が点滅してるだけで動かないのはなぜなのでしょうか?



この記事に返信する


ぬこ

リンク

2011/4/6(Wed) 20:19:43|NO.38186

弾が点滅するのはスペースを押さないと弾を描画しないからです。
描画するサブルーチンを別に作るといいですよ。

弾が動かないのは10行目でyに350を毎回代入しているからです。



ひよっこ

リンク

2011/4/6(Wed) 21:12:53|NO.38187

「弾が点滅するのはスペースを押さないと弾を描画しないから」とはどういうことでしょうか?
スペースキーを押すと*shotaに飛んでそして、↓


*shota repeat 40 if ammo(cnt)=0{ ammo(cnt)=1 ammo_x=x ammo_y=y break } loop repeat 40 if ammo_y(cnt) < 0 : ammo(cnt) = 0 if ammo(cnt) = 1 { ammo_y(cnt)=-10 pos ammo_x(cnt)+40 ,ammo_y(cnt)+y+7 mes "-" } loop redraw 0 redraw 1 if x<0:x=0 if x>645:x=645 goto *main
こんな感じにプログラムを書いたのですが・・・。

弾はとりあえず横にだけ動けばおkです。



晩御飯

リンク

2011/4/6(Wed) 21:35:40|NO.38188

スペースキーを押したときにしかmes "-"が呼ばれないのはおかしい、ってこと。

ついでにgotoとgosubの違い、それからredrawの使い方を調べ直したほうがいいと思います。



M

リンク

2011/4/6(Wed) 23:02:14|NO.38193

配列の添え字を忘れていること、座標を加算しなければいけないところを、代入していることなど、細かい所はありますが、一番大きいのは、スペースキーが押されたときしか、すべての弾が移動しないようになっていることだと思います。

正しく動かすには、こんなかんじになるじゃなかろうか?というコードを書いてみました。
大まかな変更は、
・gotoではなく、gosubを使うようにした。(gosubで行って、returnで戻ってくるようにした)
・弾を発射するルーチンと、弾を移動させルーチンを分けた
の二点です。
弾は、右方向に移動するようにしてあります。

screen 0,700,400 dim ammo,40 dim ammo_x,40 dim ammo_y,40 *main REDRAW 0 gsel 0 color 225,225,225 boxf y=350 color 0,0,0 pos x,y mes "@" await 50 stick k,149 if k&1:x=x-5 if k&4:x=x+5 if x<0:x=0 if x>645:x=645 if k&16:GOSUB *shota ;スペースキーが押されたら、サブルーチンへ GOSUB *shotB ;弾の移動ルーチンへ REDRAW 1 if k&128:end goto *main *shota ;弾の発射ルーチン ;(このサブルーチンは、スペースキーが押されたときのみ、実行される) repeat 40 if ammo(cnt)=0{ ;もし、その弾が発射されていなければ、 ammo(cnt)=1 ; 発射済みにして ammo_x(cnt)=x ; 弾の座標に、自機の座標をセットしておく ammo_y(cnt)=y break ; ループを抜ける(かならず、ループを抜けてから、returnで戻ること) } loop RETURN ;メインルーチンに戻る *shotB ;弾の移動ルーチン ;(このサブルーチンは、常に実行される) repeat 40 if ammo(cnt) = 1 { ;もし、その弾が発射されていたら、 ammo_x(cnt)+=8 ; 弾を、8ドット移動させる pos ammo_x(cnt),ammo_y(cnt) ; 弾を表示 mes "-" if ammo_x(cnt)>645:ammo(cnt)=0 ; もし、画面の右端まで弾が進んだら、その弾を発射されていないことにする } ; (つまり、弾の削除) loop RETURN ;メインルーチンに戻る



ひよっこ

リンク

2011/4/7(Thu) 00:04:28|NO.38194

気になった表現(?)を見つけたんですが
ammo_x(cnt)+=8

は、
ammo_x(cnt)=ammo_x(cnt)+8
ということですか?



ひよっこ

リンク

2011/4/7(Thu) 00:11:35|NO.38195

スクリプトを見ていたら、だんだん処理のしかたなどが、
見えてきました!ありがとうございました!



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