初心者ですが、画像を動かせません。

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

初心者ですが、画像を動かせません。

#1

投稿記事 by MASSA » 13年前

VC++とDXライブラリを使用して、
「画像をメモリに読み込んで表示し、上キーと下キーを押すと画像が上下に移動する」というプログラムを作りたくて、下のようなプログラムを書いてみたのですが

code

#include "DxLib.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}
int func_state = 0;
int x =220;
void draw_picture();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

switch(func_state){
case 0:
draw_picture();
default:
break;
}
ScreenFlip();
}

DxLib_End();
return 0;
}

void draw_picture(){
int image;
image = LoadGraph( "picture.png" ) ;
DrawGraph( 60 , x , image , FALSE ) ;
if(Key[KEY_INPUT_UP]==1) x=x-5;
if(Key[KEY_INPUT_DOWN]==1) x=x+5;
}

/code

上キーや下キーを押し続けても一度移動するだけなんです。
押している間は動かし続けたいのですが、どうすればよいでしょうか・・

初歩的な質問で申し訳ありません

アバター
ひよこ
記事: 25
登録日時: 14年前

Re: 初心者ですが、画像を動かせません。

#2

投稿記事 by ひよこ » 13年前

このプログラムのKeyは押されていたら1を足し、押されてなかったら0になるというものなので
押されていたら1、2と増えますので、==1ではなく>=1です。
if(Key[KEY_INPUT_UP]==1)
if(Key[KEY_INPUT_DOWN]==1)の部分を
if(Key[KEY_INPUT_UP]>=1)
if(Key[KEY_INPUT_DOWN]>=1)にします。
これで大丈夫だと思います。

MASSA

Re: 初心者ですが、画像を動かせません。

#3

投稿記事 by MASSA » 13年前

>ひよこ  さん

ありがとうございます。解決しました!!

本当に助かりました。

wing
記事: 18
登録日時: 14年前

Re: 初心者ですが、画像を動かせません。

#4

投稿記事 by wing » 13年前

解決してしまったようですが、
気になることを少し書きます。

case 0:
draw_picture();
のあとにbreak; がありません。

void draw_picture(){
int image;
image = LoadGraph( "picture.png" ) ;
DrawGraph( 60 , x , image , FALSE ) ;
if(Key[KEY_INPUT_UP]==1) x=x-5;
if(Key[KEY_INPUT_DOWN]==1) x=x+5;
}
ここでは毎フレームごとにDrawGraphされているんですが、
LoadGraphも同じように毎回なされています。
危険なので、
int image;
image = LoadGraph( "picture.png" ) ;
は、ループの外に移しましょう。
while(ProcessMessage()==0 &&.....の上の方にということです。

あと、y座標のところをXと書くのも変だと思います。

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

Re: 初心者ですが、画像を動かせません。

#5

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

wing さんが書きました:int image;
image = LoadGraph( "picture.png" ) ;
は、ループの外に移しましょう。
while(ProcessMessage()==0 &&.....の上の方にということです。
これをやる際は、int image;はWinMain関数の外に出しておかないと、
imageが定義されていないと怒られると思います。
注意してください。
勘違いだったらすみません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

Re: 初心者ですが、画像を動かせません。

#6

投稿記事 by MoNoQLoREATOR » 13年前

??
もっと簡単に書けるのでは?

コード:

#include "DxLib.h"

int image;
char key[256];
int x,y;

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);				
	if(DxLib_Init() == -1) return(-1);
	SetDrawScreen(DX_SCREEN_BACK);
	
	image = LoadGraph("image.png");
	
	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
         	ClsDrawScreen();
		
		GetHitKeyStateAll(key);
		
		//キーが押されていれば1が、
		//キーが押されていなければ0が格納されているので
		y -= key[KEY_INPUT_UP] * 5;
		y += key[KEY_INPUT_DOWN] * 5;
		x -= key[KEY_INPUT_LEFT] * 5;
		x += key[KEY_INPUT_RIGHT] * 5;

		DrawGraph(x,y, image, TRUE);
		
		ScreenFlip();
	}

	DxLib_End();
	return(0);
}
これだけでOK
ついでに四方向に移動できるようにしました。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 初心者ですが、画像を動かせません。

#7

投稿記事 by ISLe » 13年前

#GetHitKeyStateAll_2を使う場合も考慮して

コード:

        x += ((Key[KEY_INPUT_RIGHT] >= 1) - (Key[KEY_INPUT_LEFT] >= 1)) * 5;
        y += ((Key[KEY_INPUT_DOWN] >= 1) - (Key[KEY_INPUT_UP] >= 1))  * 5;
こんなふうにも書けますよ。

この書き方を懐かしいと感じるひとがプログラムを始めたころには掛け算がひとつふたつ減ることに大きな意味があったものですが。

閉鎖

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