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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1112
ゲームを再スタートするとき8解決


リンク

2015/11/12(Thu) 23:01:04|NO.72972

それなりに出来てきたのですが、ちょっと納得いかないとこがあったので質問させて頂きます。
被弾した後、リプレイするために自機の座標と、各フラグを初期値に戻す作業をしました。
これでもきちんと動くことには動くのですが、自機が、(250,400)の座標のときに被弾すると
上手くいきません。直した後が同じ値になるからかなとも考えたのですが、他の敵と敵弾の
フラグは0にしているので、あたっているわけではないと思うのですが…
わからないので教えて下さい。

あと、メインループのあとの処理が変になってるとおもうので、そこも修正できるようなら
ご指摘お願いします。

;乱数初期化 randomize ;画面作成 screen 0,500,500 title "卒業レポート用" ;変数の確保 jiki_x = 250.0 jiki_y = 400.0 enemy_max = 500 ;自機狙い弾の敵と弾 dim enemy_f,enemy_max ddim enemy_x,enemy_max ddim enemy_y,enemy_max dim e_shot_f,enemy_max ddim e_shot_x,enemy_max ddim e_shot_y,enemy_max ddim e_shot_vx,enemy_max ddim e_shot_vy,enemy_max ;円形弾幕の敵と弾 dim enemy_f2,enemy_max dim enemy_type,enemy_max ddim enemy_x2,enemy_max ddim enemy_vx2,enemy_max ddim enemy_y2,enemy_max dim e_shot_f2,enemy_max ddim e_shot_x2,enemy_max ddim e_shot_y2,enemy_max ddim e_shot_vx2,enemy_max ddim e_shot_vy2,enemy_max frame = 0 ;メインループ *main ;画面の塗りつぶし color 255,255,255 : boxf ;キー入力取得 stick k,15 if k&1:jiki_x-2.0 if k&2:jiki_y-2.0 if k&4:jiki_x+2.0 if k&8:jiki_y+2.0 if k = 128:end ;画面外に出ないようにする処理 if jiki_x>492:jiki_x = 492.0 if jiki_x<8:jiki_x = 8.0 if jiki_y>492:jiki_y = 492.0 if jiki_y<8:jiki_y = 8.0 ;三角の敵出現 if frame\60 = 1 : gosub*enemy_search ;丸の敵出現 if frame\160 = 1 : gosub*enemy_search2 ;自機狙い弾弾発射 repeat enemy_max if enemy_y(cnt) = 100.0{ enemy_num=cnt gosub*e_shot_search } loop ;円形弾幕発射 repeat enemy_max if enemy_x2(cnt) = 250.0 or enemy_x2(cnt) = 260.0{ e_number = cnt gosub *circle_shot_search } loop ;当たり判定 repeat enemy_max ax = jiki_x-enemy_x(cnt) : ay = jiki_y-enemy_y(cnt) ax2 = jiki_x-e_shot_x(cnt) : ay2 = jiki_y-e_shot_y(cnt) ax3 = jiki_x-enemy_x2(cnt) : ay3 = jiki_y-enemy_y2(cnt) ax4 = jiki_x-e_shot_x2(cnt) : ay4 = jiki_y-e_shot_y2(cnt) ax = ax*ax : ay = ay*ay ax2 = ax2*ax2 : ay2 = ay2*ay2 ax3 = ax3*ax3 : ay3 = ay3*ay3 ax4 = ax4*ax4 : ay4 = ay4*ay4 if ax+ay<=16.0 or ax2+ay2<=16.0 or ax3+ay3<=16.0 or ax4+ay4<=16.0{ goto*game_end } loop ;移動と描画 repeat enemy_max if enemy_f(cnt) = 1{ enemy_y(cnt) + 2.0 color 255,0,0 pos enemy_x(cnt)-8.0,enemy_y(cnt)-8.0 mes"▼" } if enemy_y(cnt)>500.0:enemy_f(cnt)=0 if enemy_f2(cnt) = 1{ enemy_x2(cnt)+enemy_vx2(cnt) color 255,0,255 pos enemy_x2(cnt)-8.0,enemy_y2(cnt)-8.0 mes"●" } 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) color 255,0,0 pos e_shot_x(cnt)-8.0,e_shot_y(cnt)-8.0 mes"弾" } if e_shot_f2(cnt) = 1{ e_shot_x2(cnt) = e_shot_x2(cnt) + e_shot_vx2(cnt) e_shot_y2(cnt) = e_shot_y2(cnt) + e_shot_vy2(cnt) color 255,,255 pos e_shot_x2(cnt)-8,e_shot_y2(cnt)-8 mes"★" } if e_shot_x(cnt)>500.0 or e_shot_x(cnt)<0.0 or e_shot_y(cnt)>500.0 or e_shot_y(cnt)<0.0 : e_shot_f(cnt) = 0 if e_shot_x2(cnt)>500.0 or e_shot_x2(cnt)<0.0 or e_shot_y2(cnt)>500.0 or e_shot_y2(cnt)<0.0 : e_shot_f2(cnt) = 0 loop ;自機描画 color 0,0,255 pos jiki_x-8.0,jiki_y-8.0 mes"▲" redraw 1 redraw 0 await 7 frame++ goto*main ;三角の敵の検索 *enemy_search repeat enemy_max if enemy_f(cnt) =0{ enemy_f(cnt) = 1 enemy_x(cnt) = 1.0+rnd(500) enemy_y(cnt) = -8.0 break } loop return ;自機狙い弾の検索 *e_shot_search repeat enemy_max if e_shot_f(cnt) = 0{ e_shot_f(cnt) = 1 e_shot_x(cnt) = enemy_x(enemy_num) e_shot_y(cnt) = enemy_y(enemy_num) t = atan(jiki_y-e_shot_y(cnt),jiki_x-e_shot_x(cnt)) e_shot_vx(cnt) = cos(t) * 2.0 e_shot_vy(cnt) = sin(t) * 2.0 break } loop return ;丸の敵の検索 *enemy_search2 repeat enemy_max if enemy_f2(cnt) =0{ enemy_f2(cnt) = 1 enemy_type(cnt) = cnt\2 if enemy_type(cnt)=0{ enemy_x2(cnt) = -8.0 enemy_vx2(cnt) = 3.0 }else{ enemy_x2(cnt) = 500.0 enemy_vx2(cnt) = -3.0 } enemy_y2(cnt) = 1.0+rnd(270) break } loop return ;円形弾幕の情報を作成 *circle_shot_search g = 50 ;敵一騎が作成する敵弾数 repeat g t2=m_pi*2*cnt/g ;円形弾幕の一つの弾がもつ角度 gosub *e_shot_search2 if number = -1 : break e_shot_x2(number) = enemy_x2(e_number) e_shot_y2(number) = enemy_y2(e_number) e_shot_f2(number) = 1 e_shot_vx2(number) = cos(t2) * 2.0 e_shot_vy2(number) = sin(t2) * 2.0 loop return ;円形弾幕の検索 *e_shot_search2 number = -1 repeat enemy_max if e_shot_f2(cnt) = 0:number = cnt:break loop return ;被弾した時の処理 *game_end dialog "REPLAY?",2,"GAME OVER" if stat = 6 :goto*start if stat = 7 : end ;リプレイするときに自機の座標と各フラグを初期値に戻す *start jiki_x = 250.0 : jiki_y = 400.0 repeat enemy_max enemy_f(cnt) = 0 enemy_f2(cnt) = 0 e_shot_f(cnt) = 0 e_shot_f2(cnt) = 0 loop goto*main



