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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0226
PCオタ歪な弾幕になる。5解決


PCオタ

リンク

2007/2/26(Mon) 21:40:28|NO.5931

はじめまして、PCオタ(って言われた)です。
HSPでシューティングゲームを作っています。
そして、きれいな円状に広がる、敵弾幕を作っています。
しかし、なぜか歪なヘンな弾幕になります。
ヘンな弾幕といいますと、円状ではなく多角形の弾幕になります。

これが問題だと思われるスプリクト 1

;敵弾出現処理 *EnBuAppear foreach enlife:ecnt=cnt if enlife(ecnt)>0&&stime=0{ foreach enbulife if enbulife(cnt)=0{ enbulife(cnt)=enf(1,ecnt)+1 enbuf(cnt)=enf(2,ecnt) switch enbulife(cnt) case 1 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 case 3 if buc<=36:enbux(cnt)=enx+9:enbuy(cnt)=eny+29 if buc>36:enbux(cnt)=enx+117:enbuy(cnt)=eny+29 d=buc\36*10 enbuv(cnt)=rd*d:enbusp(cnt)=10 bobup++:if bobup>=3200:bobup=0:enf(1)++:if enf(1)>=3:enf(1)=0 buc++ if buc>72:stime=20:break swbreak swend } loop } loop buc=0 stime-- return
ええと、これを説明しますと、rdは円周率÷180のcos,sinのための変数で360度をラジアンにする
ものです。
enbuvに敵弾の移動する方向で、enbuspの方は速度です。

そして、移動させる処理が

;敵弾移動処理 *EnBuMove foreach enbulife if enbulife(cnt)>=1{ enbux(cnt)+cos(enbuv(cnt))*enbusp(cnt) enbuy(cnt)+sin(enbuv(cnt))*enbusp(cnt) 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 } loop return

中学生の分際で三角関数とやらを使っています。
たぶん、ここには問題はないと思いますが一応。



この記事に返信する


ふほ

リンク

2007/2/27(Tue) 01:41:09|NO.5933

スクリプトは、出来れば実際に動作するように整えてもらえると、助かります。
内容を読む上で、動作するかしないかは、心理的に大分違うんです><

実際に動かして検証できないと、正しく読めているかどうかの自信もぐらつきますし(笑

で、ぱっと流れを見て、やろうとしていると思われる内容を汲んでサンプル作ってみました。
機能毎に分けてあるので、参考にしてみてください。

なにせ、どのように歪な弾幕になるのかがよく分からないので・・・・
大雑把にしかスクリプトを読んでないので、これ以上は言えません(笑

主要部分は真似たつもりですが、とりあえずこのスクリプトでは意図したようには動くようです。

PI=3.141592 dim c,100 dimtype x,vartype("double"),100 dimtype y,vartype("double"),100 dimtype v,vartype("double"),100 dimtype s,vartype("double"),100 a=0.0 *loop1 ;発生 foreach c if c( cnt ) = 0 { c( cnt ) = 1 x( cnt ) = 320.0 y( cnt ) = 250.0 v( cnt ) = a * ( PI / 180.0 ) s( cnt ) = 5.0 a += 10.0 if a >= 360.0 : a -= 360.0 break } loop ;移動 foreach c if c( cnt ) = 1 { x( cnt ) += cos( v( cnt ) ) * s( cnt ) y( cnt ) += sin( v( cnt ) ) * s( cnt ) if x( cnt ) < 0.0 : c( cnt ) = 0 if x( cnt ) > 640.0 : c( cnt ) = 0 if y( cnt ) < 0.0 : c( cnt ) = 0 if y( cnt ) > 480.0 : c( cnt ) = 0 } loop ;描画 redraw 0 color 0 , 0 , 0 boxf 0 , 0 , 640 , 480 foreach c if c( cnt ) = 1 { color 255,255, 0 circle x( cnt ) - 2 , y( cnt ) - 2 , x( cnt ) + 2 , y( cnt ) + 2 } loop redraw 1 await 10 getkey esc,27 : if esc=0 : goto *loop1



naznyark

リンク

2007/2/27(Tue) 02:00:02|NO.5934

> スクリプトは、出来れば実際に動作するように整えてもらえると、助かります。

私も同感です。


> ヘンな弾幕といいますと、円状ではなく多角形の弾幕になります。

この症状とスクリプトの断片から推測すると
弾の座標を入れる変数が整数型になっているのではないかと思います。
もしそうなら座標も実数型変数で管理してください。



KIMU

リンク

2007/2/27(Tue) 02:06:22|NO.5935

やってる事自体はは間違ってない

>たぶん、ここには問題はないと思いますが一応。
そこが一番怪しいんだけど・・・

> enbux(cnt)+cos(enbuv(cnt))*enbusp(cnt)
> enbuy(cnt)+sin(enbuv(cnt))*enbusp(cnt)

ここで使ってるenbux、enbuyは実数の配列として初期化出来てる?
実数型(ddim)で確保してない場合
整数型変数+実数型数値
って書き方すると int(実数型数値) と同等の処理になって小数点以下が無くなる

多分enbuvも整数型で確保してそうだけど
> enbuv(cnt)=rd*d:enbusp(cnt)=10
一番最初にここを通る時に、enbuvが実数で再確保されてるから角度は正常に渡されてると思う
(デバッグウィンドウを表示する設定にして変数を見てみれば分かる)


//実数型と整数型の動作テスト rd=3.1415/180 ddim x,36 ddim y,36 xx=200 gosub *poset pos xx,0:color :mes "実数型・" gosub *rmov xx=400 pos xx,0:color 255:mes "整数型・" dim x,36 dim y,36 gosub *poset gosub *rmov stop *rmov repeat 360*4 rr=cnt\36*10 r=rd*rr x(cnt\36)+sin(r)*5 y(cnt\36)+cos(r)*5 pos x(cnt\36),y(cnt\36) mes "・" if (cnt\36)=0{wait 1} loop return *poset repeat 36 x(cnt)+xx y(cnt)+240 loop return



ふほ

リンク

2007/2/27(Tue) 08:21:38|NO.5936

>整数型

はっ、そうかw



PCオタ

リンク

2007/2/27(Tue) 14:45:31|NO.5938

> スクリプトは、出来れば実際に動作するように整えてもらえると、助かります。

すいません、今後気をつけます。

> 弾の座標を入れる変数が整数型になっているのではないかと思います。
> もしそうなら座標も実数型変数で管理してください。

言われたとおりに実数型にしたら、出来ました。
ありがとうございます。



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