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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0919
ぱれっとSTG,画面のちらつき改善9未解決


ぱれっと

リンク

2011/9/19(Mon) 11:26:31|NO.41502

こんにちは
少し前に質問させていただいて、
ある程度改善されましたが、まだ画面のちらつきが直らないので質問させていただきました。
シューティングで敵が出てきて、ランダム弾を撃つプログラムです。


みにくいかもしれませんがよろしくお願いします。

buffer 1 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=200 //敵機弾初期化 etamax=640 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 //メインループ *メイン 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*自機 if zkey=1:gosub*自機弾 gosub*敵 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 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),tama_y(cnt) mes"●" pos tama_rx(cnt)-4,tama_ry(cnt)-14 mes"|" pos tama_lx(cnt)-4,tama_ly(cnt)-14 mes"|" } loop redraw 1 return *敵 if frame > 100 { ;フレーム数が100を超えたら、敵を表示 ey = ey+1 ;敵の移動スピード ef=1 ;敵の座高が100行ったらそこでストップ : 敵フラグを立てる if ey > 100 : ey = 100 } return *敵弾 if frame > 250 { gosub*敵弾サーチ if number!=-1{ etamaf(number)==1 etama_x(number)==395.0 etama_y(number)==100.0 etama_vx(number)==-0.5+0.01*rnd(100) etama_vy(number)==1.0+0.01*rnd(100) } } repeat etamax if(etamaf(cnt)==1){ etama_x(cnt)=etama_x(cnt)+etama_vx(cnt) etama_y(cnt)=etama_y(cnt)+etama_vy(cnt) } loop return *敵あたり 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 { ef=0 mmplay 0 } return *敵機表示 if ef=1{ pos ex-20,ey-20 mes"敵" } return *敵弾表示 repeat etamax if(etamaf(cnt)==1){ 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



この記事に返信する


あり

リンク

2011/9/19(Mon) 11:41:30|NO.41504

ちらつきが起こる時はredrawの記述に問題がある場合が多いので
まずはその辺りから調べてみると問題の特定がしやすいと思います。

今回の場合は自機弾表示にあるredraw 1が余分ですね



ぱれっと

リンク

2011/9/20(Tue) 21:34:56|NO.41539

>>ありさん
ちらつき改善しました!ありがとうございました。
また、敵に自機弾が1発当たるごとにHPを5づつ減らしていきたいのですが、1発あたるとずっとHPが-5され続けてしまいます。
どのようにすればいいでしょうか。
未熟な質問ですみません。



あり

リンク

2011/9/21(Wed) 01:04:12|NO.41543

『*敵あたり』のtamaf(cnt) = 0を1にすれば一応目的の動作にはなりますが
こういった単純なミスはこの先も必ず起こりえるので
問題が起こったらまず問題のあると思われる処理に使われている変数の値を
確認する癖をつけた方が良いです(mesで表示させておく等)

また、プログラムの規模が大きくなると他者にミスを発見・指摘してもらう事は
困難になるので、自分でもスクリプトの見直しを常に行うようにして下さいね。
解析が困難なら1から組み直すのも一つの手ですよ。



ぱれっと

リンク

2011/9/21(Wed) 08:24:39|NO.41545

>>ありさん
ありがとうございます。自分でミスに気づけるように心がけていきたいです。
最後に、弾幕の密度を低くするにはどうすればいいでしょうか?やり方が思いつきません。
何度もすみませんが、ご教授ください。



mamo

リンク

2011/9/21(Wed) 08:36:22|NO.41546

弾幕として出されている弾の作られるタイミングを考えれば良いんじゃない?
弾の座標処理は常時行っていく必要はあるものの、弾の生成には間隔をおく。



lltakashill

リンク

2011/9/21(Wed) 16:46:43|NO.41558

ラベルに飛ぶ際に、処理を実行するのを2回に一回とかにしたらどうでしょうか?
例えば、

*start // 変数の初期化 i = 0 *main gosub *syori await 0 goto *main *syori if i != 0 : i = 0 : return     i++ // 処理とか return



ぱれっと

リンク

2011/9/21(Wed) 19:08:08|NO.41570

>>lltakashillさん
実行させていただいたところ、弾の速度は遅くなりましたが密度は変わらなかったように思います。
>>mamoさん
具体的にどう記述するか思いつきません・・・力不足ですみません。



あり

リンク

2011/9/22(Thu) 11:30:22|NO.41598

mamoさんの言う【弾の生成には間隔をおく】と
lltakashillさんの言う【処理を実行するのを2回に一回】
というヒントから【敵弾の発生を2回に一回にする】という解決案が出てきます。
敵弾は既に発射できているのですからどこを変更していけばいいのかは想像できる筈です。

もしこれでも解らないと言うのなら酷な言い方ですが
今のスクリプトを自分で改良していけるだけの実力がまだ備わっていない
と判断できるので、今のスクリプトは一旦置いておいて
まずは弾を一定の間隔を空けて撃つだけのスクリプトを1から作ってみてください。
(やり方はlltakashillさんのサンプルを参考の事)
分からない事を分からないまま進めていっても疑問が増える一方ですし
努力の痕跡が見られない質問を繰り返していては誰からも良い印象も持たれませんので。



mamo

リンク

2011/9/23(Fri) 06:05:56|NO.41601

「弾の発射に条件をつける」と書けばよかったかな。
フラグを立てて条件が一致した時にのみ弾を生成(発射)とか
発射したままで見えない範囲の座標(x座標を大きくマイナス)を与えちゃうとか、手抜き過ぎか;



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