格闘ゲームの当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよこ

格闘ゲームの当たり判定

#1

投稿記事 by ひよこ » 16年前

いま昨日の格闘ゲームの当たり判定を作っているのですが一回当てると攻撃判定がなくなってしまうのですがどうすればいいでしょうか(プログラム実行中のバグです。)よろしくお願いします。
#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        int PlayerX,PlayerY;
		PlayerY=280;
        int kyara[6];
		int teki[5];
		int img;
		int tekiX=500;
		int teki_img;
		char Key[256];
       
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
		kyara[0]= LoadGraph("KIRYU.bmp");
		kyara[1]= LoadGraph("KIRYU000.bmp");
		kyara[2]= LoadGraph("KIRYU2.bmp");
		kyara[3]= LoadGraph("KIRYU3.bmp");
		kyara[4]= LoadGraph("KIRYU4.bmp");
		kyara[5]= LoadGraph("KIRYU5.bmp");
		teki[0]= LoadGraph("ba-mumann.bmp");
		teki[1]= LoadGraph("ba-mumann9.bmp");
		teki[2]= LoadGraph("ba-mumann8.bmp");
		teki[3]= LoadGraph("ba-mumann6.bmp");
		teki[4]= LoadGraph("ba-mumann7.bmp");
        PlayerX  =320;
		int tekimuki=4;
        int muki=5;
		int rakka=0;
        SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
        int Black;	Black=GetColor( 0 , 0 , 0 );
		int White;	White=GetColor( 255 , 255 , 255 );
		int Blue;Blue= GetColor(  0,   0, 255  ) ; // 赤色の値を取得
		int MYHP,firstmyhp,mydamage;
		firstmyhp=300;mydamage=0;
		
		int TEKIHP,firsttekihp,tekidamage;
		firsttekihp=340;tekidamage=0;
		
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
		
		MYHP=firstmyhp-mydamage;
		TEKIHP=firsttekihp+tekidamage;
		PlayerY-= rakka ;// 落下処理
		rakka=-2;
		if(PlayerY>280){PlayerY=280;rakka=0;}
		if(PlayerX<0){PlayerX=0;}
		if(tekiX<0){tekiX=0;}
		if(tekiX>584){tekiX=584;}
        if(PlayerX+118>640){PlayerX=522;}  
		//hidari
		if( Key[ KEY_INPUT_LEFT ]  == 1 ) { //左ボタンが押されたら
			PlayerX=PlayerX-2; muki=4;}         //左向きフラグを立てる
 
		if( Key[ KEY_INPUT_RIGHT]  == 1 ){  //右ボタンが押されたら
			PlayerX=PlayerX+2; muki=5; }        //右向きフラグを立てる
		//↑migi
		if(  Key[ KEY_INPUT_X]  == 1 ){
			if(tekiX==PlayerX+118){tekidamage=50; tekiX=tekiX+6;}
			muki=3;}
		if(  Key[ KEY_INPUT_Z]  == 1 ){
			muki=2;}
		//osihidari
		if( Key[ KEY_INPUT_LEFT]== 1 &&  PlayerX-50==tekiX ){
			PlayerX=PlayerX-0;tekiX=tekiX-2;muki=4;}
		if( Key[ KEY_INPUT_RIGHT]== 1 &&  PlayerX+118==tekiX){
			PlayerX=PlayerX+0;tekiX=tekiX+2;muki=5;}
		//↑osimigi
		if( Key[ KEY_INPUT_LEFT]== 1 && PlayerX<=56 && tekiX<=0 ){//敵を角にはさんだら動かなくする
			PlayerX=56;muki=4;}									  //左
		if( Key[ KEY_INPUT_RIGHT]== 1 && PlayerX>=464 && tekiX>483 ){//敵を角にはさんだら動かなくする
			PlayerX=464;muki=5;}									  //migi

		if ((Key[KEY_INPUT_A]==1) && PlayerY == 280 ) { rakka=200;  muki=1;}
        if( Key[ KEY_INPUT_O ]  == 1 ) { //左ボタンが押されたら
			tekiX=tekiX-2; tekimuki=3;}         //左向きフラグを立てる
		if( Key[ KEY_INPUT_P ]  == 1 ) { //左ボタンが押されたら
			tekiX=tekiX+2; tekimuki=4;}         //左向きフラグを立てる
		if( Key[ KEY_INPUT_K ]  == 1  && Key[ KEY_INPUT_O ]  == 1) { //左ボタンが押されたら
			 tekimuki=1;}         //左向きフラグを立てる
		if( Key[ KEY_INPUT_L ]  == 1 && Key[ KEY_INPUT_P ]  == 1 ) { //左ボタンが押されたら
			 tekimuki=2;}         //左向きフラグを立てる
		if( Key[ KEY_INPUT_O]== 1 &&  PlayerX+118==tekiX ){
			PlayerX=PlayerX-2;tekiX=tekiX-0;tekimuki=4;}
		if( Key[ KEY_INPUT_P]== 1 &&  PlayerX==tekiX+57){
			PlayerX=PlayerX+2;tekiX=tekiX+0;tekimuki=5;}			
		img=kyara[(muki)];            //画像をセット
		teki_img=teki[(tekimuki)];
		ClearDrawScreen();
		DrawBox   (  0 ,  0 , 640 , 480 , White , TRUE) ;   // 四角形を描画
		DrawString(  0,  0, "H" , Black);            //文字列表示
		DrawString(  0,  15, "P" , Black);            //文字列表示
		DrawString(  630,  0, "H" , Black);            //文字列表示
		DrawString(  630,  15, "P" , Black);            //文字列表示       
		DrawBox   (  20 , 0 ,MYHP  , 50 ,Blue, TRUE ) ;   // 四角形を描画(塗りつぶし)
		DrawBox   (  TEKIHP , 0 ,620  , 50 ,Blue, TRUE ) ;   // 四角形を描画(塗りつぶし)
        DrawGraph( PlayerX , PlayerY , img , TRUE ) ;//画像を描画
		DrawGraph( tekiX , 280 , teki_img , TRUE ) ;//画像を描画
        ScreenFlip();
    }
 
 
    DxLib_End();
    return 0;
}

