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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0115
リュウSTGで敵が一定のY座標まできたら円形弾を発射する処理5未解決


リュウ

リンク

2014/1/15(Wed) 22:25:19|NO.59338

pre
screen 0,500,480 //画面の初期化
//変数の確保
frame = 0
jiki_x = 250
jiki_y = 400
//配列変数の確保
max_e = 10
dim enemy_f,max_e
ddim enemy_x,max_e
ddim enemy_y,max_e
ddim enemy_vx,max_e
ddim enemy_vy,max_e

shotmax = 100
dim shot_f,shotmax
ddim shot_x,shotmax
ddim shot_y,shotmax
ddim shot_vx,shotmax
ddim shot_vy,shotmax

e_shotmax = 500
dim e_shot_f,e_shotmax
ddim e_shot_x,e_shotmax
ddim e_shot_y,e_shotmax
ddim e_shot_vx,e_shotmax
ddim e_shot_vy,e_shotmax
//ループの開始
repeat
redraw 0
color 255,255,255:boxf

stick k,31
//自機の移動
if(k&1):jiki_x=jiki_x-3
if(k&2):jiki_y=jiki_y-3
if(k&4):jiki_x=jiki_x+3
if(k&8):jiki_y=jiki_y+3
if(k&16):shot_start=1:else:shot_start=0
if(k&128):end

//敵の出現
if frame=50{
repeat max_e
if enemy_f(cnt)=0{
enemy_x(cnt)=0.0+rnd(500)
enemy_y(cnt)=-8.0
enemy_f(cnt)=1
enemy_vy(cnt)=2.0
break
}
loop
frame=0
}
//敵を下方向へ移動させる
a=0
repeat max_e
if(enemy_f(a)=1){
enemy_x(a)=enemy_x(a)+enemy_vx(a)
enemy_y(a)=enemy_y(a)+enemy_vy(a)
if(enemy_y(a)>488.0):enemy_f(a)=0
a+1
}
loop
//ショットの発射
if(shot_start=1){
repeat shotmax
if(shot_f(cnt)=0){
shot_x(cnt) = jiki_x
shot_y(cnt) = jiki_y
shot_vy(cnt) = -5.0
shot_f(cnt) = 1
break
}
loop
}
//ショットの移動
repeat shotmax
if(shot_f(cnt)=1){
shot_x(cnt) = shot_x(cnt)+shot_vx(cnt)
shot_y(cnt) = shot_y(cnt)+shot_vy(cnt)
if(shot_y(cnt)< -8.0):shot_f(cnt)=0
}
loop
//敵弾の出現
if(enemy_y(a)>100){
g = 20
repeat g
t=m_pi*2*cnt/g
gosub*search
if(number!-1){
e_shot_f(number)=1
e_shot_x(number)=enemy_x(a)
e_shot_y(number)=enemy_y(a)
e_shot_vx(number) = cos(t)*3.0
e_shot_vy(number) = sin(t)*3.0
}
loop
}
//敵弾の移動
repeat e_shotmax
if(e_shot_f(cnt)==1){
e_shot_x(cnt)=e_shot_x(cnt)+e_shot_vx(cnt)
e_shot_y(cnt)=e_shot_y(cnt)+e_shot_vy(cnt)
}
loop
//敵弾の描画
repeat e_shotmax
if(e_shot_f(cnt)==1){
color 0,0,255
pos e_shot_x(cnt)-8,e_shot_y(cnt)-8
mes"●"
}
loop

//フレームカウンターの表示
color 0,0,0
pos 0,0
mes frame
mes a
//自機の描画
color 0,0,0
pos jiki_x-8,jiki_y-8
mes"▲"
//敵の描画
repeat max_e
if(enemy_f(cnt)=1){
color 255,0,0
pos enemy_x(cnt)-8,enemy_y(cnt)-8
mes"▼"
}
loop
//ショットの描画
repeat shotmax
if(shot_f(cnt)=1){
color 0,0,0
pos shot_x(cnt)-8,shot_y(cnt)-8
mes"・"
}
loop

redraw 1
wait 1
frame+1

