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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0422
rooxs先読み弾を作りたい3未解決


rooxs

リンク

2012/4/22(Sun) 18:57:38|NO.46211

はじめまして。
今、STGを作ってるのですが、敵機が自機の移動先を予測して攻撃するいわゆる「先読み弾」を作りたいのですが、
どのように作ればよいのでしょうか?どなたかご教授お願いします。



この記事に返信する


spider

リンク

2012/4/22(Sun) 19:09:13|NO.46212

追いかける弾は発射させることが出来るのでしょうか?
出来ない場合、まず其処からやった方が良いかも…
でも、sinとcosとtanが分かってなきゃ出来ないかも。

・追いかける弾の発射させ方
 atan関数で角度(ラジアン)を取得します。
 sin, cos関数を使って、移動量を計算します。(上で求めた値を入れる)
 弾を移動させる。

先読み弾は恐らく自分が今押しているキーを見て、
左なら左めに、右なら右めに(計算できる)
打たせれば良いんじゃないでしょうか?

長文失礼しました。
 



cats

リンク

2012/4/22(Sun) 20:54:51|NO.46213

一応作りましたがやりたいことと違っていたらすみません。
http://hspdev-wiki.net/?%C4%C9%C0%D7%C3%C6
ここのプログラムを少しいじっただけですが
旋回角度を決めることでゲームらしく動くことができます。

cx=0 :cy=0 #module #deffunc plot int radius, int x, int y circle x-radius, y-radius, x+radius, y+radius return #global #const RADIUS 8 #const PI 3.1415926535897932384 #const MISSILE_MAX 3 //敵の弾の数 #const TURN_MAX 0.1 //敵の弾の最大旋回角度 #const MISSILE_LIFE 1 //敵の弾の寿命(このプログラムでは無効) #const MISSILE_SPEED 5 //敵の弾の速さ randomize dim MissileX, MISSILE_MAX dim MissileY, MISSILE_MAX dim MissileLife, MISSILE_MAX dim MissileSpeed, MISSILE_MAX ddim MissileDirection, MISSILE_MAX repeat MISSILE_MAX gosub *make_missile loop *main//メインループ redraw 0 gosub *clear gosub *move_missile gosub *plot_chara gosub *plot_missile redraw 1 await 8 goto *main *clear// 画面を初期化する color 255, 255, 255 boxf return *make_missile//敵の弾を作る repeat MISSILE_MAX if MissileLife(cnt)>0 : continue MissileX(cnt) = rnd(ginfo_winx) MissileY(cnt) = rnd(ginfo_winy) MissileLife(cnt) = MISSILE_LIFE MissileSpeed(cnt) = MISSILE_SPEED MissileDirection(cnt) = atan(cy-MissileY(cnt), cx-MissileX(cnt)) break loop return *move_missile//敵の弾を動かす repeat MISSILE_MAX turn = atan(cy-MissileY(cnt), cx-MissileX(cnt))-MissileDirection(cnt) if turn> PI : turn -= PI*2 if turn<-PI : turn += PI*2 direction = limitf(turn, -TURN_MAX, TURN_MAX)+MissileDirection(cnt) if direction> PI : direction -= PI*2 if direction<-PI : direction += PI*2 MissileX(cnt) += cos(direction)*MissileSpeed(cnt) MissileY(cnt) += sin(direction)*MissileSpeed(cnt) MissileDirection(cnt) = direction loop return *plot_chara//ターゲットの弾を描画 color 0,0,255 cx=cx+2 :cy=cy+2 plot RADIUS,cx,cy return *plot_missile//全ての弾を描画 color 255,128,0 repeat MISSILE_MAX plot RADIUS, MissileX(cnt), MissileY(cnt) loop return



暇人

リンク

2012/4/22(Sun) 22:56:43|NO.46215

もっときっちりした計算式とか有りそうだけど
弾の速度は決まってるとして(発射ごとに速度変えられるなら少し簡単)
複数回自分の到達フレーム数を割り出して誤差を少なくする方法

screen 0,800,600 tkx=400.0 tky=100.0 myx=400.0 myy=400.0 ddim tamx,10 ddim tamy,10 ddim tamvx,10 ddim tamvy,10 ts=8.0 //弾の速度 ms=4.0 //自分の速度 p=5 //先読み精度 repeat redraw 0 color 255,255,255:boxf color pos tkx-8,tky-8 mes "敵" stick k,$fff myvx=0 myvy=0 if k&1{myvx-ms} if k&4{myvx+ms} if k&2{myvy-ms} if k&8{myvy+ms} myx+myvx myy+myvy pos myx-8,myy-8 mes "●" vx=tkx-myx vy=tky-myy sq=sqrt(vx*vx+vy*vy)//敵から自分までの距離 r=atan(vy,vx)+atan(1)*4//敵から見た自分の角度 line tkx,tky,cos(r)*sq+tkx,sin(r)*sq+tky//敵から自分に線を引く color 255 repeat 10 tamx(cnt)+tamvx(cnt) tamy(cnt)+tamvy(cnt) pos tamx(cnt)-8,tamy(cnt)-8 mes "●" line tkx,tky,tamx(cnt),tamy(cnt) loop if cnt\20=10{ repeat p //回数が多い方が誤差が少ない640*480の画面サイズなら4,5回で良いかな(敵との距離があるほど誤差が出やすいから距離で回数決めても良いかも) f= (sq/ts)//自分との距離を速度で割って何フレームで到達するか算出 vx=tkx-(myx+f*myvx) //自分の到達フレームの位置を出して敵からの距離を出す vy=tky-(myy+f*myvy) sq=sqrt(vx*vx+vy*vy) loop r=atan(vy,vx)+atan(1)*4//敵から見た自分の角度 tamx(tcnt)=tkx tamy(tcnt)=tky tamvx(tcnt)=cos(r)*ts tamvy(tcnt)=sin(r)*ts tcnt=(tcnt+1)\10 } redraw 1 await 30 loop



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