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;
}
お願いします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: お願いします
えーと、まずフォーラムルールをご覧ください。codeタグに使い方が書いてあります。
http://dixq.net/board/board.html
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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: お願いします
こんな感じかな?コンパイルしてないので、ひょっとしたらエラーが出るかもしれませんがご勘弁を・・・
ただ、個人的にはこういう場合にLoadGraphScreen関数を使用して毎回ファイルから画像をロードするのは、処理は重くなるし、ハードディスクへの負担も大きいしで、あまり良い事はないと思います。
なので、本来であれば、LoadGraph関数を使用してメモリに展開しておいた方がいいかなぁ・・・と思います。
ただ、個人的にはこういう場合に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;
}
最後に編集したユーザー バグ on 2012年4月24日(火) 16:41 [ 編集 2 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: お願いします
で問題点ですが「ゲームプログラミングの館」にある次のページをご覧ください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
4.LoadGraphScreenを使っている。
の問題を持っています。
LoadGraph()とDrawGrpah()に分けましょう。
あとC言語の基本事項ですが、int time, StartTime;の寿命は{}(ブロック)内です。
つまり、ループしていますのでループ1回毎に変数は一旦消滅します。
それと これだと処理順番的にStartTimeに代入した直後に差分しているので5000を超えることは絶対にありません。つねにtimeは0のはずです。
ブレークポイントを使ってデバッガで確認してみてください。
ループ内にSetDrawScreen( DX_SCREEN_BACK );やClearDrawScreen();が余分にあるのもよくありません。
関数の機能は必ずリファレンスで調べてから使うようにしましょう。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
【補足】
メインループの中に描画するループを入れる下記の書き方は良くないことです。
これだと480回ループが終わるまで、ProcessMessage()が呼び出されません。
なので、バグさんの書き方が正しいゲームプログラミングです。
【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見て下さい。 ← 誤字修正
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
4.LoadGraphScreenを使っている。
の問題を持っています。
LoadGraph()とDrawGrpah()に分けましょう。
あとC言語の基本事項ですが、int time, StartTime;の寿命は{}(ブロック)内です。
つまり、ループしていますのでループ1回毎に変数は一旦消滅します。
それと これだと処理順番的に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 );
}
なので、バグさんの書き方が正しいゲームプログラミングです。
【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見て下さい。 ← 誤字修正
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: お願いします
>>【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見下さい。
あ・・・普通にやっちまってた(笑)
補足ありがとうございましたm(_ _)m
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見下さい。
あ・・・普通にやっちまってた(笑)
補足ありがとうございましたm(_ _)m
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ありがとうございます
全部直ってませんよ。C.C さんが書きました:全部やっていただいてありがとうございます。
と言うよ理解されてますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ありがとうございます
すみません。理解はできてます。ですので言われたところを直してみました。どうでしょうか。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;
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: お願いします
OKだと思います。
ただ、元は480だったんですが450で良かったんでしょうか。
ただ、元は480だったんですが450で良かったんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。