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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0821
ぱれっとSTGの敵弾発射18未解決


ぱれっと

リンク

2011/8/21(Sun) 18:35:54|NO.40751

まだまだ初心者なのでスクリプトが見にくいかったり、無知だったりすると思いますが質問させてください。
STGを作っているのですが、敵の処理がうまくできません。
frameが100になったら敵はストップし、そこからとりあえず、まっすぐ弾を撃つ、というようにしたいのですがうまくいきません。
敵はストップするのですが、そこから思ったように弾を発射してくれません。
あと、画面のちらつきも激しいです。
ご教授ください


frame=0 //自機座標 x=400 y=450 //自機弾初期化 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=400 ey=-50 etama_x=400 etama_y=100 etama_vx=15 etama_vy=-15 //敵機弾初期化 etamax=640 dim etamaf,etamax dim etama_x,etamax dim etama_y,etamax dim etama_vx,etamax dim etama_vy,etamax ehp=1000 //メインループ *main redraw 0 color 255,255,255 boxf frame=frame+1 pos 0,0 color 0,0,0 mes frame pos 400,25 mes ehp getkey zkey , 90 gosub*jikiidou if zkey=1:gosub*jikishot gosub*tekisyori gosub*tekiatari redraw 1 await 10 goto*main *tekisyori if frame>100 { ey=ey+1 if ey>100:ey=100:etamaf=1:gosub*tekitama pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70 } return //敵弾処理 *tekitama repeat etamax etamaf(cnt)==1 etama_y(cnt)=etama_y+rnd(5) pos etama_x(cnt),etama_y(cnt) loop gmode 2,45,40 gcopy 1,50,70 return



この記事に返信する


backdrop

リンク

2011/8/21(Sun) 20:50:44|NO.40757

この状態で載せられてもそのまま実行できないってことわかるよね?
こちらは何の予兆もなく書き込み見てるんだから載せるんだったら全部載せるか適当なうpろだに上げてくれ。



ぱれっと

リンク

2011/8/22(Mon) 00:07:53|NO.40764

backdropさんすみませんでした。貼りなおさせていただきます。

dialog "フルスクリーンで起動しますか?",2,"Config" if stat=6:screenmode=0 if stat=7:screenmode= 1 buffer 1 picload "player_sakuya.bmp" mmload "graze.wav",1 mmload "nc899.wav" , 0 screen 0,800,600 frame=0 //自機座標 x=400 y=450 //自機弾初期化 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=400 ey=-50 etama_x=400 etama_y=100 etama_vx=15 etama_vy=-15 //敵機弾初期化 etamax=640 dim etamaf,etamax dim etama_x,etamax dim etama_y,etamax dim etama_vx,etamax dim etama_vy,etamax ehp=1000 //メインループ *main redraw 0 color 255,255,255 boxf frame=frame+1 pos 0,0 color 0,0,0 mes frame pos 400,25 mes ehp getkey zkey , 90 gosub*jikiidou if zkey=1:gosub*jikishot gosub*tekisyori gosub*tekiatari redraw 1 await 10 goto*main *jikiidou //自機移動処理 stick key,31 if key & 1:x-speed if key & 2:y-speed if key & 4:x+speed if key & 8:y+speed pos x-10,y-31 gmode 2,21,63 gcopy 1 //低速移動処理 stick tkey,64 if tkey=64 : speed=2 if tkey=0 : speed=8 *jikishot //自機弾処理 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 gmode 2,12,16 gcopy 1,73,13 pos tama_rx(cnt)-4,tama_ry(cnt)-14 gmode 2,12,16 gcopy 1,73,13 pos tama_lx(cnt)-4,tama_ly(cnt)-14 gmode 2,12,16 gcopy 1,73,13 } loop redraw 1 return *tekisyori if frame>100 { ey=ey+1 if ey>100:ey=100:etamaf=1:gosub*tekitama pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70 } return //敵弾処理 *tekitama repeat etamax etamaf(cnt)==1 etama_y(cnt)=etama_y+rnd(5) pos etama_x(cnt),etama_y(cnt) loop gmode 2,45,40 gcopy 1,50,70 return *tekiatari edx = ex - tama_x(cnt) : edy = ey - tama_y(cnt) edx*=edx : edy*=edy if(edx + edy <=100){ tamaf(cnt)=0 ehp=ehp-5 } if ehp<=0 { ehp=0 mmplay 0 } return



