アクションゲームを作っているのですが、障害物の判定で悩んでいます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yasyoshi
記事: 3
登録日時: 10年前

アクションゲームを作っているのですが、障害物の判定で悩んでいます

#1

投稿記事 by yasyoshi » 10年前

やすよしと申します、初めての投稿です。

障害物(座標はjamax,jamayです)の判定で悩んでいます。
常に落ちるように常にかかり続ける重力(Gravity)と、それを止める地面(jimen)を作り、
なんとか障害物の上に乗れるよう調整したところ、次のようなコードになりました。
これでなんとか障害物の判定は作れました。

しかし、このコードには致命的なバグがあります。
障害物に触れている状態で障害物の方向にキーを入れ、ジャンプするとキャラがポーンと画面外に飛んで行ってしまうのです。

また障害物をたくさん空中に置いたりするとなるとこれではいけない…と思うのですが、どうしたらよいかわかりません…

将来的には落ちる人をSHIFTで遅くして助けるというゲームにしたいです。(ここにも問題があるのですが…)
よろしくお願いします!

コード:

#include "Dxlib.h"

using namespace DxLib;


int Playerx,Playery;
    int Gravity;
    int jamax,jamay;
    int jimen;
    char Buf[256];
    int jiki;
    int haikei;
    int Cr;
    double enemyx,enemyy;
    double enemyg;
    int enemypic;
    int kasoku;

void load()
{
    //Cr = GetColor(0,0,255) ;
    jiki = LoadGraph( "test.bmp" ) ;
    enemypic = LoadGraph( "teki.bmp" ) ;
    haikei = LoadGraph( "haikei.bmp" ) ;
    Cr = GetColor(0,0,255 ) ;
    SetDrawScreen(DX_SCREEN_BACK);
}

void hyoji()
{
	DrawGraph(0,0,haikei, FALSE) ;
	DrawGraph(Playerx-32,Playery-32,jiki, true) ;
    DrawGraph(enemyx-32,enemyy-32,enemypic, true) ;
    DrawBox( jamax , jamay , jamax+32 , jamay+32, Cr , TRUE) ;
    DrawFormatString(0 , 0 , GetColor(0,255,0) , "x = %d y = %d" , Playerx , Playery);
}

void sousa()
{
    GetHitKeyStateAll( Buf ) ;
    

    if(Buf[KEY_INPUT_RIGHT])
    {
        Playerx+=5;
    }
    if(Buf[KEY_INPUT_LEFT])
    {
        Playerx-=5;
    }
}

void juryoku()
{
    Playery-=Gravity;
    Gravity-=1;
    
    //問題の場所です
    if(Buf[KEY_INPUT_Z]&&( (Playery >= jimen && (jamax-32>=Playerx || jamax+64<=Playerx) ) || (Playery>=jamay-32&&(jamax-32<Playerx && jamax+64>Playerx))))
    {
        Gravity+=20;
    }

}

void slow()
{
    if(Buf[KEY_INPUT_LSHIFT])
    {
        enemyg = 0.1;
        Gravity = -2;
    }


    
}

void kabe()
{
    if(0>Playerx)
    {

    Playerx =0; 

    }
    
    //おそらく問題のある場所です↓
	if(Playery > jimen && (jamax-32>=Playerx || jamax+64<=Playerx))
    {
        Playery = jimen;
        Gravity = 0;
    }
    //おそらく問題のある場所です↓
	if(Playery>jamay-32 && (jamax-32<Playerx && jamax+64>Playerx))
	{
		Playery=jamay-32;
		Gravity=0;
	}

}


void block()
{
	
    //おそらく問題のある場所です↓
    /*if(jamax-32<Playerx && jamax+64>Playerx && Playery<jamay-32)
    //上のほうの当たり判定
    {
		//if(){
			//Playery = jamay-32;
		//}
        
    }*/
    
    if(jamax-32<Playerx && jamax-32>Playerx-32 && jamay-32<Playery)
	
    
    //左のほうの当たり判定
    {

        Playerx = jamax-32;

    }
    
    if(jamax+64>Playerx && jamax+64<Playerx+32 && jamay-32<Playery)
    //右のほうの当たり判定
    {

        Playerx = jamax+64;

    }

}

void teki()

{
    enemyy -= enemyg;
    
    enemyg -= 0.1;

    if(enemyy > jimen)
    {
        enemyy = jimen;
        enemyg = 0;
    }

    if((Playerx-32 < enemyx <Playerx+32) && (Playery-32 < enemyy < Playery+32))
    
    {
        DrawCircle( 320 , 240 , 150 , Cr , FALSE ) ;


    
    }

}

