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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0208
初心ものシューティングゲームで弾を連射する方法6解決


初心もの

リンク

2024/2/8(Thu) 20:36:39|NO.101177

近頃シューティングゲームを作っているのですが自機や敵が弾を連射する方法が分かりません
配列変数というものを使えばできるのでしょうか?
キーを押している間連射されるようにしたいです
どなたかよろしくお願いします



この記事に返信する


窓月らら

リンク

2024/2/8(Thu) 22:14:55|NO.101179

そうです、配列変数を使います。
まずは、1弾発射だけを考えて作ったのちに、それらの座標などを配列にしてループ処理することを考えてみてください。



窓月らら

リンク

2024/2/8(Thu) 22:50:11|NO.101180

簡単なサンプル書いたので提示します。
あくまでサンプルです。このままコピペで終わらせず、よーく考えてみてください。
このサンプルでは stick 命令を使っていますが、ゲームパッドなどに対応するためには別の方法を使い工夫する必要があります。

// 連射サンプル x=320: y=420 #define SHOT_NUM 5 // ショット可能数 dim sx,SHOT_NUM dim sy,SHOT_NUM dim sf,SHOT_NUM // ショットフラグ 0か1 gsel 0,1 // ウィンドゥアクティブ化 *main stick p,1+4 // キー情報を取得 if p & 1 { x-=4 } // ← if p & 4 { x+=4 } // → x=limit(x,0,625) // 移動制限 // スペースキー if p & 16 { // 空いている配列があればショット開始 repeat SHOT_NUM if sf(cnt)=0 { sf(cnt)=1: sx(cnt)=x+3: sy(cnt)=y: break } loop } // ショットの動き repeat SHOT_NUM if sf(cnt) { sy(cnt)-=12: if sy(cnt)<0 { sf(cnt)=0 }} loop // 描画 redraw 0 color: boxf // 背景を黒でクリア color 0,255,255 // その他の色 // ショット repeat SHOT_NUM if sf(cnt) { pos sx(cnt),sy(cnt): mes "|" } loop // 自機 pos x,y: mes "▲" pos 8,8 mes "操作できない場合は、このウィンドゥをクリックしてアクティブにしてください。" mes "左右キーで移動、スペースキーでショット。" redraw 1 await 16 goto *main



窓月らら

リンク

2024/2/8(Thu) 23:54:22|NO.101182

以下は考えてもらおうかな・・・と思っていたのですが、
押しっぱなしで連射させる場合は

stick p,1+4+16

としてスペースキー(16)も非トリガーにした上で、スペースキーの判定を以下に置き換えます。

// スペースキー if p & 16 { c++: if c\8=0 { // 空いている配列があればショット開始 repeat SHOT_NUM if sf(cnt)=0 { sf(cnt)=1: sx(cnt)=x+3: sy(cnt)=y: break } loop } } else { c=-1 }
c++: if c\8=0 {

ここの 8 が発射間隔になります。
あとは考えてみてください・・・



初心もの

リンク

2024/2/12(Mon) 19:15:38|NO.101202

窓月様、ありがとうございます。

repeat SHOT_NUM if sf(cnt)=0 { sf(cnt)=1: sx(cnt)=x+3: sy(cnt)=y: break } loop
この部分の理解ができていないためご回答いただけるとありがたいです。
repeat SHOT_NUM~loop

この部分で弾の個数を指定
if sf(cnt)=0 { sf(cnt)=1
ここで発射されたフラグを立たせる
sx(cnt)=x+3: sy(cnt)=y: break

ここで弾の移動値を決める? という感じでしょうか? 特に最後の部分はあまりわかっていません よろしければお願いいたします。



窓月らら

リンク

2024/2/12(Mon) 20:14:24|NO.101203

まず、sf(n) という変数はフラグであるという点。
これは 1 であれば弾が出ているとき、0 は弾が出ていないを表す。

SHOT_NUM は弾の数(定数)。これは変数ではありません。

repeat SHOT_NUM if sf(cnt)=0 { sf(cnt)=1: sx(cnt)=x+3: sy(cnt)=y: break } loop
ここは、sf(cnt)=0 (弾がでていない)ならば、弾の初期化をして弾のフラグsf(cnt)を1にする
x+3 の +3 は自機と弾の表示パターンの調整のためです。+3 を色々変えてみればわかります。
sy(cnt)=y は自機のy座標を発射ポイントとして指定しています。
弾はひとつ処理したら抜けなければいけないので、break でループを抜けます。
ようするに、これは sf(0〜4) の配列変数の空きがあれば発射する、という処理になります。

各命令の上にカーソルを合わせて F1キーで説明がでますから、読んでみてください。

弾の移動を決めているのは下記の部分です。sy(cnt)-=12 が速度。

// ショットの動き repeat SHOT_NUM if sf(cnt) { sy(cnt)-=12: if sy(cnt)<0 { sf(cnt)=0 }} loop



初心もの

リンク

2024/2/21(Wed) 19:14:23|NO.101274

やっと理解が追いつきました
本当にありがとうございました



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101177への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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