キャラの移動の仕方が分かりません

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

キャラの移動の仕方が分かりません

#1

投稿記事 by jios » 12年前

はじめまして、jiosといいます。今、新・ゲームプログラミングの館さんの「 3.1章 キーの入力に応じてキャラを動かす 」を見ています。一枚の絵のキャラクターの移動に関してはなんとなくですが理解することができました。しかし、RPGなどでよく使われる勇者の絵でプロジェクトを組んだら画面に絵が出なくなってしまいました。
一応作成したプロジェクトをそのまま書きます。
#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key++; // 加算
} else { // 押されていなければ
Key = 0; // 0にする
}
}
return 0;
}

int x=320, y=240;
int Handle;

void gpCalc(){
if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
x++;
}
if( Key[ KEY_INPUT_DOWN ] >= 1 ){
y++;
}
if( Key[ KEY_INPUT_LEFT ] >= 1 ){
x--;
}
if( Key[ KEY_INPUT_UP ] >= 1 ){
y--;
}
}

void gpDraw(){
DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE );
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

int gh[12];

Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

DrawGraph( 0, 0, gh[8], TRUE );

}

// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

gpCalc();

gpDraw();
}

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

間違っている部分などが有りましたら、ご指摘お願いします。

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

Re: キャラの移動の仕方が分かりません

#2

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

コードはcodeタグで正しく囲み、かつインデントをきちんとしていただけると、読みやすくてありがたいです。

WinMain関数内に

コード:

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
この2本のwhile文があるのが気になります。
"charall.png"はカレントディレクトリに存在し、壊れていないファイルで、透明または真っ黒の画像ではないですか?
Handleが-1になっていないか(LoadDivGraphでエラーになっていないか)確認してください。
Log.txtに画像の読み込みエラーが出ていないか確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jios

Re: キャラの移動の仕方が分かりません

#3

投稿記事 by jios » 12年前

返信ありがとうございます。

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

を消して、

if(Handle == -1){
return -1;
}
Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);

のように書き換えたら画像は出たんですが、キャラクターの操作はできませんでした。そのほかには、画像のファイルはプロジェクトのフォルダに入っており、特に目立ったエラーは無かったです。

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

Re: キャラの移動の仕方が分かりません

#4

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

書き換えた後のコード全体をcodeタグを使って貼ってもらえますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jios

Re: キャラの移動の仕方が分かりません

#5

投稿記事 by jios » 12年前

変えたプログラムはこれですです。


#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){

char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る

for( int i=0; i<256; i++ ){
if( tmpKey != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key++; // 加算
} else { // 押されていなければ
Key = 0; // 0にする
}
}
return 0;
}

int x=320, y=240;
int Handle;

void gpCalc(){
if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
x++;
}
if( Key[ KEY_INPUT_DOWN ] >= 1 ){
y++;
}
if( Key[ KEY_INPUT_LEFT ] >= 1 ){
x--;
}
if( Key[ KEY_INPUT_UP ] >= 1 ){
y--;
}
}

void gpDraw(){
DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE );
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

int gh[12];
if( Handle == -1 )
{
return -1 ;
}
Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);


// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

DrawGraph( 0, 0, gh[8], TRUE );

gpCalc();

gpDraw();
}

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

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

Re: キャラの移動の仕方が分かりません

#6

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

みけCAT さんの言われる通りcodeタグをお使い下さいね。
http://dixq.net/board/board.html
jios さんが書きました:変えたプログラムはこれですです。

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){

	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る

	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int x=320, y=240;
int Handle;

void gpCalc(){
	if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
		x++;
	}
	if( Key[ KEY_INPUT_DOWN  ] >= 1 ){
		y++;
	}
	if( Key[ KEY_INPUT_LEFT  ] >= 1 ){
		x--;
	}
	if( Key[ KEY_INPUT_UP    ] >= 1 ){
		y--;
	}
}

void gpDraw(){
        DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE );
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

		int gh[12];
		if( Handle == -1 )       
		{
			return -1 ;         
		}
        Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);
		

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

				DrawGraph( 0, 0, gh[8], TRUE );

                gpCalc();

                gpDraw();
		}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: キャラの移動の仕方が分かりません

#7

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

gpDraw関数内で使われているHandle変数はグローバル変数のそれです。
この変数にはLoadDivGraphの戻り値が入っており、成功なら0、失敗なら-1です。
この値はおそらくグラフィックハンドルとしては無効なので、gpDrawでのDrawRotaGraphでは画像が描画されず、
WinMain関数内のDrawGraph( 0, 0, gh[8], TRUE );の結果が描画されていると思います。
この処理では一定の位置に画像を描画しているため、操作はできないはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jios

Re: キャラの移動の仕方が分かりません

#8

投稿記事 by jios » 12年前

返信ありがとうございます。
ではどのような方法だったら表示することが可能ですか?

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

Re: キャラの移動の仕方が分かりません

#9

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

WinMain関数内のLoadDivGraphの後、whileのループに入る前でHandleにgh[8]を代入し、
WinMain関数内のwhileループ内のDrawGraph( 0, 0, gh[8], TRUE );を削除してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: キャラの移動の仕方が分かりません

#10

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

LoadDivGraphの戻り値であるHandleはハンドルではないので、ghを使わないと表示できません。
ghをgpDrawの引数にするか、ghをグローバル変数にする必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jios

Re: キャラの移動の仕方が分かりません

#11

投稿記事 by jios » 12年前

ご指摘ありがとうございました。

キャラクターを移動させることができました。

次はキャラクターを歩かせれるように作っていきたいと思うので、またわからないところが出てきたらその時もよろしくお願いします。

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

Re: キャラの移動の仕方が分かりません

#12

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

解決したコードを張ってくださいね。ここのルールと成っています。
codeタグの練習も兼ねられます。
あと投稿時に解決チェックをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jios

Re: キャラの移動の仕方が分かりません

#13

投稿記事 by jios » 12年前

返信遅れました。

コード:

#include "DxLib.h"
 
int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
 
    char tmpKey[256]; // 現在のキーの入力状態を格納する
    GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
 
    for( int i=0; i<256; i++ ){ 
        if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
            Key[i]++;     // 加算
        } else {              // 押されていなければ
            Key[i] = 0;   // 0にする
        }
    }
    return 0;
}
 
int x=320, y=240;
int Handle;
 
void gpCalc(){
    if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
        x++;
    }
    if( Key[ KEY_INPUT_DOWN  ] >= 1 ){
        y++;
    }
    if( Key[ KEY_INPUT_LEFT  ] >= 1 ){
        x--;
    }
    if( Key[ KEY_INPUT_UP    ] >= 1 ){
        y--;
    }
}
 
void gpDraw(){
        DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE );
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
        int gh[12];
        if( Handle == -1 )       
        {
            return -1 ;         
        }
        Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);
        
        Handle = gh[8];
 
        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
 
                gpCalc();
 
                gpDraw();
        }
 
    DxLib_End(); // DXライブラリ終了処理
    return 0;
}

閉鎖

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