この記事に返信する


暇人

リンク

2015/11/12(Thu) 23:48:34|NO.72973

>;当たり判定
>repeat enemy_max

>ax = jiki_x-enemy_x(cnt) : ay = jiki_y-enemy_y(cnt)
>ax2 = jiki_x-e_shot_x(cnt) : ay2 = jiki_y-e_shot_y(cnt)

敵や弾が生きてるか関係なく判定してるから
再開時に初期化されてない弾や敵の座標と当り判定されて又死ぬ

後repeat〜loop間にgotoで外に出ると
repeatから抜けた事にはならない
> goto*game_end
> }
>loop
このgoto*game_endを32回繰り返すとエラーになる
必ずbreakで抜ける必要がある



リンク

2015/11/13(Fri) 00:07:55|NO.72974

暇人さんありがとうございます。
失礼ながらもう少し詳しく教えてくれるととても助かります。
前者のは、当たり判定の処理のどこかにif文で敵や弾が生存しているかどうか確認しなきゃいけないという
ことでしょうか?
後者は、if ax+ay<=16.0 or ax2+ay2<=16.0 or ax3+ay3<=16.0 or ax4+ay4<=16.0のif文の中に
breakを入れて抜けるということでしょうか?
せっかく教えてくださったのに理解が足りず、申し訳ありません。



y.tack

リンク

2015/11/13(Fri) 00:36:20|NO.72975

repeat中returnの仕様は
forを使うことで回避できますよー


*begin for i,0,10,1 ii++ logmes ""+ii await 1 goto *begin next



リンク

2015/11/13(Fri) 01:12:05|NO.72976

y.tackさんありがとうございます。
質問なのですが、for〜nextとrepeat〜loopの違いがイマイチわかりません。
一体何が違うんでしょうか?また、forとnextを使うことで、今回のこの事態をどう解決できるのでしょうか?



y.tack

リンク

2015/11/13(Fri) 01:31:24|NO.72978

repeat と loop
は構文で
for と next は
マクロです

構文は順々にhogehogeを積んでいって
積んでいくので 積み過ぎるとよろしくないでしょ

forとnextはマクロなので
何番目のnextへジャンプ!と
直接的にジャンプするかんじです

ってコレじゃあわからないですよね
でもそのうち この仕様が変更されて
repeatの途中でreturnしても大丈夫という噂ですw



y.tack

リンク

2015/11/13(Fri) 01:35:26|NO.72979

>どう解決できるのでしょう
たぶんこんなかんじw

for i,0,enemy_max,1 ax = jiki_x-enemy_x(i) : ay = jiki_y-enemy_y(i) ax2 = jiki_x-e_shot_x(i) : ay2 = jiki_y-e_shot_y(i) ax3 = jiki_x-enemy_x2(i) : ay3 = jiki_y-enemy_y2(i) ax4 = jiki_x-e_shot_x2(i) : ay4 = jiki_y-e_shot_y2(i) ax = ax*ax : ay = ay*ay ax2 = ax2*ax2 : ay2 = ay2*ay2 ax3 = ax3*ax3 : ay3 = ay3*ay3 ax4 = ax4*ax4 : ay4 = ay4*ay4 if ax+ay<=16.0 or ax2+ay2<=16.0 or ax3+ay3<=16.0 or ax4+ay4<=16.0{ goto*game_end } next



暇人

リンク

2015/11/13(Fri) 18:59:43|NO.72984

>>NO.72974
>前者のは、当たり判定の処理のどこかにif文で敵や弾が生存して
>いるかどうか確認しなきゃいけないという
> ことでしょうか?

>ax4+ay4<=16.0のif文の中に
>breakを入れて抜けるということでしょうか?

それでOK
とりあえず試して欲しかったな・・・

>せっかく教えてくださったのに理解が足りず、申し訳ありません。
理解できてますよ・・・



リンク

2015/11/13(Fri) 23:25:27|NO.73001

おふたりともありがとうございました



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