loop//ループ終了

//弾番号の検索
*search
number = -1
repeat e_shotmax
if(e_shot_f(cnt) ! 1):number = cnt:break
loop
return
/pre
タイトル通りで、敵が一定のY座標(今回は100)まで来たら
円形の弾を発射させる処理を書きたいのです。
しかし、実行させると敵が画面外まで出てから円形弾を発射しているんです。
まだまだ初心者で全然わからないので
『敵は一定のY座標まで来たら円形弾を発射する』というスクリプトを教えてください。
よろしくお願いします。



この記事に返信する


MillkeyStars

リンク

2014/1/16(Thu) 00:53:11|NO.59339

スクリプトが動作が途中でわからなくなれば、分解すればいい。
今回の場合は、「敵出現・敵を下へ移動・敵弾発射・敵、弾表示」の処理しか使わないわけだから、そこの部分を
取り出して、見直せばいい。

まず、Frame 50 に到達した際に、新たな敵が出現する設定であるのなら、その敵を 1 として、1 のY座標が 100 になったら円弾を発生させる。
円弾が発生したら、さらに円弾が発生しないように、フラグを立てる。
フラグを立てたなら、円弾の位置計算・描画処理をすればいい。

でいいと思うんだけど、難しいのかな?



暇人

リンク

2014/1/16(Thu) 00:54:28|NO.59340

