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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1029
ぱれっとSTG 円形弾幕6解決


ぱれっと

リンク

2011/10/29(Sat) 23:13:56|NO.42723

こんにちは。
少し前にも質問させていただきましたが、また質問させてください。

敵が渦巻き→円形弾と打ってくるようにしたいのですが、円形弾が少しおかしな形になってしまいます。
自分は実力不足故質問させていただきました。何度もレベルの低い質問すみません。
ご教授お願いします

#define window_x 800 //画面の大きさ X座標 #define window_y 600 //画面の大きさ Y座標 screen 0,window_x,window_y dbry=0//弾幕の種類 frame=0 //自機座標 x=244 y=450 xf=1 //自機弾初期化 tamax=10 dim tamaf,tamax//存在フラグ dim tama_x,tamax dim tama_y,tamax dim tama_rx,tamax dim tama_ry,tamax dim tama_lx,tamax dim tama_ly,tamax //敵機座標 ex=244.0 ey=-50.0 //敵機弾初期化 etamax=1000 dim etamaf,etamax dim etama_x,vartype("double"),etamax dim etama_y,vartype("double"),etamax dim etama_vx,vartype("double"),etamax dim etama_vy,vartype("double"),etamax ehp=1000 ssp=5 ;スクロール速度 scr=0 //メインループ *メイン redraw 0 color 255,255,255 boxf frame=frame+1 pos 500,25 color 0,0,0 mes frame pos 500,50 mes ehp getkey zkey , 90 gosub*自機 if zkey=1:gosub*自機弾 gosub*敵 if dbry=1:gosub*渦巻き弾 if dbry=2 : gosub*円形弾幕 gosub*敵弾表示 gosub*敵機表示 gosub*敵あたり redraw 1 await 10 goto*メイン *自機 //自機移動処理 stick key,31 if key & 1:x-speed if key & 2:y-speed if key & 4:x+speed if key & 8:y+speed if xf!=0{ pos x-10,y-31 mes"自" } //低速移動処理 stick tkey,64 if tkey=64 : speed=2 if tkey=0 : speed=8 *自機弾 //自機弾処理 if zkey=1 { if shottime=0 { shottime=5 repeat tamax if tamaf(cnt)=0{ tama_x(cnt)=x tama_y(cnt)=y-30 tama_rx(cnt)=x+20 tama_ry(cnt)=y-30 tama_lx(cnt)=x-20 tama_ly(cnt)=y-30 tamaf(cnt)=1 break } loop } else { shottime-- } } //自機弾の移動 repeat tamax if tama_y(cnt) < 0 : tamaf(cnt) = 0 if tama_ry(cnt) < 0 : tamaf(cnt) = 0 if tama_ly(cnt) < 0 : tamaf(cnt) = 0 if tamaf(cnt)=1{ tama_y(cnt)-=10//弾同士の間隔が20ピクセル tama_ry(cnt)-=10 tama_ly(cnt)-=10 if tama_y(cnt)<-1000{ tamaf(cnt)=0 } } loop //自機弾表示 repeat tamax if tamaf(cnt)=1{ pos tama_x(cnt)-4,tama_y(cnt)-14 mes"i" pos tama_rx(cnt)-4,tama_ry(cnt)-14 mes"||" pos tama_lx(cnt)-4,tama_ly(cnt)-14 mes "|||" } loop *敵 if frame > 100 { ;フレーム数が100を超えたら、敵を表示 ey = ey+1 ;敵の移動スピード ef=1 ;敵の座高が100行ったらそこでストップ : 敵フラグを立てる if ey > 100.0 : ey = 100.0:ef=2:dbry=1 } return *渦巻き弾 if frame\2 ==1{ if ef=2{ if dbry=1{ g=10 t1=0.1+t1 if(t1>t):t1=t*2 t2=0.0+t1+t2 if(t2>t):t2=t*2 trnd=0.001*rnd(3142)//安置防止 repeat g t = m_pi*2*cnt / g+t1 gosub*敵弾サーチ if(number !=-1){ //弾の発射 etama_x(number)=ex-10 etama_y(number)=ey etamaf(number)=1 etama_vx(number)=cos(t)*0.3 etama_vy(number)=sin(t)*0.3 gosub*敵弾移動 if frame>700 : dbry=2 :etamaf(cnt)=0 } loop } } } *円形弾幕 if frame>750{ if frame\60=0{ if ef=2{ g=30 repeat g t = m_pi*2*cnt/g gosub*敵弾サーチ if(number !=-1){ etama_x(number)=ex etama_y(number)=ey etamaf(number)=1 etama_vx(number)=cos(t)*2.0 etama_vy(number)=sin(t)*2.0 gosub*敵弾移動 } loop } } } *敵弾移動 repeat etamax if etamaf(cnt)!=0 { etama_x(cnt)=etama_x(cnt)+etama_vx(cnt) etama_y(cnt)=etama_y(cnt)+etama_vy(cnt) if(etama_x(cnt)<-2 || etama_y(cnt)<-2 || etama_x(cnt)>450 || etama_y(cnt)>600 ):etamaf(cnt) == 0 } loop *自機あたり if xf=1{ dx = x - etama_x : dy = y - etama_y dx*=dx : dy*=dy if(dx + dy <=100){ mmplay 0 etamaf=1 xf=0 } } *敵あたり edx = ex - tama_x : edy = ey - tama_y edx*=edx : edy*=edy if(edx + edy <=100){ tamaf=1 ehp=ehp-50 } if ehp<=0 { ehp=0 ef=0 } *敵機表示 if ef!=0{ pos ex-20,ey-20 mes "敵" } return *敵弾表示 repeat etamax if etamaf(cnt)!=0{ pos etama_x(cnt)-6,etama_y(cnt)-8 mes"○" } loop return *敵弾サーチ number = -1 repeat etamax if(etamaf(cnt)!=1) :number=cnt:break loop return



