ジャンプが上手く行きません。

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

ジャンプが上手く行きません。

#1

投稿記事 by keito940 » 8年前

アクションゲームを作ろうと思っているのですが…。ゲームプログラミングの館のコードを半ばパクリ知識を頼りにジャンプのアルゴリズムを組もうとしましたが、ジャンプがどうしても上手くプログラミングできません。前はできていたような気もするんですが…。具体的には、アクションゲームらしいジャンプではなくテレポートするジャンプや、チカチカするジャンプや、ジャンプの距離がおかしくなったりです。
今現在のコードは以下のとおりです。

コード:

#include "dxlib.h"
#include <math.h>

#define Grav 9.8067

int Key[256];
int gpUpdateKey() {
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey); 
		for (int i = 0; i < 256; i++){ 
			if (tmpKey[i] != 0) {
				Key[i]++;
			}
			else {
				Key[i] = 0;
			}
		}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
	if (DxLib_Init() == -1) {
		return -1;
	}
	SetDrawScreen(DX_SCREEN_BACK);
	int PlayerX = 8, PlayerY = 232, PlayerHandle, jflag = 0, dir = 0, time2, CurTime,JumpPower = 0, j_max;
	double JumpSpace = 0, time1;
	PlayerHandle = LoadGraph("テスト用.png");
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0&& gpUpdateKey() == 0) {
		//落下処理
		PlayerY -= JumpPower;
		JumpPower -= 1;
		//着地処理
		if (PlayerY > 230) {
			jflag = 0;
			PlayerY = 230;
			JumpPower = 0;
		}
		//移動処理
		if (Key[KEY_INPUT_RIGHT] >= 1) {//右に移動
			dir = 0;
			PlayerX += 5;
			Sleep(5);
		}
		if (Key[KEY_INPUT_LEFT] >= 1) {
			dir = 1;
			PlayerX -= 5;
			Sleep(5);
		}
		if (Key[KEY_INPUT_SPACE] == 1) { 
			JumpSpace = 0.250;
			time1 = GetNowCount();           
			jflag = 1;                          
		}
		if (jflag == 1) {
			time2 = GetNowCount();                  
			CurTime = (double)(time2 - time1) / 1000.000;  
			j_max = (int)((sqrt(2.000 * Grav * JumpSpace) * CurTime - 0.500 * Grav * CurTime* CurTime) * 232.000 / JumpSpace);
			JumpPower = j_max / CurTime;
		}
		if (dir == 0)
			DrawRotaGraph(PlayerX, PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
		else
			DrawRotaGraph(PlayerX, PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
	}
	DxLib_End();
	return 0;
}
よろしくお願いします。

hide

Re: ジャンプが上手く行きません。

#2

投稿記事 by hide » 8年前

現在のコードで起こる不具合はなんですか?

keito940
記事: 105
登録日時: 8年前

Re: ジャンプが上手く行きません。

#3

投稿記事 by keito940 » 8年前

移動や落下自体は完璧なんですが、ジャンプしようとすると、ハンドルされない例外が 0x0142B832 (アクションゲーム.exe) で発生しました: 0xC0000094: Integer division by zeroというエラーを吐いてしまいます。前のソースでは、ジャンプはできるのですが、一瞬で完了したり、ジャンプ距離が想定してない距離になったり、ジャンプすらできずにチカチカしてしまったりしてしまいます。また、落下のアルゴリズム自体完璧なんですが、そのアルゴリズムが動かないまま、空中にとどまったりしてしまいます。P.S.デバッグしてもだめでした。

hide

Re: ジャンプが上手く行きません。

#4

投稿記事 by hide » 8年前

デバッグしてもだめでした。
何をやったのか具体的に書きましょうか。やったけどダメでした、は無意味な報告です。
コードを◯◯のように変更してみたが、◯◯のエラーだった。
とかが最低限ないと「ふーんそうなんだ」で終わっちゃいます。
前のソースでは
このトピックを見ている人は前のソースの内容なんて知りません。それを言われてもどうにもならないです。

[hr]

ちなみに今回真っ先にやるべきは 0xC0000094: Integer division by zero を理解することです。
ググれば1発ですし、そもそも Integer division by zero をそのまま読んだ通り、0で割り算してしまったってことです。
0で割り算してはいけません。
コードの中で割り算をしているのはかなり絞られますね。うち、定数で割るものは0で割ることはないので、
この時点でどこで発生しているかは割り出されるでしょう。

keito940
記事: 105
登録日時: 8年前

Re: ジャンプが上手く行きません。

#5

投稿記事 by keito940 » 8年前

すいません、初歩的なミスばっかり(色んな意味で)でした。Re:ゼロからジャンプのコードを書き直した上にこのフォーラムのルールを学びきってから質問したいと思います。では、ありがとうございました。

metaphor

Re: ジャンプが上手く行きません。

#6

投稿記事 by metaphor » 8年前

コード:

#include "dxlib.h"
#include <math.h>
 
#define Grav 9.8067       //G[gravity]約 9.8 N 物理重力 加味 
 
int Key[256];           // キーが押されているフレーム数を格納する
int gpUpdateKey() {    // キーの入力状態を更新する
    char tmpKey[256]; // 現在のキーの入力状態を格納する
    GetHitKeyStateAll(tmpKey);     // 全てのキーの入力状態を得る
        for (int i = 0; i < 256; i++){ 
            if (tmpKey[i] != 0) {// i番のキーコードに対応するキーが押されていたら
                Key[i]++;       // 加算
            }else {            // 押されていなければ
                Key[i] = 0;   // 0にする[クリア]
            }
        }
    return 0;
}
int Init(){//初期化処理
    ChangeWindowMode(TRUE), SetGraphMode(640,480,32);//(320, 240, 32);//画面設定
	if (DxLib_Init() == -1) {                       //DxLib初期化処理
        exit(-1); // return -1;                    //DxLib初期化処理に失敗したらexit
	} SetDrawScreen(DX_SCREEN_BACK);return 0;     //ダブルバッファリング
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

    Init();//初期化処理
	                        //=232         
    int PlayerX = 8, PlayerY = 0, PlayerHandle, jflag = 0, dir = 0, time2, CurTime,JumpPower = 0, j_max;
    double JumpSpace = 0.250, time1;  //JumpSpace = 0
    //PlayerHandle = LoadGraph("テスト用.png")
	PlayerHandle = LoadGraph("d:/dat/テスト用.png");
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0&& gpUpdateKey() == 0) {
        //落下処理
        PlayerY -= JumpPower;   //ジャンプ力を加える:重力加味
        JumpPower -= 1;
        //着地処理
        if (PlayerY > 230) {
            jflag = 0;      //フラグ=0
            PlayerY = 230; //着地点
            JumpPower = 0;//ジャンプ力なし
        }
        //キー入力処理 移動処理
        if (Key[KEY_INPUT_RIGHT] >= 1) {//右に移動
            dir = 0;                   //Direction=0
            PlayerX += 5;
            Sleep(5);
        }
        if (Key[KEY_INPUT_LEFT] >= 1) {//左に移動
            dir = 1;                  //Direction=1
            PlayerX -= 5;
            Sleep(5);
        }
        if (Key[KEY_INPUT_SPACE] == 1) {//スペースキーでジャンプ 
            JumpSpace = 0.250;
            time1 = GetNowCount();    // 60FPSとして60で1秒          
            jflag = 1;                          
        }
        if (jflag == 1) {                                   //フラグ処理
            time2 = GetNowCount();                         // 60FPSとして60で1秒                 
            CurTime = (double)(time2 - time1) / 1000.000; //カレントタイムを計算 
            j_max = (int)((sqrt(2.000 * Grav * JumpSpace) * CurTime - 0.500 * Grav * CurTime* CurTime) * 232.000 / JumpSpace);
            JumpPower = j_max / CurTime;                //ジャンプ力
        }
        if (dir == 0)
            DrawRotaGraph(PlayerX, PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
        else
            DrawRotaGraph(PlayerX, PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);//??? 上と同じコードに見える
	    }
    //}
    DxLib_End();//// DXライブラリ終了処理
    return 0;//mainの終了
}

ここで0で除算してます。

コード:

       if (jflag == 1) {                                   //フラグ処理
            time2 = GetNowCount();                         // 60FPSとして60で1秒                 
            CurTime = (double)(time2 - time1) / 1000.000; //カレントタイムを計算 
            j_max = (int)((sqrt(2.000 * Grav * JumpSpace) * CurTime - 0.500 * Grav * CurTime* CurTime) * 232.000 / JumpSpace);
            JumpPower = j_max / CurTime;                //ジャンプ力
        }

metaphor

Re: ジャンプが上手く行きません。

#7

投稿記事 by metaphor » 8年前

あ、失礼間違えてました。(2行は明らかに違います)

コード:

        if (dir == 0)
            DrawRotaGraph(PlayerX, PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
        else
            DrawRotaGraph(PlayerX, PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
        }

閉鎖

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