お願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C.C

お願いします

#1

投稿記事 by C.C » 13年前

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;
}

C.C

Re: お願いします

#2

投稿記事 by C.C » 13年前

if(time >= 1)...はif(time >= 5000)...の間違いです。すみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: お願いします

#3

投稿記事 by softya(ソフト屋) » 13年前

えーと、まずフォーラムルールをご覧ください。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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

Re: お願いします

#4

投稿記事 by バグ » 13年前

こんな感じかな?コンパイルしてないので、ひょっとしたらエラーが出るかもしれませんがご勘弁を・・・

ただ、個人的にはこういう場合に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: お願いします

#5

投稿記事 by softya(ソフト屋) » 13年前

で問題点ですが「ゲームプログラミングの館」にある次のページをご覧ください。
「新・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さんが直して見て下さい。 ← 誤字修正
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

Re: お願いします

#6

投稿記事 by バグ » 13年前

>>【補足の補足】
と見直したら、バグさんのプログラムでxとyが入れ替わっているのと480までのガードが入って無かったですね。C.Cさんが直して見下さい。


あ・・・普通にやっちまってた(笑)
補足ありがとうございましたm(_ _)m

C.C

ありがとうございます

#7

投稿記事 by C.C » 13年前

全部やっていただいてありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ありがとうございます

#8

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:全部やっていただいてありがとうございます。
全部直ってませんよ。
と言うよ理解されてますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C

Re: ありがとうございます

#9

投稿記事 by C.C » 13年前

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: お願いします

#10

投稿記事 by softya(ソフト屋) » 13年前

OKだと思います。
ただ、元は480だったんですが450で良かったんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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