ページ 11

マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 18:06
by 金理 李
タイトルのとおりの疑問です
かの有名なスーパーマリオブラザーズを例にとらしていただきます
マリオが右から甲羅を蹴飛ばしたら甲羅は左に飛んでいきます
マリオが左から甲羅を蹴飛ばしたら甲羅は右に飛んでいきます
2Dの場合、この2つの処理を書いてやればいいと思うのですが

模擬3D(バードビューとか)の場合、2つの処理じゃ足りません
どの方向からも甲羅を蹴飛ばせるので2Dの時のように書こうとしたら100パターン以上です

ですので教えてほしいのです
甲羅を蹴飛ばしたらマリオがいる場所の反対方向に飛んでいく処理を
どうかお願いします  分かるところまでと言われてもしょっぱなから分からないのです
投げやりな感じはしますがごめんなさい
(プログラミングの館、DXライブラリサンプルプログラムは最後まで読んだつもりです)

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 18:27
by softya(ソフト屋)
そもそも、あたり判定や当たった後の処理以前に好きな方向に飛ばすこと自体が出来ますか?
これが分かっていないと、その話ができないのですが。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 18:37
by ISLe
マリオを任意の方向に向けて歩かせる処理は書けるのでしょうか?
それができれば難しいことではないと思いますけど。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 19:09
by 金理 李
〉〉ソフト屋さん
当たり判定ですか?丸の当たり判定は面倒くさくて見てないのですが
矩形くらいならできます(左上、右下を使うやつですね)
甲羅を好きな方向に飛ばすとはどういうことでしょうか?
表示座標をいじれるとかそういうことでしょうか?

〉〉ISleさん
マリオを任意の方向に動かすことはできます
ただ、DXライブラリしか使えないのですが・・・

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 19:13
by softya(ソフト屋)
金理 李 さんが書きました:当たり判定ですか?丸の当たり判定は面倒くさくて見てないのですが
矩形くらいならできます(左上、右下を使うやつですね)
やってみると分かりますが円のほうが簡単です。
金理 李 さんが書きました:甲羅を好きな方向に飛ばすとはどういうことでしょうか?
表示座標をいじれるとかそういうことでしょうか?
そうです。2Dのベクトル操作できるかですね。
シューティングの弾の処理といってもよいでしょう。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 19:56
by 金理 李
丸の当たり判定みてきました
ピタゴラスの定理なんて言われても中坊なので分からないんですが
とりあえずやり方は(コードの書き方)は覚えました

コード:

int x = x1-x2;
int y = y1-y2;
int range = range1+range2;
int PI/なんか; 

if(x*x+y*y<range*range){
     flag=1;
};

if(flag==1){
     x2 += sin(angle)*speed;
     y2 += cos(angle)*speed;
};

DrawGraph(x1,y1,mario.png,TRUE);
DrawGraph(x2,y2,koura.png,TRUE);
sinとcos、丸の当たり判定は初めて使ったのですが
こんな感じでしょうか?<ソフト屋さんの言っていた甲羅を好きな方向にとばすやつ
甲羅をストップさせる処理はしてないですが

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 20:05
by 金理 李
int PIなんかはint angle = PI /なんかでした
PI/5って具体的に何度くらいなのでしょう?(とぶ方向は?)
あと、それと反対方向に甲羅を飛ばす処理もできればお願いいたします

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 21:03
by softya(ソフト屋)
PIが180度ですので、180/5で36度ですね。
この式の場合
x2 += sin(angle)*speed;
y2 += cos(angle)*speed;
0度でyがプラス方向に移動します。画面方向で言うと下。
90度でxがプラス方向なので画面方向で右。
180度でyがマイナス方向なので画面方向で上。
270度でxがマイナス方向なので画面方向で左。
となりますので、36度だと下ちょい右方向へ移動します。

衝突の場所の反対方向に飛ばすには、衝突したマリオと甲羅のX,Yの相対座標でマリオに対する甲羅の角度を求めます。
使う関数はatan2です。これも三角関数ですね。
高校レベルの数学ですが使い方さえ覚えれば大丈夫です。
angle = atan2( 甲羅X-マリオX,甲羅Y-マリオY)
でマリオから見た甲羅の角度が求まりますので、これを甲羅の移動方向に使ってください。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 21:19
by 金理 李
なるほどてっきりPIってのがまた必要かと思っていましたがそうじゃないんですね
atan2は確か追尾弾の処理の時に意味が分からなくて断念していたものですが
使い方を教えてくださったのでなんとかできそうです