ミント

リンク

2011/8/22(Mon) 14:41:39|NO.40770

どうもこんにちは。


1:
まず素で実行すると「pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70」がおかしいせいで実行できません。
これは間に「:」を入れてないのが原因です。

2:
次に画像とサウンド?データがこちらに無いのでエラーが出ます。
「picload、mmload、mmload」の前に「//」などのコメントでエラーが出ないようにできるのですが・・・
それだと画面が真っ白になって何が起きているのかわからないので、自前の画像でなんとか処理を見れました。

もし他人に説明する場合は・・・
「color 255,255,255 : pos myx,myy : mes "自" 」
「color 255 : pos TKx,TKy : mes "敵"」
とかにすればわかりやすくなります。

3:
今は「自機移動」「自機弾」は必要がない情報なので(誰かに見せる場合は)消しておくとソースが見やすくなります。
後「*jikiidou」などのラベル名は日本語の方が見やすいです。

4:
自機の管理を「x=400」とかにしてしまうと、
何か不具合あったとき「x」を検索すると色々ひっかかるので別の変数名の方がいいです。
(コメント検索で「自機」とやっても「自機弾」とかにひっかかる)



>>あと、画面のちらつきも激しいです。
これはラベルにジャンプ後の終了時に「return」を入れてないからです(83行目)

>>そこからとりあえず、まっすぐ弾を撃つ、
これは「etama_x」に何も指定してないせいですね。
etama_x(cnt) = ex - 20 ;敵弾の位置
と置くだけで、敵の位置に弾が出ると思います。



ぱれっと

リンク

2011/8/22(Mon) 21:02:35|NO.40796

>>まず素で実行すると「pos ex-20,ey-20 gmode 2,40,40 gcopy 1,0,70」がおかしいせいで実行できません。
これは間に「:」を入れてないのが原因です。
こちらのコピペミスでしたスミマセン
>>これはラベルにジャンプ後の終了時に「return」を入れてないからです(83行目)
そこにreturnを入れると弾が発射されませんでした。
ちらつくのは敵と敵弾だけなので、自機は関係ないと思います。
>>これは「etama_x」に何も指定してないせいですね。
etama_x(cnt) = ex - 20 ;敵弾の位置
と置くだけで、敵の位置に弾が出ると思います。

弾のx座標はうまくいきましたが、今度はy座標が敵の位置から発射されず、一番上から発射されてしまいます。
たびたびスミマセンが、ご教授ください。



who

リンク

2011/8/22(Mon) 22:34:12|NO.40805

もうこれでいいじゃん。

mpx=300.0 mpy=300.0 ddim mtx,30 ddim mty,30 ddim tpx,30 ddim tpy,30 mtw=10 repeat 10 mtx(cnt)=-100.0 mty(cnt)=-100.0 loop repeat 30 tpx(cnt)=1.0*rnd(640) tpy(cnt)=0.0-1.0*rnd(480) loop *main redraw 1 await 20 redraw 0 color 0,0,0 boxf color 255,255,255 stick ky,1+2+4+8+16 if (ky&1)=1{mpx-=4.0} if (ky&2)=2{mpy-=4.0} if (ky&4)=4{mpx+=4.0} if (ky&8)=8{mpy+=4.0} repeat 10 if (ky&16)=16 & mtw<0 & mty(cnt)<-20.0{ mtx(cnt)=mpx mty(cnt)=mpy-10 mtw=10 } mty(cnt)-=5.0 loop mtw-- repeat 30 tpy(cnt)+=2.0 if tpy(cnt)>640.0{ tpx(cnt)=1.0*rnd(640) tpy(cnt)=0.0-1.0*rnd(480) } loop repeat 10:m=cnt repeat 30:t=cnt if mtx(m)<tpx(t)+20 & tpx(t)<mtx(m)+20 & mty(m)<tpy(t)+20 & tpy(t)<mty(m)+20 { mty(m)=-200.0 mtx(m)=-200.0 tpx(t)=1.0*rnd(640) tpy(t)=0.0-1.0*rnd(480) SCORE+=10 } loop loop pos mpx,mpy mes "自" repeat 10 pos mtx(cnt),mty(cnt) mes "□" loop repeat 30 pos tpx(cnt),tpy(cnt) mes "◎" loop pos 0,0 mes "SCORE:"+SCORE goto*main