この記事に返信する


skyblue

リンク

2011/10/30(Sun) 09:01:54|NO.42727

インデントがめちゃくちゃ
自機関係は不必要
gosubにするのだったらラベル処理終了後にreturnを入れること
入れ忘れとも見えるとこがありました
>円形弾が少しおかしな形になってしまいます。
どこがだめなのかわからない

#define window_x 800 //画面の大きさ X座標 #define window_y 600 //画面の大きさ Y座標 screen 0,window_x,window_y dbry=0//弾幕の種類 frame=0 //敵機座標 ex=244.0 ey=-50.0 //敵機弾初期化 etamax=1000 dim etamaf,etamax dim etama_x,vartype("double"),etamax dim etama_y,vartype("double"),etamax dim etama_vx,vartype("double"),etamax dim etama_vy,vartype("double"),etamax ehp=1000 ssp=5 ;スクロール速度 scr=0 //メインループ *メイン repeat redraw 0 color 255,255,255 boxf frame=frame+1 pos 500,25 color 0,0,0 mes frame pos 500,50 mes ehp gosub*敵 if dbry=1:gosub*渦巻き弾 if dbry=2 : gosub*円形弾幕 gosub*敵弾表示 gosub*敵機表示 gosub*敵あたり redraw 1 await 10 loop stop *敵 if frame > 100 { ;フレーム数が100を超えたら、敵を表示 ey = ey+1 ;敵の移動スピード ef=1 ;敵の座高が100行ったらそこでストップ : 敵フラグを立てる if ey > 100.0 : ey = 100.0:ef=2:dbry=1 } return *渦巻き弾 if frame\2 ==1{ if ef=2{ if dbry=1{ g=10 t1=0.1+t1 if(t1>t):t1=t*2 t2=0.0+t1+t2 if(t2>t):t2=t*2 trnd=0.001*rnd(3142)//安置防止 repeat g t = m_pi*2*cnt / g+t1 gosub*敵弾サーチ if(number !=-1){ //弾の発射 etama_x(number)=ex-10 etama_y(number)=ey etamaf(number)=1 etama_vx(number)=cos(t)*0.3 etama_vy(number)=sin(t)*0.3 gosub*敵弾移動 if frame>700 : dbry=2 :etamaf(cnt)=0 } loop } } } return *円形弾幕 if frame>750{ if frame\60=0{ if ef=2{ g=30 repeat g t = m_pi*2*cnt/g gosub*敵弾サーチ if(number !=-1){ etama_x(number)=ex etama_y(number)=ey etamaf(number)=1 etama_vx(number)=cos(t)*2.0 etama_vy(number)=sin(t)*2.0 gosub*敵弾移動 } loop } } } return *敵弾移動 repeat etamax if etamaf(cnt)!=0 { etama_x(cnt)=etama_x(cnt)+etama_vx(cnt) etama_y(cnt)=etama_y(cnt)+etama_vy(cnt) if(etama_x(cnt)<-2 || etama_y(cnt)<-2 || etama_x(cnt)>450 || etama_y(cnt)>600 ):etamaf(cnt) == 0 } loop return *敵あたり edx = ex - tama_x : edy = ey - tama_y edx*=edx : edy*=edy if(edx + edy <=100){ tamaf=1 ehp=ehp-50 } if ehp<=0 { ehp=0 ef=0 } return *敵機表示 if ef!=0{ pos ex-20,ey-20 mes "敵" } return *敵弾表示 repeat etamax if etamaf(cnt)!=0{ pos etama_x(cnt)-6,etama_y(cnt)-8 mes"○" } loop return *敵弾サーチ number = -1 repeat etamax if(etamaf(cnt)!=1) :number=cnt:break loop return



skyblue

リンク

2011/10/30(Sun) 09:38:08|NO.42728

連投失礼


dim etama_x,vartype("double"),etamax dim etama_y,vartype("double"),etamax dim etama_vx,vartype("double"),etamax dim etama_vy,vartype("double"),etamax



ddim etama_x,etamax ddim etama_y,etamax ddim etama_vx,etamax ddim etama_vy,etamax
に変更



pizza

リンク

2011/10/30(Sun) 11:13:09|NO.42729

skyblueさんが修正された方を実行したら、問題点がみえてきますね。

dbryが2になっても1に上書きしている部分があります。

gosub*敵弾移動はmainのgosub*敵弾表示のまえあたりで一度だけ実行、
渦巻き弾の速度を1.3ぐらいにする。

で、どうですか?



ぱれっと

リンク

2011/10/30(Sun) 18:54:05|NO.42752

>>pizzaさん
回答ありがとうございます
だいぶ改善されました
円形のとき右斜め上の方向に余分に弾が行ってしまい、右に弾ひとつ分のスペースができてしまうのですが、
どこが悪いでしょうか



pizza

リンク

2011/10/30(Sun) 21:23:34|NO.42753

skyblueさんのアドバイスの中の↓をもう一度見直してみてください。

>gosubにするのだったらラベル処理終了後にreturnを入れること

あと↓は修正しましたか?

if ey > 100.0 : ey = 100.0:ef=2:dbry=1



ぱれっと

リンク

2011/11/2(Wed) 21:04:16|NO.42790

>>skyblueさん
>>pizzaさん
ありがとうございました
おかげさまで改善されました
また機会があったらよろしくお願いします



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