ページ 1 / 1
お願いします
Posted: 2012年4月24日(火) 15:35
by C.C
5秒後に画像を移動させたいのですが画像が動きません。教えていただけないでしょうか。
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(true) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
int time, StartTime;
SetDrawScreen( DX_SCREEN_BACK );
LoadGraphScreen( 0, 0, "block.jpg", true );
StartTime = GetNowCount();
time = GetNowCount() - StartTime;
if(time >= 1){
for(int i = 0; i <= 480; i++){
ClearDrawScreen();
LoadGraphScreen( 0, i, "block.jpg", true );
}
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
Re: お願いします
Posted: 2012年4月24日(火) 15:38
by C.C
if(time >= 1)...はif(time >= 5000)...の間違いです。すみません。
Re: お願いします
Posted: 2012年4月24日(火) 16:15
by softya(ソフト屋)
えーと、まずフォーラムルールをご覧ください。codeタグに使い方が書いてあります。
http://dixq.net/board/board.html
コード:
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(true) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
int time, StartTime;
SetDrawScreen( DX_SCREEN_BACK );
LoadGraphScreen( 0, 0, "block.jpg", true );
StartTime = GetNowCount();
time = GetNowCount() - StartTime;
if(time >= 5000){
for(int i = 0; i <= 480; i++){
ClearDrawScreen();
LoadGraphScreen( 0, i, "block.jpg", true );
}
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
Re: お願いします
Posted: 2012年4月24日(火) 16:20
by バグ
こんな感じかな?コンパイルしてないので、ひょっとしたらエラーが出るかもしれませんがご勘弁を・・・
ただ、個人的にはこういう場合にLoadGraphScreen関数を使用して毎回ファイルから画像をロードするのは、処理は重くなるし、ハードディスクへの負担も大きいしで、あまり良い事はないと思います。
なので、本来であれば、LoadGraph関数を使用してメモリに展開しておいた方がいいかなぁ・・・と思います。
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
// 初期化処理
if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1)
{
// 初期化失敗
return -1;
}
// 裏画面モードに設定
SetDrawScreen(DX_SCREEN_BACK);
char Key[256]; // キー入力格納用配列
int x = 0; // 画像の描画先X座標
int StartTime = GetNowCount(); // 開始時間の保持
// メインループ
while (!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE])
{
// 開始時間からの経過時間を計算する
int time = GetNowCount() - StartTime;
// 5秒以上経過している場合に座標をインクリメントする
if (time >= 5000)
{
++x;
}
// 描画する
LoadGraphScreen(x, 0, "block.jpg", TRUE);
ScreenFlip();
}
// 終了処理
DxLib_End();
return 0;
}
Re: お願いします
Posted: 2012年4月24日(火) 16:23
by softya(ソフト屋)
で問題点ですが「ゲームプログラミングの館」にある次のページをご覧ください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
4.LoadGraphScreenを使っている。
の問題を持っています。
LoadGraph()とDrawGrpah()に分けましょう。
あとC言語の基本事項ですが、int time, StartTime;の寿命は{}(ブロック)内です。
つまり、ループしていますのでループ1回毎に変数は一旦消滅します。
それと
コード:
StartTime = GetNowCount();
time = GetNowCount() - StartTime;
これだと処理順番的にStartTimeに代入した直後に差分しているので5000を超えることは絶対にありません。つねにtimeは0のはずです。
ブレークポイントを使ってデバッガで確認してみてください。
ループ内にSetDrawScreen( DX_SCREEN_BACK );やClearDrawScreen();が余分にあるのもよくありません。
関数の機能は必ずリファレンスで調べてから使うようにしましょう。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
【補足】
メインループの中に描画するループを入れる下記の書き方は良くないことです。
コード:
for(int i = 0; i <= 480; i++){
ClearDrawScreen();
LoadGraphScreen( 0, i, "block.jpg", true );
}
これだと480回ループが終わるまで、ProcessMessage()が呼び出されません。
なので、バグさんの書き方が正しいゲームプログラミングです。
【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見て下さい。 ← 誤字修正
Re: お願いします
Posted: 2012年4月24日(火) 16:35
by バグ
>>【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見下さい。
あ・・・普通にやっちまってた(笑)
補足ありがとうございましたm(_ _)m
ありがとうございます
Posted: 2012年4月24日(火) 16:50
by C.C
全部やっていただいてありがとうございます。
Re: ありがとうございます
Posted: 2012年4月24日(火) 16:58
by softya(ソフト屋)
C.C さんが書きました:全部やっていただいてありがとうございます。
全部直ってませんよ。
と言うよ理解されてますか?
Re: ありがとうございます
Posted: 2012年4月27日(金) 11:18
by C.C
softya(ソフト屋) さんが書きました:C.C さんが書きました:全部やっていただいてありがとうございます。
全部直ってませんよ。
と言うよ理解されてますか?
すみません。理解はできてます。ですので言われたところを直してみました。どうでしょうか。
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
// 初期化処理
if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1)
// 初期化失敗
return -1;
// 裏画面モードに設定
SetDrawScreen(DX_SCREEN_BACK);
char Key[256]; // キー入力格納用配列
int y = 0; // 画像の描画先X座標
int StartTime = GetNowCount(); // 開始時間の保持
int Image = LoadGraph("block.jpg");
// メインループ
while (!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE]){
// 開始時間からの経過時間を計算する
int time = GetNowCount() - StartTime;
// 5秒以上経過している場合に座標をインクリメントする
if (time >= 5000 && y < 450) ++y;
// 描画内容を削除して画像描画する
DrawGraph(0, y, Image, true);
ScreenFlip();
}
// 終了処理
DxLib_End();
return 0;
}
Re: お願いします
Posted: 2012年4月27日(金) 15:35
by softya(ソフト屋)
OKだと思います。
ただ、元は480だったんですが450で良かったんでしょうか。