int end()
{
    if(ProcessMessage() == -1)
    {
        return -1;
    }

    return 0;

}

int loop()
{
	sousa();
    juryoku();
    
    //かえたとこ↓(順番入れ替え)
    block();
    kabe();
    teki();
    ClearDrawScreen() ;
    slow();
    hyoji();
    
	ScreenFlip();
    

    if(end() == -1)
    { 
        return -1;
    }
    return 0;

}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    
    ChangeWindowMode(1);

    if(DxLib_Init()== -1)
    {
        return -1;
    }

    Gravity=0;
    Playerx=0;
    jimen=368;
    jamax=200;
    
    enemyx=500;
    enemyy=0;

    enemyg = 0;

    kasoku = 0;

    Playery=jimen;
    jamay=jimen;
    

    load();
    

    while(1)
    {
        if(loop() == -1)
        {
            break;
        }
    }


    DxLib_End();

    return 0;

}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: アクションゲームを作っているのですが、障害物の判定で悩んでいます

#2

投稿記事 by みけCAT » 10年前

本題に関係あるかはまだわかりませんが、とりあえずgcc4.8.1でコンパイルしたところ、

コード:

akusyon_syougaibutunohantei.cpp: In function 'void teki()':
akusyon_syougaibutunohantei.cpp:149:20: warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]
     if((Playerx-32 < enemyx <Playerx+32) && (Playery-32 < enemyy < Playery+32))
                    ^

akusyon_syougaibutunohantei.cpp:149:57: warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]
     if((Playerx-32 < enemyx <Playerx+32) && (Playery-32 < enemyy < Playery+32))
                                                         ^
akusyon_syougaibutunohantei.cpp: At global scope:
akusyon_syougaibutunohantei.cpp:195:12: warning: unused parameter 'hInstance' [-Wunused-parameter]
 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
            ^
akusyon_syougaibutunohantei.cpp:195:12: warning: unused parameter 'hPrevInstance' [-Wunused-parameter]
akusyon_syougaibutunohantei.cpp:195:12: warning: unused parameter 'lpCmdLine' [-Wunused-parameter]
akusyon_syougaibutunohantei.cpp:195:12: warning: unused parameter 'nCmdShow' [-Wunused-parameter]
という警告が出ました。
後半は無駄な仮引数があるだけなので無視していいですが、前半は「不自然な条件式がある」と言っています。

コード:

    if((Playerx-32 < enemyx && enemyx <Playerx+32) && (Playery-32 < enemyy && enemyy < Playery+32))
の間違いではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: アクションゲームを作っているのですが、障害物の判定で悩んでいます

#3

投稿記事 by みけCAT » 10年前

コード:

(Playery >= jimen && (jamax-32>=Playerx || jamax+64<=Playerx) )
という条件と

コード:

(Playery>=jamay-32&&(jamax-32<Playerx && jamax+64>Playerx))
という条件で、Gravityに2回20が加算されていると思われます。
とりあえず、juryoku関数を

コード:

void juryoku()
{
    Playery-=Gravity;
    Gravity-=1;

    //問題の場所です
    if(Buf[KEY_INPUT_Z]&&( (Playery >= jimen && (jamax-32>=Playerx || jamax+64<=Playerx) ) || (Playery>=jamay-32&&(jamax-32<Playerx && jamax+64>Playerx))))
    {
        if(Gravity <= 0) Gravity+=20;
    }

}
としてみてはいかがでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yasyoshi
記事: 3
登録日時: 10年前

Re: アクションゲームを作っているのですが、障害物の判定で悩んでいます

#4

投稿記事 by yasyoshi » 10年前

なるほど、『||』 の意味を間違っていたようです!実行したら普通な感じに戻りました~!

yasyoshi
記事: 3
登録日時: 10年前

Re: アクションゲームを作っているのですが、障害物の判定で悩んでいます

#5

投稿記事 by yasyoshi » 10年前

ここのことでしょうか?

コード:


void teki()

{
    enemyy -= enemyg;
    
    enemyg -= 0.1;

    if(enemyy > jimen)
    {
        enemyy = jimen;
        enemyg = 0;
    }

	if((Playerx-32 < enemyx && enemyx <Playerx+32) && (Playery-32 < enemyy && enemyy < Playery+32))
    
    {
        DrawCircle( 320 , 240 , 150 , Cr , FALSE ) ;


    
    }

}

これは試験的に入れた『右にいる水色の人に触れたら丸を表示する』というものなのですが、常に表示されてますね…

閉鎖

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