それと、甲羅の跳ね返り処理なのですが
単純に符号を反転さしてやればいいですかね?
(この場合は、スピードの値を反転さしてやればいいのかな?)

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 21:30
by softya(ソフト屋)
金理 李 さんが書きました:それと、甲羅の跳ね返り処理なのですが
単純に符号を反転さしてやればいいですかね?
(この場合は、スピードの値を反転さしてやればいいのかな?)
単純に跳ね返るならそうですが、当たる場所を考慮して跳ね返す必要はないのでしょうか?
物に当たったときに元来た方向に真っ直ぐ跳ね返るのはあんまりないんじゃないですか?
壁に横からボールを当てたら跳ね返る場合はどうなるか現実を考えてみてください。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 23:23
by 金理 李
ですよね・・・
この場合は上下からまたは左右から当たった場合の
処理を別々に考えてやる必要がある気がするのですが
丸の当たり判定じゃいい方法が思いつかないんですよね
(上下左右に移動している場合それぞれの方向に
フラグを持たせてやるというやりかたも思いついたのですが
それも間違っている気がしてきましたし)

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月28日(水) 23:43
by softya(ソフト屋)
丸いものと衝突する場合は円で良いと思いますが、壁やブロック状のものは四角の当たり判定で良いと思います。
当たり判定で当たった四角の場合は、辺の角度から反射角を計算する必要があります。
丸の場合は、更に面倒くさい計算が入りますね。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月29日(木) 00:16
by 金理 李
いろんなサイトを見ていたのですが
反射角=2×反射面の角度‐入射角
らしいのですがこれもatan2を使うのでしょうか?
反射面の角度というのがよくわかりませんが・・・

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月29日(木) 12:41
by softya(ソフト屋)
金理 李 さんが書きました:いろんなサイトを見ていたのですが
反射角=2×反射面の角度‐入射角
らしいのですがこれもatan2を使うのでしょうか?
反射面の角度というのがよくわかりませんが・・・
反射面の角度は、反射面の傾き角度です。
例えば、
x2 += sin(angle)*speed;
y2 += cos(angle)*speed;
の数式で支配されているのならば、地面に水平な壁は90度の傾きをもつ反射面です。

>反射角=2×反射面の角度‐入射角
それは単なる中学数学で計算できますよ。
例えば、
入射角:0度
反射面の角度:90度
なら
反射角:180度
です。
色々計算して理解に努めてみてください。
PIを使うラジアン角でも同様です。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月29日(木) 18:39
by 金理 李
体は中坊でも頭は小坊←これ言うの忘れてました
試せって言われても
合っているか不安なので聞きます(コンパイラはさっきからデリーティングとか言って動かないし)

90度って│←こんな感じの壁ってことですか?
入射角0度って数値はありえるんですか?これじゃあ壁に当たらない気がします
(バカなこと言ってたらすいません)

式はangle = 2*90-angleこんな感じでしょうか?(バカなこと言っ(略))

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月29日(木) 18:54
by softya(ソフト屋)
使い方は理解しないと困るので頑張りましょう。

この数式で支配される世界では、
x2 += sin(angle)*speed;
y2 += cos(angle)*speed;
│ ← は0度の壁です。
── ← が90度の壁です。

移動方向と角度の関係はこうなります。()中はPIを使ったラジアン角。

コード:

     180度(PI)
      ↑
270度 ←┼→ 90度(PI/2)
(PI*3/2)  ↓
      0度(0)
この数式の時にしか通用しないので注意してくださいね。

>式はangle = 2*90-angleこんな感じでしょうか?(バカなこと言っ(略))

度数法で壁の角度が固定なら正解です。
一般化すると
out_angle = 2*kabe_angle-in_angle
ですね。

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月30日(金) 00:39
by 金理 李
│が0°、━が90°だとしたら
四角の当たり判定を作るときに縦の辺と横の辺の
二つの当たった場合の処理を考えなくてはいけないんじゃないんですか?
質問しっぱなしで悪いのですが縦の辺と横の辺を分ける方法なんて知らないんですが・・・

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年9月30日(金) 09:03
by softya(ソフト屋)
そうか、四角の当たり判定後に線分の交差判定がいりますね。
線分とは、無限大の長さが有る直線の一部分のこと。

線分1:四角の辺
線分2:甲羅の移動の軌跡

とします。これを線分の交差判定で交差するか判定することでどの辺と衝突したか分かります。

VBですが概念理解
「もっと簡単に-線分交差判定-」
http://www5d.biglobe.ne.jp/~tomoya03/sh ... ection.htm

よく分からなくても使い方だけでも理解すればOK。
「線分の交差判定-C/C++-水無瀬の部屋」
http://katsura-kotonoha.sakura.ne.jp/pr ... 0015.shtml

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年10月08日(土) 02:01
by 金理
今更の返信で申し訳ないですが言わせてください

線分なんていきなり知らんものが出てきたから(中学でやりましたが)混乱しています
線分を使うってことは左上、右上、左下、右下のすべての点のxとyの情報が入りますね

それと甲羅の移動の軌跡ってなんですか?どうやって調べるのでしょう
無知なうえにバカですいません


(先ほど、ここの掲示板を使っていたのを忘れて新しいHNで投稿してしまいました
 この名前で統一しますのでお許しください)

Re: マリオが甲羅を蹴飛ばす処理

Posted: 2011年10月08日(土) 09:10
by softya(ソフト屋)
金理 さんが書きました:線分なんていきなり知らんものが出てきたから(中学でやりましたが)混乱しています
線分を使うってことは左上、右上、左下、右下のすべての点のxとyの情報が入りますね
いりますね。当たり判定できる以上は情報はあるはずです。
金理 さんが書きました:それと甲羅の移動の軌跡ってなんですか?どうやって調べるのでしょう
無知なうえにバカですいません
移動開始座標と角度と速度で求めた移動後の座標を結ぶ線分が軌跡です。

ゲームを作る以上は数学は避けれません。頑張りましょう。
教科書を引っ張り出してきて勉強するのも手です。