ミント

リンク

2011/8/23(Tue) 09:19:37|NO.40815

>>そこにreturnを入れると弾が発射されませんでした。
>>ちらつくのは敵と敵弾だけなので、自機は関係ないと思います。
あ、いやラベルが戻らないうちに、ラベルに入るのはよくないので「return」を入れたほうがいいという意味です。
っていうか自機弾あったんですね・・・最初気がついたのですが、消してしまったようです (´・ω・`)

} else { shottim} } }
の後に「return」入れる。

>>*自機弾の移動
>>//自機弾の移動
>> repeat tamax
の上に「*自機弾の移動」などのラベルを入れる。
後は「gosub」を入れればチカチカしないはずだよ。

gosub*tekisyori
gosub*tekiatari
gosub*自機弾の移動

正常作動するかはわからんが(細かい不具合)とりあえずっということで。



>>弾のx座標はうまくいきましたが、今度はy座標が敵の位置から発射されず、
>>一番上から発射されてしまいます
あぁ・・・一番上から出るのが仕様かと思ってました。
「etama_x(cnt) = ex」
っというのは「敵の弾x = 敵の座高x」を入れてあげているのです。
敵の座高が400だった場合「敵の弾x = 400」が入るのをわかればYも出来るはずです。

ちなみにこのままやると、敵玉が下に動かないですね。



簡単ながらソースを元に改造してみた(ただし見せる用ではないので、見づらいはデフォ)

screen 0,800,600 ;ウィンドウを初期化 frame = 0 ;フレーム数 //自機座標 myx = 400 : myy = 450 //敵機座標 ex = 400 : ey = -50 //敵機弾初期化 etamax = 640 dim etamaf,etamax ;敵のフラグ dim etama_x,etamax ;敵弾X dim etama_y,etamax ;敵弾Y ;*************メインループ************** *メイン redraw 0 : color 0,0,0 : boxf ;**************カウンター*************** frame = frame + 1 ;フレーム数 color 255,0,0 pos 0,0 : mes "フレーム数 " + frame pos 0,20 : mes "敵のy " + ey ;*************************************** gosub*敵の処理 ;自機表示 color 255,255,255 : pos myx-10,myy-31 : mes "自" ;自機表示 redraw 1 : await 10 goto*メイン ;***************敵の処理**************** *敵の処理 if frame > 100 { ;フレーム数が100を超えたら、敵を表示 ey = ey+1 ;敵の移動スピード ;敵の座高が100行ったらそこでストップ : 敵フラグを立てる if ey > 100 : ey = 100 : etamaf = 1 : gosub*敵弾処理 color 255 : pos ex-20,ey-20 : mes "敵" ;敵表示 } return ;**************敵弾処理***************** *敵弾処理 repeat etamax ;640 if etamaf(cnt) == 0 { ;敵のフラグ etama_x(cnt) = ex - 20 ;敵弾のx位置 etama_y(cnt) = ey - 20 ;敵弾のy位置 etamaf(cnt) == 1 ;敵のフラグ } etama_y(cnt) += 1 ;敵弾のスピード if etama_y(cnt) >= 600 : etama_y(cnt) = 0 ;敵弾が一番下までいったら、上に戻す pos etama_x(cnt),etama_y(cnt) ;敵弾表示 loop ;敵弾描画 color ,255 : mes "敵弾" ;敵弾表示 return



ぱれっと

リンク

2011/8/26(Fri) 19:22:16|NO.40882

backdropさんは冷やかしだったみたいですね^^;



who

リンク

2011/8/26(Fri) 19:49:31|NO.40883

>>ぱれっとさん
自分が悪いんだろw



てれてれ

リンク

2011/8/26(Fri) 20:16:09|NO.40884

>backdropさんは冷やかしだったみたいですね^^;
久しぶりにイラっときた。



ミント

リンク

2011/8/27(Sat) 08:29:31|NO.40889

ところで解決したのですか?
ソース解読に時間がかかってたと思ってたのですが・・・
回答してくれた人たちがかわいそうですよ・・・(´・ω・`)