明らかにおかしいのは
>if(enemy_y(a)>100){
変数aには何処で何を入れてる?

後発射タイミングを座標だけでやると
発射した次のフレームでも又条件を満たしてて発射してしまう



MillkeyStars

リンク

2014/1/16(Thu) 03:29:55|NO.59342

サンプル用スクリプト。多次元配列と管理システムの勉強用

screen 0,500,480 //画面の初期化 randomize //敵情報配列 enemy_max = 30 // 敵の最大数 //↓配列の内部(敵使用フラグ、敵位置x,敵位置y,敵円弾可否,敵弾使用y位置) dim enemy,5,enemy_max //内部の配列を追加できるように、使用フラグを先頭にしています。 //敵弾情報配列 enemy_bomb_max = 500 //敵が使用する弾の最大(敵全体共通) //↓配列の内部(敵弾使用フラグ,位置x,位置y,加算値x,加算値y,弾速倍率) ddim enemy_bomb,7,enemy_bomb_max repeat //敵の出現 if frame == 30{ gosub *enemy_search if enemy_search_id != -1{ enemy(0,enemy_search_id) = 1 enemy(1,enemy_search_id) = rnd(500-16) enemy(2,enemy_search_id) = -8 enemy(3,enemy_search_id) = 0 enemy(4,enemy_search_id) = 100 //敵弾発射y位置 enemy_view++ } frame = 0 } //敵降下処理と敵弾発射処理と範囲外リセット処理 repeat enemy_max if enemy(0,cnt) == 1{ enemy(2,cnt) += 3 //降下速度値加算 //敵弾発射判定 if enemy(3,cnt) == 0{ if enemy(4,cnt) <= enemy(2,cnt){ bomb_create_id = cnt gosub *enemy_bomb_create enemy(3,cnt) = 1 } } //ついでに、画面範囲外に出た敵は、リセット処理 if enemy(2,cnt) >= 480{ enemy(0,cnt) = 0 enemy_view-- } } loop //敵弾の計算処理と範囲外処理 repeat enemy_bomb_max if enemy_bomb(0,cnt) == 1.0{ //敵弾加算処理 enemy_bomb(1,cnt) += enemy_bomb(3,cnt) enemy_bomb(2,cnt) += enemy_bomb(4,cnt) //敵弾範囲外リセット if (enemy_bomb(1,cnt) <= -16)or(enemy_bomb(2,cnt) <= -16)or(enemy_bomb(1,cnt) >= 580)or(enemy_bomb(2,cnt) >= 480){ enemy_bomb(0,cnt) = 0.0 enemy_bomb_view-- } } loop redraw 0 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 mes "FRAME : "+frame mes "出現敵数 : "+enemy_view mes "出現弾数 : "+enemy_bomb_view //敵の表示 repeat enemy_max if enemy(0,cnt) == 1{ pos enemy(1,cnt),enemy(2,cnt) mes "▼" } loop //敵弾の表示と加算処理 color 0,0,255 repeat enemy_bomb_max if enemy_bomb(0,cnt) == 1.0{ pos enemy_bomb(1,cnt),enemy_bomb(2,cnt) mes "●" } loop redraw 1 frame++ await 16 loop *enemy_bomb_create bomb_create_pp = 36 //敵一騎が作成する敵弾数 repeat bomb_create_pp t=3.14*2*cnt/bomb_create_pp calc_x = cos(t)*500+enemy(1,bomb_create_id) calc_y = sin(t)*480+enemy(2,bomb_create_id) gosub *enemy_bomb_search if enemy_bomb_search_id = -1 : break //敵弾情報登録 enemy_bomb(1,enemy_bomb_search_id) = double(enemy(1,bomb_create_id)) enemy_bomb(2,enemy_bomb_search_id) = double(enemy(2,bomb_create_id)) enemy_bomb(0,enemy_bomb_search_id) = 1.0 enemy_bomb(3,enemy_bomb_search_id) = (double(enemy(1,bomb_create_id)) - calc_x) / 100.0 enemy_bomb(4,enemy_bomb_search_id) = (double(enemy(2,bomb_create_id)) - calc_y) / 100.0 enemy_bomb_view++ loop return *enemy_search enemy_search_id = -1 repeat enemy_max if enemy(0,cnt) == 0 : enemy_search_id = cnt : break loop return *enemy_bomb_search enemy_bomb_search_id = -1 repeat enemy_bomb_max if enemy_bomb(0,cnt) = 0.0 : enemy_bomb_search_id=cnt : break loop return



HIJIKI

リンク

2014/1/17(Fri) 18:25:12|NO.59351

MillkeyStars様のもので回答は十分出ていると思うので回答は控えますが、
リュウ様のスクリプトを見る限り、変数名的にも処理順や書き方的にも
自分がかなり昔にニコニコ動画に投稿した講座動画の内容が原型だと思います。
もしそうであれば、責任を感じます;

あとやはり、既に指摘されていますが、


if(enemy_y(a)>100){

あたりを見る限り
配列変数による複数情報の管理を少し勉強し直せば原因がわかると思います。
この添字で渡している(a)は今回の場合、都合が悪いですね。

今は自身もこのような書き方をしてない上に、推奨していないので、
MillkeyStars様が提示されたスクリプトのように、
分解のしやすさを意識して書けば、 内容が分からなくなっても、
自分で解決できる能力が上がると思います。

何にせよ、自分がプログラミングを初めて間もない頃に書いた乱雑なソースコードなので、
それを発展させて難しいことをするより、それでHSPの基礎を学んだら
自身が見やすいように整形してコーディングされるのが良いかと思います。

質問内容とは全く見当違いの返答になってしまい恐縮な限りですが、
あまりにも責任を感じたので書かざるを得ませんでした…。
もし、このソースコードが自分がUPした講座動画によるものでなければ、
それこそ失礼な物言いになってしまっているので、その場合も、申し訳ありません;



リュウ

リンク

2014/1/17(Fri) 23:08:41|NO.59354

HIJIKI様の仰る通りです;
自分はHIJIKI様の講座を見てスクリプトを書きました。
そこから発展させてちょっとしたゲームを作ろうと試みたのですが、
うまくいかなくなってしまい質問した次第です。

ここに書くことではないですが、謝罪なんてやめてください。
今だってHSPを始めたばかりの人はあなたの講座をみて勉強しています。
コメントには続編を望む声だって多く見受けられます。
自分もあのスクリプトの完成を待ち望んでいる一人でもあるんです。

今から書くことはただの自分の我儘かもしれませんが、あの動画を完結させてください。
あの動画を見て、自分はHSPの基礎を学ぶことができました。
他の初心者の方々も同じです。みんな待っています。
責任を感じる必要なんてないと思います。



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