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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0511
ミントホーミング(追尾)弾の出し方5解決


ミント

リンク

2010/5/11(Tue) 16:19:51|NO.32607

どーもこんにちは。そうでない方は始めまして。
いつも似たパターンの挨拶ですいません。
っと本題本題。



STG製作もだいぶ落ち着いて新しく「ホーミング(追尾)弾の出し方」を追加しようかと
思ったのですが、思うように・・・いや、どのように作ればいいかさえわからりません。


ググッたり、調べてたらよさそうなページがありました。
http://hspdev-wiki.net/?%C4%C9%C0%D7%C3%C6

こちらにあります「homing.hsp」っというのが参考になり
改造すれば使えそうな気がします。

しかし見たことがない宣言ばかりでわかりずらかったです・・・
(コメつけたりとか、改造して理解に勤めて中)



一応ホーミングの作り方を自分なりに考えてみました。

・敵と弾の 距離を測る
・その距離をマイナスしていく
・ぶつかったら当たり

こんな感じです・・・


どうやったら「ホーミング(追尾)弾」を作れますでしょうか?
それではよろしく願いします。



あがいてサンプルプログラム書いてみる。
(; 22行からのコメントのところは「ホーミング(追尾)弾」追加しようとしているところ。
  --プログラム---

screen 0,320,400 myx = 100 : myy = 330 ;自機の座標 mySpd = 2 ;自機のスピード mytm = 0 ;自機弾 0:発射していない 1:発射している mytmx = 0 : mytmy = 0 ;自機弾の座標 enemy = 0 ;敵の存在 0:いない 1:いる emx = 0 : emy = 0 ;敵の座標 ;****************メインループ************************* *main redraw 2 : color 20,20,20 : boxf gosub *KEYCHK ;自機の移動 gosub *TEKI ;敵機の処理 gosub *TMCHK ;弾の移動 gmode 2 pos myx,myy color 0,255,0 mes "自" ;自機の表示 if enemy : pos emx,emy : color 255,0,0 : mes"敵" ;敵の表示 if mytm=1 : pos mytmx,mytmy : color 0,255,255 : mes"弾" ;自機弾の表示 ;ホーミング(予定) ; dx = xt - tesu ;(相手-自分) (相手が自機,自分が弾) ; dy = yt - tesu ;(相手-自分) (相手が自機,自分が弾) ; if enemy = 0 : emx = x-7.0 : emy = 100.0 : enemy = 1 redraw :await 10 goto *main ;****************自機の移動*************************** *KEYCHK stick ky,15 if ky&1 : myx-=mySpd : if myx<0 : myx = 0 if ky&4 : myx+=mySpd : if myx>288 : myx = 288 if ky&2 : myy-=mySpd : if myy<0 : myy = 0 if ky&8 : myy+=mySpd : if myy>368 : myy = 368 return ;***************自機弾の移動************************** *TMCHK getkey key,90 ;キーチェック,Zキー if (key)&(mytm=0) : mytm = 1 : mytmx = myx : mytmy = myy-20 ;弾が出る場所 if mytm = 1 : mytmy-=10 ;進む方向と速さ if mytmy<-16 : mytm = 0 ;弾が端っこにいったら return ;****************敵の処理***************************** *TEKI if enemy = 0 : emx = 130 : emy = 0 : enemy = 1 if enemy : emy+=1 if emy>400 : emx = 0 : emy = 0 : enemy = 0 return



この記事に返信する


晩御飯

リンク

2010/5/11(Tue) 17:07:16|NO.32609

こんばんわ。読みやすいコードですね。
ターゲットと自機との角度から移動量を求めるのがポイントです。

//5行目、座標を実数型で持つ様にする。 mytmx = 0.0 : mytmy = 0.0 ;自機弾の座標 //42行目、座標を略。どうせなら自機座標、敵機座標も実数型にすると良いかもしれません。 if (key)&(mytm=0) : mytm = 1 : mytmx = double( myx ) : mytmy = double( myy-20 ) ;弾が出る場所 //43行目、コメントアウト ; if mytm = 1 : mytmy-=10 ;進む方向と速さ if mytm = 1{ angle = 0.0 //実数型で初期化。角度を入れる変数です。 angle = atan( emx - mytmx, emy - mytmy ) //敵機と自機弾との角度を求める。 mytmx += 3.0 * sin( angle )//3.0は弾の速さです。定数等で設定して下さい。 mytmy += 3.0 * cos( angle )//上に同じ。使う値は上と同じです。 } //弾の消去。これ位近かったら当たってるとみなして良いよね。 if ( emx - mytmx ) * ( emx - mytmx ) + ( emy - mytmy ) * ( emy - mytmy ) < 2.0 : mytm = 0 if mytmy<-16 : mytm = 0 ;弾が端っこにいったら return
多分これが一番単純じゃないかと思います。
ただ、これをそのまま敵の攻撃に適用すると地獄を見ますので、
提示されていたサイトの様な工夫が必要となります。



ミント

リンク

2010/5/11(Tue) 17:56:55|NO.32610

>>晩御飯さん
>>こんばんわ。読みやすいコードですね。
ありがとうございます!

>>ターゲットと自機との角度から移動量を求めるのがポイントです。
ふむふむ


>>ただ、これをそのまま敵の攻撃に適用すると地獄を見ますので、
>>提示されていたサイトの様な工夫が必要となります。
敵に付けるかどうかはまだ決まってませんが、とりあえず自機にホーミングがほしかったのです。
(自機弾ホーミングを って最初書いたけどあーだーこうだ考えてたら消してたw)



晩御飯さんのプログラムを追加したら「おおー!」っといえる満足いく動作でした。
ただ追加しただけで理解してないので、じっくり改造しつつ理解しようかと思います。
(理解したら、解決チェックしとく)

アドバイス&プログラムの方ありがとうございました!



晩御飯

リンク

2010/5/11(Tue) 19:28:07|NO.32614

追記。
弾の消去の下りはいつぞやの「円の当たり判定」です。
判定の範囲が分からないので適当に2.0と置いています。



ミント

リンク

2010/5/11(Tue) 20:43:42|NO.32616

>>晩御飯さん
>>弾の消去の下りはいつぞやの「円の当たり判定」です。
>>判定の範囲が分からないので適当に2.0と置いています。
わざわざありがとうございます。
今暇になってちゃんとプログラム見たら、コメントが( ̄▽ ̄;

>これ位近かったら当たってるとみなして良いよね。
超おk
ってか自分で直すぐらいの勢いで行く。



ミント

リンク

2010/5/11(Tue) 21:07:16|NO.32618

んー、だいたいわかってきました。

けれど、これでホーミングが出来るのはまだ謎ですが(何とかの法則とやらかな)
そのうち力がついたころには理解できると思います。


とりあえず形として覚えときます。
本当にありがとうございました。



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