自作ゲームが謎の処理落ち

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

自作ゲームが謎の処理落ち

#1

投稿記事 by Rittai_3D » 12年前

こんにちは。3Dです。今回はタイトル通りです。自作ゲームの処理落ちが激しいです。
最近、プログラムから離れていましたが、今日久しぶりにゲーム開発を開始しました。

エラーは出ませんでしたが、fpsを確認してみましたところ、fpsが45.0程度しか出ていませんでした。
どこかで無駄な処理をしているのかと考え、描写部と更新部を同時にコメントアウトして実行してみましたところ、
描写も更新も行っていないにも関わらずfpsが45.0程度しか出ていません。

また、プログラムも、自機とボード程度しか実装しておりません。(目に見えるものはその程度ですが、fps処理やキー入力処理
も実装しております。)

自分が怪しいと思うところのコードです。また、他に

ゲームの総括
・Application.cpp
fpsの制御
・fps.cpp
キー入力
・Key.cpp
メイン(そのまんま
・main.cpp

があります。

汚いですがソースコードです。

Player.cpp

コード:

#include "Player.h"
#include "DxLib.h"
#include "Macro.h"
#include "Define.h"
#include "Key.h"
#include <math.h>

static const int	g_nImgSizeWid = 30, g_nImgSizeHei = 46;	// 画像サイズ

static const int	g_nImgPlyrPosX[] = { 0, 32, 64, 96, 128, 160, 192, 224, };
static const int	g_nImgPlyrPosY[] = { 0, 48, 96, };

typedef enum		// ドット絵の向き
{
	eMOVE_NOEMAL,	// 普通
	eMOVE_LEFT,		// 左向き
	eMOVE_RIGHT,	// 右向き
}
eMOVE;		// 名前が変なのですが、仮のものなのでご容赦ください

typedef struct Player_t
{
	int		nAnmMove;	// アニメーションの制御
	int		nCnt;		// カウンタ
	int		nImg;		// アニメーション
	int		nBombNum;	// ボム数
	int		nPlyrNum;	// 残機数
	int		nAliveFlag;	// 生存フラグ
	int		nImgHdl;	// 画像ハンドル
	double	x, y;
}
Player_t;

static Player_t		g_tagPlayer;

void Player_Init()
{
	memset( &g_tagPlayer, 0, sizeof( struct Player_t ) );
	g_tagPlayer.nAnmMove = eMOVE_NOEMAL;
	g_tagPlayer.nBombNum = 3;
	g_tagPlayer.nPlyrNum = 2;
	g_tagPlayer.x = 300.0;
	g_tagPlayer.y = 400.0;
}

int Player_Load()
{
	char pPath[256] = "dat/img/pl10.png";
	Player_Init();	// 初期化
	g_tagPlayer.nImgHdl = LoadGraph( pPath );
	if( g_tagPlayer.nImgHdl == -1 ) {
		return -1;
	}
	return 0;
}

void Player_Move()
{
	float x=0, y=0;

	if( KeyInput_Get( KEY_INPUT_UP    ) > 0 ) { y = -PLAYER_MOVE_SPD; }	// 移動
	if( KeyInput_Get( KEY_INPUT_DOWN  ) > 0 ) { y = +PLAYER_MOVE_SPD; }
	if( KeyInput_Get( KEY_INPUT_LEFT  ) > 0 ) { x = -PLAYER_MOVE_SPD; }
	if( KeyInput_Get( KEY_INPUT_RIGHT ) > 0 ) { x = +PLAYER_MOVE_SPD; }

	if( x && y ) {
		x /= sqrt( 2.0 );
		y /= sqrt( 2.0 );
	}

	g_tagPlayer.x += x, g_tagPlayer.y += y;

}

int Player_Update()
{
	Player_Move();		// 自機の移動

	g_tagPlayer.nCnt ++;
	g_tagPlayer.nImg = ( g_tagPlayer.nCnt % 24 ) / 3;	// アニメーション

	return 0;
}

void Player_Draw()
{
	DrawRectGraphF(	(float)g_tagPlayer.x, (float)g_tagPlayer.y,
					g_nImgPlyrPosX[ g_tagPlayer.nImg ], g_nImgPlyrPosY[ g_tagPlayer.nAnmMove ],
					g_nImgSizeWid, g_nImgSizeHei,
					g_tagPlayer.nImgHdl, TRUE, FALSE );
}

void Player_End()
{
	DeleteGraph( g_tagPlayer.nImgHdl );	// メモリからデータを削除
	g_tagPlayer.nImgHdl = NULL;
}
GameMgr.cpp

コード:

#include "GameMgr.h"
#include "DxLib.h"
#include "Board.h"
#include "Player.h"
#include "Macro.h"

int GameMgr_Load()
{
	if( Player_Load() ) return -1;
	if( Board_Load()  ) return -1;
	return 0;
}

int GameMgr_Update()
{
	if( Player_Update() ) return -1;
	return 0;
}

void GameMgr_Draw()
{
	Player_Draw();
	Board_Draw();
}

void GameMgr_End()
{
	Player_End();
	Board_End();
}
Board.cpp

コード:

#include "Board.h"
#include "DxLib.h"
#include "Macro.h"

#define		BOARD_NUM	4

typedef struct
{
	int		DestX, DestY;
	int		ScrX, ScrY;
	int		Width, Height;
}
Board_t;

static const Board_t csBoard[ BOARD_NUM ] =
{
	/*
	{描写X,描写Y,抜き出すX,抜き出すY,横,高さ}*/
	{   0,   0,  0,   0, 128, 480 },
	{ 512,   0,128,   0, 128, 480 },
	{ 128,   0,  0, 480, 384,  16 },
	{ 128, 464,  0, 496, 384,  16 },
};

static int g_ImgHdl;

int Board_Load()
{
	char pPath[128] = "dat/img/frontdisp.png";
	g_ImgHdl = NULL;
	g_ImgHdl = LoadGraph( pPath );

	if( g_ImgHdl == -1 ) {
		eprintfDx( "%s読み込み失敗", pPath );
		return -1;
	}

	return 0;
}

void Board_Draw()
{
	for( int i=0 ; i<BOARD_NUM ; i++ ) {
		DrawRectGraph(	csBoard[i].DestX,	csBoard[i].DestY,
						csBoard[i].ScrX,	csBoard[i].ScrY,
						csBoard[i].Width,	csBoard[i].Height,
						g_ImgHdl,			TRUE, FALSE);
	}
}

void Board_End()
{
	DeleteGraph( g_ImgHdl );
	g_ImgHdl = NULL;
}
【開発環境】
Visual Studio Express 2012 for Windows Desktop
Dxライブラリ( Ver 3.11b )
Window 7
初心者です

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

Re: 自作ゲームが謎の処理落ち

#2

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

よくあるパターンとしては、ScreenFlip関数を使用しているのに描画先を裏画面に設定していないというものがあります。
確認してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Rittai_3D
記事: 525
登録日時: 13年前

Re: 自作ゲームが謎の処理落ち

#3

投稿記事 by Rittai_3D » 12年前

>>みけCAT様

返信ありがとうございます。
みけCAT さんが書きました:よくあるパターンとしては、ScreenFlip関数を使用しているのに描画先を裏画面に設定していないというものがあります。
確認してみてください。
はい、その通りでした。SetDrawScreen( DX_SCREEN_BACK )を呼び出すはずが、SetDrawMode()になっていました。

お恥ずかしい...

というわけで解決しました。ありがとうございます。
初心者です

閉鎖

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