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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0405
ひよっこシューティングゲームの弾の発射について11解決


ひよっこ

リンク

2011/4/5(Tue) 10:16:10|NO.38137

シューティングゲームを作っているのですが、
弾の発射に苦労しています。
http://www.geocities.jp/hspgame2/shooting3.htmを見ながら、やっているのですが、

cnt

が使われているの意味がわかりません・・・。 よろしくおねがいしますm(_ _)m



この記事に返信する


あり

リンク

2011/4/5(Tue) 10:40:51|NO.38139

そのページの説明にも書いてあるように
弾の管理用配列を40個用意しているのでその配列の指定の為にcntが使われています。

ようするに弾が発射されていてもいなくても常に弾40発分の管理を行い
スペースキーが押された時に発射されていない弾があるなら発射フラグを立て
弾の発射フラグが立っているならその弾の表示と移動処理を行うという仕様です。



ひよっこ

リンク

2011/4/5(Tue) 11:09:08|NO.38140


if key && 16 { repeat 40 if tama(cnt) = 0 { tama(cnt) = 1 tama_x(cnt) = (x + 20) tama_y(cnt) = y break } loop }

は何をしているのですか?
座標とか関係してるみたいですけど・・・



SYAM

リンク

2011/4/5(Tue) 11:15:42|NO.38141

昔、弾の発射についてここで回答したことがあり、以下がそのURLです。

http://hsp.tv/play/pforum.php?mode=pastwch&num=23376

参考になるといいんですが。



あり

リンク

2011/4/5(Tue) 11:53:28|NO.38142

>は何をしているのですか?
>座標とか関係してるみたいですけど・・・
スクリプトの解説で各変数の意味と使い方の説明はされているので
あとは変数X=自機の横座標、変数Y=自機の縦座標と言う事と合わせれば
何を行っているのかは理解できると思います。
ちなみにbreakは一回につき弾を一つだけ発射させたら発射処理を終了するという事です。

これでも分かり難いのであれば
tama_x(cnt) = (x + 20)
tama_y(cnt) = y
の部分を
tama_x(cnt) = (200 + 20)
tama_y(cnt) = 200
等にしてみれば
見た目でもよくわかるでしょう。



ひよっこ

リンク

2011/4/6(Wed) 13:34:33|NO.38159

breakについて命令リファレンスを見ていたのですが、
これってもしかして、
「スペースキーを押すまで待つループ。」
というような感じでしょうか?



ひらまる

リンク

2011/4/6(Wed) 13:51:50|NO.38160

40個のポケットがついたジャケットがあり、
1つのポケットには1つの弾丸が入るとします。

;スペースキーが押された場合、 if key && 16 { ;40個のポケットを1つ1つ調べて弾が入っているか確認するループ。 repeat 40 ;cnt番目のポケットに弾丸があった場合、 if tama(cnt) = 0 { ;cnt番目のポケットにあった弾を消費したフラグを立てる。 tama(cnt) = 1 ;弾の位置を自分の右側に設定する。 tama_x(cnt) = (x + 20) tama_y(cnt) = y ;cnt番目のポケットから弾を1つ撃ったので、 ;これ以上他のポケットを探す必要はない。 ;よってここでbreakしてループを抜ける。 break } loop }
友人もこの弾のフラグでつまずいていました。
プログラミング初心者にはかなり理解し難い部分だと思うので、あまり気張りすぎずに頑張ってください。



SYAM

リンク

2011/4/6(Wed) 14:05:01|NO.38161

>スペースキーを押すまでループ

残念、そうではありません。

break によって抜けるループというのは、その何行か前の repeat 40 です。
キーをおしたかどうか判断しているのは、そのループに入る前のコトですから違いますね。
breakするかどうかの別れ目がどこか、それは何を判断基準としているかをもう一度よく考えてください。

40個ある tama を一つ一つ調べて、内容が 0 のものがあったらそれを使った処理をいくつかこなして、breakです。つまり、見つけたのよりも後の tama については調べも処理もしないということです。



ひよっこ

リンク

2011/4/6(Wed) 16:03:29|NO.38162

breakがあるのになぜループを作る必要があるのでしょうか?

if key && 16 {                1
repeat 40               2 if tama(cnt) = 0 { 3 tama(cnt) = 1         4 tama_x(cnt) = (x + 20)    5 tama_y(cnt) = y        6 break } loop }

6行目で終わってしまう気がするのですが・・・。



ひよっこ

リンク

2011/4/6(Wed) 16:47:48|NO.38165

ひらまるさんの解説してくれたスクリプトを見て思ったのですが、
分かりそうでわかりません;;

cnt番目のポケットに弾丸がある、無い<pre/>を判断しているのは、
if tama(cnt) = 0(2行目)<pre/>より後なのでしょうか?




SYAM

リンク

2011/4/6(Wed) 16:50:24|NO.38166

repeat〜loopからすぐさま脱出するのが breakです。ここまではいいですね。

40回のループの実行中、break が実行されるのは、tama(cnt) = 0 のときだけです。
それ以外の場合は、breakのあるところを通らないことに注意してください。

たとえば、40個あるtamaのうち、tama(10)が 0 で、それ以外が 1 だったとすると・・・

tama(0) = 0 ではないので breakは通らず loopに到達して次回のループへ。
tama(1) = 0 ではないので breakは通らず loopに到達して次回のループへ。
tama(2) = 0 ではないので breakは通らず loopに到達して次回のループへ。
 (中略)
tama(9) = 0 ではないので breakは通らず loopに到達して次回のループへ。
tama(10) = 0 なので ifブロックの中に入り、break。すぐにループを抜けます。



ひよっこ

リンク

2011/4/6(Wed) 16:57:51|NO.38168

凄くわかりやすかったです!
自分は相当勘違いをしていました・・・

次々と質問に答えていたたきありがとうございました!
皆さん本当にありがとうです^^



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