ページ 11

サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 10:57
by エルフ
サンプルプログラムが実行できません
そのまま打ったつもりなんですが・・
見直してもわかりません。
どこが間違ってますか?
DXライブラリです。

コード:

#include <DxLib.h>

//グローバル変数
//時間計算用変数
int g_lasttime = 0;     //直前の計測時間
float g_frametime = 0;  //1ループにかかった時間


int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC)
{
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//DX ライブラリ初期化
	if (DxLib_Init() == -1) return -1;

	//画像を読み込み
	int ghandle = LoadGraph("media/smp1_chara01.png");
	float x = 0, y = 0;

	SetDrawScreen(DX_SCREEN_BACK);
	g_lasttime = GetNowCount();  //現在時刻の記憶
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		//1ループにかかった時間を計測
		int curtime = GetNowCount();
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;

		ClearDrawScreen();
		//自キャラ移動
		int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		float mv = 80,0f * g_frametime; //移動量計算
		if (key & PAD_INPUT_UP)      y -= mv;
		if (key & PAD_INPUT_DOWN)    y += mv;
		if (key & PAD_INPUT_LEFT)    x -= mv;
		if (key & PAD_INPUT_RIGHT)   x += mv;
		DrawGraph(x, y, ghandle, TRUE);
		clsDx();
		printfDx("%d : %f : %f", g_lasttime, g_frametime, mv);
		ScreenFlip();
	}

	//待機
	WaitKey();
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 11:02
by みけCAT
32行目のカンマは、ピリオドの打ち間違いではないですか?

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 11:06
by エルフ
みけCATさん
わかりませんでした・・・
ありがとうございます
ですが警告がでるのですが・・
warning C4244: '引数' : 'float' から 'int' への変換です。データが失われる可能性があります。

どうしたら解決できますか?

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 11:16
by みけCAT
DrawGraph関数の代わりにDrawGraphF関数を使えばいいと思います。

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 11:22
by エルフ
みけCATさん
DrawGraphFとは書かれてないので、本が悪いのかな・・?
ありがとうございました

コード:

#include <DxLib.h>

//グローバル変数
//時間計算用変数
int g_lasttime = 0;     //直前の計測時間
float g_frametime = 0;  //1ループにかかった時間


int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC)
{
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//DX ライブラリ初期化
	if (DxLib_Init() == -1) return -1;

	//画像を読み込み
	int ghandle = LoadGraph("media/smp1_chara01.png");
	float x = 0, y = 0;

	SetDrawScreen(DX_SCREEN_BACK);
	g_lasttime = GetNowCount();  //現在時刻の記憶
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		//1ループにかかった時間を計測
		int curtime = GetNowCount();
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;

		ClearDrawScreen();
		//自キャラ移動
		int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		float mv = 80.0f * g_frametime; //移動量計算
		if (key & PAD_INPUT_UP)      y -= mv;
		if (key & PAD_INPUT_DOWN)    y += mv;
		if (key & PAD_INPUT_LEFT)    x -= mv;
		if (key & PAD_INPUT_RIGHT)   x += mv;
		DrawGraphF(x, y, ghandle, TRUE);
		clsDx();
		printfDx("%d : %f : %f", g_lasttime, g_frametime, mv);
		ScreenFlip();
	}

	//待機
	WaitKey();
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 11:22
by エルフ
解決しました

Re: サンプルプログラムが実行できません

Posted: 2014年9月07日(日) 13:54
by Hiragi(GKUTH)
>>warning C4244: '引数' : 'float' から 'int' への変換です。データが失われる可能性があります。

は、float型から強制的にint型に変換(っぽい)するということです。
DrawGraphは描画する座標をintとして受け取るので、int型にしてやらないといけません。
てわけで小数点以下を切り捨てるときに精度が落ちるよ的な警告を発しているのだと思います。
このコードの場合あまり影響ないと思います。特に本が悪いとか言うことではありません。

ちなみにDrawGraphFは隠し関数でリファレンスには載っていません。
小数点を含む座標を渡すと少し補完して綺麗に描画してくれるようです。

ちなみにFが付く関数は描画系関数に関しては大体あります。

DxLib.h の 2400行目あたりから

コード:

extern	int			DrawGraphF(               float xf, float yf,                                                                       int GrHandle, int TransFlag ) ;							// 画像の描画( 座標指定が float 版 )
extern	int			DrawExtendGraphF(         float x1f, float y1f, float x2f, float y2,                                                int GrHandle, int TransFlag ) ;							// 画像の拡大描画( 座標指定が float 版 )
extern	int			DrawRotaGraphF(           float xf, float yf,                       double ExRate,                    double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE  ) ;	// 画像の回転描画( 座標指定が float 版 )
extern	int			DrawRotaGraph2F(          float xf, float yf, float cxf, float cyf, double ExtRate,                   double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE  ) ;	// 画像の回転描画2( 回転中心指定付き )( 座標指定が float 版 )
extern	int			DrawRotaGraph3F(          float xf, float yf, float cxf, float cyf, double ExtRateX, double ExtRateY, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ; 	// 画像の回転描画3( 回転中心指定付き+縦横拡大率別指定版 )( 座標指定が float 版 )
extern	int			DrawModiGraphF(           float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4,           int GrHandle, int TransFlag ) ;							// 画像の自由変形描画( 座標指定が float 版 )
extern	int			DrawTurnGraphF(           float xf, float yf,