ページ 11

吹き飛ばしについて

Posted: 2011年7月10日(日) 17:04
by シルバー
初めまして
私のはC++でDXライブラリは使っていません。

今ゲームを作っているのですが吹き飛ばすプログラムがわかりません。キャラクター1がキャラクター2に体当たりをした時、左からなら右に、上からなら下に真っ直ぐ吹き飛ばすという感じでやってみたいと思うのですがよくわかりません。どうやれば吹き飛ばしができるのでしょうか?
当たり判定はRECTを使っています
ボタンを押すと攻撃グラフィックが出ます

gAttack、gPlayer2 x.y ...キャラクター1の攻撃座標  キャラクター2の座標
gAttack.gPlayer vx、vy ... キャラクター1の攻撃速度 キャラクター2の速度
gAttack.use ・・・ フラグ

コード:

	if(key & KEYIN_Z)
    {
	     if(gAttack.use == 0)
       {
	       gAttack.use =1;
	       (int)gAttack.x = (int)gPlayer1.x;
	       (int)gAttack.y = (int)gPlayer1.y;
	     }
	     if(gAttack.use == 1)
	     {
                   gAttack.use = 0;
	     }
        }
   RECT rc_gAttack , rc_gPlayerX , rc_dammy;

   SetRect(&rc_gAttack , (int)gAttack.x , (int)gAttack.y, ((int)gAttack.x + ATTACK_WIDTH ) , ((int)gAttack.y + ATTACK_HEIGHT ) );
   SetRect(&rc_gPlayerX  , (int)gPlayer2.x  , (int)gPlayer2.y  , ((int)gPlayer2.x + P2_WIDTH)  , ((int)gPlayer2.y + P2_HEIGHT) );

     if( IntersectRect( &rc_dammy , &rc_gAttack , &rc_gPlayerX) )
     {
	  (int)gAttack.vx = (int)gPlayer2.vx;
	  (int)gAttack.vy = (int)gPlayer2.vy;
     }

Re: 吹き飛ばしについて

Posted: 2011年7月10日(日) 17:30
by naohiro19
簡単に言えばスマブラのような感じですか?

Re: 吹き飛ばしについて

Posted: 2011年7月10日(日) 18:57
by a5ua
攻撃が命中したときに、(敵の速度)=(攻撃速度)×(適当な倍率)とするのはどうでしょうか。
もしくは、攻撃オブジェクトごとに、吹き飛ばし方向のベクトルを持たせるということも考えられます。

Re: 吹き飛ばしについて

Posted: 2011年7月10日(日) 22:30
by シルバー
>>naohiro19さん
naohiro19 さんが書きました:簡単に言えばスマブラのような感じですか?
そうですね。
ただ%がなくて吹き飛ぶ方向は真っ直ぐ飛ぶだけですね

>>a5uaさん
a5ua さんが書きました:攻撃が命中したときに、(敵の速度)=(攻撃速度)×(適当な倍率)とするのはどうでしょうか。
もしくは、攻撃オブジェクトごとに、吹き飛ばし方向のベクトルを持たせるということも考えられます。
ベクトルの方はベクトルのことがいまいちよくわかっていないので倍率の方を試してみます。

Re: 吹き飛ばしについて

Posted: 2011年7月13日(水) 00:31
by シルバー
一応吹き飛ばしっぽいのはできましたが、一瞬で移動してしまいます。
吹き飛ばしている間キャラを回転させながら吹き飛ばしたいのですがどうすればいいのでしょうか?

今はこんな感じです。

コード:

			   
   RECT rc_gAttack , rc_gPlayerX , rc_dammy;
 
   SetRect(&rc_gAttack , (int)gAttack.x , (int)gAttack.y, ((int)gAttack.x + ATTACK_WIDTH ) , ((int)gAttack.y + ATTACK_HEIGHT ) );
   SetRect(&rc_gPlayerX  , (int)gPlayer2.x  , (int)gPlayer2.y  , ((int)gPlayer2.x + P2_WIDTH)  , ((int)gPlayer2.y + P2_HEIGHT) );
 
     if( IntersectRect( &rc_dammy , &rc_gAttack , &rc_gPlayerX) )
     {
		    gPlayer2.vx += gAttack.vx * 20;
	    gPlayer2.vy += gAttack.vy * 20;
	    }