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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0729
ますシューティングゲームにて8解決


ます

リンク

2006/7/29(Sat) 12:21:18|NO.1617

シューティングゲームで自分の方を追いかけてくる弾を作りたいのですが、
2点間の角度を求める方法が分かりません。
記事検索をするとヒットするのですが、具体的な方法が載っておらず、分かりませんでした。
まだ小学生なので、全然分からないんです。
Yahooやgoogleで検索もしてみましたが、理解できずorz
誰か、具体的な方法を教えてもらえないでしょうか。



この記事に返信する


かきしす

リンク

2006/7/29(Sat) 13:22:11|NO.1618

角度はアークタンジェントという関数で求められます。
弾角度 = atan( 自機Y-弾Y, 自機X-弾X )

上記の式で求めた角度を利用して弾を移動させるには・・・
弾X=弾X+cos( 弾角度 )*弾速度
弾Y=弾Y+sin( 弾角度 )*弾速度

・・・の様にします。
ただし、単純にアークタンジェントで求めた角度を用いると、
自機が弾をやり過ごした時、弾が急反転して戻ってきたりしますので、工夫が必要ですね。

例)計算で求めた角度を『目標』として、現在の弾の角度を加算・減算するとか
  初期の内だけ自機に向かって角度調整した後、途中から直線移動にするとか・・・



44A

リンク

2006/7/29(Sat) 13:53:37|NO.1619

ソース付シューティングゲームです。良かったら参考にしてみてください。
http://www.ne.jp/asahi/recycle/asato/shooting.zip



かきしす

リンク

2006/7/29(Sat) 17:28:31|NO.1622

サンプルを書いて見ました。
自機と弾にだけ着目して書いたので、わかりやすいかもしれない反面
敵を追加するのは自分でやらなければなりません。
上で紹介されたシューティングゲームと併せて参考にしてみてください。


screen 0,320,240 自機X=160 : 自機Y=210 弾max=5; ←弾の最大数 dim 弾cnt ,弾max; ←弾の状態カウンター ddim 弾X ,弾max :ddim 弾Y ,弾max; ←弾の座標 ddim 弾angle ,弾max; ←弾の角度 弾chr="*" : 弾speed=1.0 repeat 弾max 弾cnt(cnt)=-30-rnd(5)*40 ;弾の状態カウンター設定。マイナスの時は弾存在せず。 loop ;####################################### *メイン stick key,1+2+4+8;  方向キーによる自機移動 自機X=自機X-((key & 1)=1)*2*(自機X>12)+((key & 4)=4)*2*(自機X<308) 自機Y=自機Y-((key & 2)=2)*2*(自機Y>12)+((key & 8)=8)*2*(自機Y<220) repeat 弾max;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 弾cnt(cnt)=弾cnt(cnt)+1; 弾の状態カウンターを加算。 if 弾cnt(cnt)=-12{ 弾X(cnt)=1.0*rnd(320):弾Y(cnt)=1.0*rnd(240) ;弾が発生する少し前に位置を決定。 } if 弾cnt(cnt)>0 {; 状態カウンターが0以上の時に、弾の移動。 if 弾cnt(cnt)<120:弾angle(cnt) = atan( 自機Y-弾Y(cnt), 自機X-弾X(cnt) ) ;     ↑最初の一定時間のみ 自機を追尾する様設定。 弾X(cnt)=弾X(cnt)+cos( 弾angle(cnt) )*弾speed 弾Y(cnt)=弾Y(cnt)+sin( 弾angle(cnt) )*弾speed } if 弾cnt(cnt)=200:弾cnt(cnt)=-30-rnd(5)*40 ;   状態カウンターが一定以上になったら弾の寿命切れ loop;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ redraw 0;-----------------------画面描画---- color 0,0,20:boxf 0,0,320,240 color 255,255,0 pos 自機X-12,自機Y-12 : mes " A "; 自機表示 pos 自機X-12,自機Y : mes "<#>" repeat 弾max if (弾cnt(cnt)>0)or(弾cnt(cnt)=-2)or(弾cnt(cnt)=-4)or(弾cnt(cnt)=-8)or(弾cnt(cnt)=-12) { color 255,0,0 pos 弾X(cnt),弾Y(cnt):mes 弾chr ; ↑弾発生の少し前から点滅表示させている。 } loop redraw 1:await 10;-------------------------- goto *メイン ;#######################################



Drip