ぱれっと

リンク

2011/8/27(Sat) 13:34:41|NO.40891

>>てれてれさん、whoさん
上のぱれっとは私ではありません。成りすましです。
>>ミントさん
諸事情で遅れました。すみませんでした。ミントさんが指摘してくれたところを修正してみました。
敵弾は敵の位置から発射されましたが、それとは別に弾が画面左からも発射されてしまいます。
また、2発目以降の敵弾が上から出てきてしまいます。
また、ちらつきのほうも
>>*自機弾の移動
>>//自機弾の移動
>> repeat tamax
>>の上に「*自機弾の移動」などのラベルを入れる。
>>後はgosubを使えばちらつかないはず
やってみましたがうまくいきませんでした。
ちらつきがどちらかというと悪化したようになりました。

最後に2度目になりますが上にある
>>ぱれっと
>>backdropさんは冷やかしだったみたいですね^^;
これは私ではありません。


返答遅れてしまいすみませんでした。
深くお詫び申し上げます。



KA

リンク

2011/8/27(Sat) 14:11:49|NO.40892

>>最後に2度目になりますが上にある

分る人には分りますよ。



ぱれっと

リンク

2011/8/30(Tue) 21:31:27|NO.40963

まだ解決できていないのでご教授お願いしたいです。 



てれてれ

リンク

2011/8/30(Tue) 22:34:25|NO.40964

>まだ解決できていないのでご教授お願いしたいです。 
なんでミントさんが素晴らしいサンプルを作ってくださったのに無視してるんですか?
というかなんでミントさんのレス全部スルーしてるんですか?
この素晴らしいスクリプトを参考にすれば実装はそんなに困難じゃないですよね?
スクリプトに理解できなかった部分があるなら
理解できなかった部分をもっと具体的に質問するべきじゃないんですか?



れみはる

リンク

2011/8/31(Wed) 11:00:29|NO.40975

ぱれっとさんは自分で少しひねって考えたり工夫してみては?
皆さんのレスを読めば、よほど数学が苦手でない限りは分かると思います。



追記
i114-183-158-106.s05.a012.ap.plala.or.jp
上がってるスレッドから特定しようとしても見つからない(´・ω・`)



ぱれっと

リンク

2011/8/31(Wed) 18:42:47|NO.40984

>>てれてれさん
ミントさんのスクリプは実行しましたし、ミントさんに返事も返しました。
上を見てください。
実行してみるとやはり敵が出てきて弾を発射するところでちらつきがひどくなります。
また、弾が敵からの発射とは別に画面左からも出てきてしまいます。


>>i114-183-158-106.s05.a012.ap.plala.or.jp
>>上がってるスレッドから特定しようとしても見つからない(´・ω・`)
どういうことでしょうか?
無知ですみません



れみはる

リンク

2011/8/31(Wed) 21:36:08|NO.40987

>>ぱれっとさん #40984
>>>てれてれさん
>ミントさんのスクリプは実行しましたし、ミントさんに返事も返しました。
>(略)
そういう問題ではなくて、ミントさんたちがくれたヒントを元に自分でも考えろということではないでしょうか?


>>>i114-183-158-106.s05.a012.ap.plala.or.jp
>>>上がってるスレッドから特定しようとしても見つからない(´・ω・`)
>どういうことでしょうか?
なりすましの特定です。スルーでOKです



引用符多くなって見難くてすんません



ぱれっと

リンク

2011/9/3(Sat) 03:56:02|NO.41034

>>れみはるさん
わかりました。皆さんの回答を下に自分でがんばってみます。ありがとうございました。



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