kazuoni

Re:格闘ゲームの当たり判定

#2

投稿記事 by kazuoni » 16年前

すみません。自分の力不足かもしれませんが、
どこで何をしているのかがよく分かりません。
何を押したら攻撃しているのか(攻撃処理部分はどこか)
(おそらくXだと思いますが・・・)
が明瞭になればもっと良い回答ができるのですが・・・

もしXが攻撃だとしたら、if文に合致しなくなるからではないでしょうか?

ところで、
ボレークポイントの立て方を知っていますか?(Visual c++等)
何度かこの助言(?)をしていて、誰に伝えたのかわからなくなってしまってますので、
もし聞いたことがあったら流してください。

ひよこ

Re:格闘ゲームの当たり判定

#3

投稿記事 by ひよこ » 16年前

すいませんXが攻撃になります。

kazuoni

Re:格闘ゲームの当たり判定

#4

投稿記事 by kazuoni » 16年前

まず、GetHitKeyStateAll()の使い方を本家で見てみてください。
今のままだと、
Xを一回押したつもりでも処理はものすごい高速ですので、
if( Key[ KEY_INPUT_Z] == 1 )
は数回もしくは数十回連続で合致し、if文内に入ってしまいます。
これでも自分の意図した仕様になっていますか?
また、
tekiX==PlayerX+118
という条件はどういう意図で書いていますか?

ひよこ

Re:格闘ゲームの当たり判定

#5

投稿記事 by ひよこ » 16年前

tekiX==PlayerX+118 は攻撃の先端で当たるとって意味です。

kazuoni

Re:格闘ゲームの当たり判定

#6

投稿記事 by kazuoni » 16年前

さっきも書きましたが、
ほかのボタン判定にも当てはまります。
右ボタンを一回押したつもりでも、X座標はものすごく動くはずです。
なので、当たり判定をピンポイントにするのは厳しいのでは?
例えばですが、|敵の位置-自分の位置|(絶対値)<118
とすれば、近距離で攻撃してもあたり判定が有効になります。

ひよこ

Re:格闘ゲームの当たり判定

#7

投稿記事 by ひよこ » 16年前

if((tekiX-PlayerX)<118)でためしたところ攻撃判定がなくなった?になってしまいました。

kazuoni

Re:格闘ゲームの当たり判定

#8

投稿記事 by kazuoni » 16年前

補足ですが、攻撃してあたったら
敵もしくは自分を遠ざけるような処理を加えてください。
(現在もそうなってるようですが。)

ただこれだと、Xを押しっぱなしだと
無敵モードです^^;
118の範囲になったらすぐダメージですので。
なんだか打撃戦というより、
ドラゴンボールのスーパーサイヤ人の周りの黄色い奴の戦いみたいなw

やはり、管理人さんが作られた
http://dixq.net/g/#40b
が使いやすいかと。
これならif(Key[Key_INPUT_RETURN]==1)
でも一回押したら一回処理になります。
長押しとかも実現可能ですので、
必殺技のパワーゲージをためるなどの処理に使えそうです。

kazuoni

Re:格闘ゲームの当たり判定

#9

投稿記事 by kazuoni » 16年前

絶対値をとっていないので、敵が左側にいると
ずっと合致しません。
また、
初期状態から右キーで近づけていくと
if( Key[ KEY_INPUT_RIGHT]== 1 && PlayerX+118==tekiX)
に合致した際に、
PlayerX=PlayerX+0;tekiX=tekiX+2;muki=5
の文を実行していますので、永遠に118以内に入ることはありませんね^^;

Mist

Re:格闘ゲームの当たり判定

#10

投稿記事 by Mist » 16年前

一個気になったのだけど、「あたり判定」がないことをどうやって確認していますか?

> TEKIHP=firsttekihp+tekidamage;

この式だと何回ダメージを与えてもダメージは累積されませんけど。

Mist

Re:格闘ゲームの当たり判定

#11

投稿記事 by Mist » 16年前

間違いはこっちのほうかな?

誤)tekidamage=50
正)tekidamage+=50

じゃないかな。

ひよこ

Re:格闘ゲームの当たり判定

#12

投稿記事 by ひよこ » 16年前

うまくいきました。まさにその通りでした。Mistさんありがとうございました。
kazuoniさん回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る