リンク

2006/7/29(Sat) 19:38:12|NO.1626

Dripです。
 ますさん、こんにちは。角度を求める方法は色々ありますが、
WEBでやり方を検索するとアークタンジェントを使用する方法がたくさんみつかりますね。
以下のような方法で簡単に2点の角度を取得できます。

repeat redraw 0 //再描画スイッチOFF color 255,255,255:boxf:color ,,255 pos 5,5:mes "マウスを動かしてみてください。" px=mousex:py=mousey pos px,py:mes "★" //プレイヤー描画 mytan=atan(ex-px,ey-py) //敵とプレイヤーの角度を取得。0〜2π が 0〜360度を意味します。 line ex,ey,ex+sin(mytan)*80,ey+cos(mytan)*80 //矢印描画 line ex,ey,ex+sin(mytan+0.5)*40,ey+cos(mytan+0.5)*40 line ex,ey,ex+sin(mytan-0.5)*40,ey+cos(mytan-0.5)*40 ex=(ex+4)\640 //敵を移動させる ey=(ey+2)\480 redraw 1 //画面更新 await 30 //アイドル loop
 ここで注意したいのは、このプログラムを見てアークタンジェントとは2点の角度を求める
ものなのか!と理解しないでほしいことです。
 アークタンジェントは高校数学B以降から出てくる計算で、HSPのatanのようなお手軽なものでは
ありません。プログラムセットに用意された簡単な関数に慣れてしまうと、
将来的に数学の授業などで混乱が生じる可能性があります。
どうかプログラム数学関数の意味を鵜呑みにせず広い視野を持ってプログラムに挑戦してみてください。



ルーイヨッシー

リンク

2006/7/29(Sat) 23:58:16|NO.1629

DirectXを使うんでしたらラクなんですけどね…
es_aimとか。でも、DLLを使わないとなると、やはり大変ですよね;



osakana

リンク

2006/7/30(Sun) 07:02:59|NO.1630

追いかけて来る弾は多くを求めないなら、
角度を求めなくても作る事ができます。
モジュールにして見ましたが、やっつけで作ったので
おかしい所があるかも知れません。

マウスに寄って来ます。

#module #deffunc test var bufx,var bufy,int x1,int y1,int x2,int y2,val kyori if (x1=x2)&(y1=y2) :bufx=0 :bufy=0 :return if x2>x1 :xx=x2-x1 :else :xx=x1-x2 if y2>y1 :yy=y2-y1 :else :yy=y1-y2 if x2=x1 :xx=1 if y2=y1 :yy=1 if xx<=yy {bufx=1.0*xx/yy :bufy=1.0 :count=yy} else {bufx=1.0 :bufy=1.0*yy/xx :count=xx} if x2<x1 :bufx*=-1 if y2<y1 :bufy*=-1 kyori=sqrt(xx*xx+yy*yy) return count #global px=0.0 //弾初期位置x py=0.0 //弾初期位置y speed=6.0 //弾の速さ *main redraw 0 color 255,255,255 :boxf //test p1,p2,p3,p4,p5,p6,p7 //p1 , p2 = 1ドット分のx、y加算量を入れる変数 //p3 , p4 = この場合、弾のx、y //p5 , p6 = この場合、自機のx、y //p7 = 弾と自機の距離 //stat = 弾と自機までに必要なループ数 test xx,yy,px,py,mousex,mousey,kyori //お互いの距離が40以内になったら if kyori>40 :xx2=xx :yy2=yy //青い● color 0,0,255 :circle px+xx2-8,py+yy2-8,px+xx2+8,py+yy2+8 px+=xx2*speed py+=yy2*speed redraw 1 wait 1 goto *main



osakana

リンク

2006/7/30(Sun) 07:16:22|NO.1631

>1ドット分のx、y加算量を入れる変数
1ループ分の加算量でした。



ます

リンク

2006/7/30(Sun) 18:34:15|NO.1645

ありがとうございます!
atanを使うことでできました。
急反転することへの対処は、弾の速度を遅くして
フラグをセット、毎フレームで1づつ減らして0になったら爆発(=消える)
という方法をとることにしました。

#余談ですが、できたと思って細かい変更をし、
#上書き保存したらいつのまにかスクリプトの一部が消えていて大変なことになりました(汗
#どうしてでしょうか…何もしていないのに一部がいきなり消えるなんて…
#復旧作業が大変でした。



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