キャラの移動の仕方が分かりません
-
jios
キャラの移動の仕方が分かりません
はじめまして、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;
}
間違っている部分などが有りましたら、ご指摘お願いします。
一応作成したプロジェクトをそのまま書きます。
#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;
}
間違っている部分などが有りましたら、ご指摘お願いします。
Re: キャラの移動の仕方が分かりません
コードはcodeタグで正しく囲み、かつインデントをきちんとしていただけると、読みやすくてありがたいです。
WinMain関数内に
この2本のwhile文があるのが気になります。
"charall.png"はカレントディレクトリに存在し、壊れていないファイルで、透明または真っ黒の画像ではないですか?
Handleが-1になっていないか(LoadDivGraphでエラーになっていないか)確認してください。
Log.txtに画像の読み込みエラーが出ていないか確認してください。
WinMain関数内に
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){"charall.png"はカレントディレクトリに存在し、壊れていないファイルで、透明または真っ黒の画像ではないですか?
Handleが-1になっていないか(LoadDivGraphでエラーになっていないか)確認してください。
Log.txtに画像の読み込みエラーが出ていないか確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
jios
Re: キャラの移動の仕方が分かりません
返信ありがとうございます。
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
を消して、
if(Handle == -1){
return -1;
}
Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);
のように書き換えたら画像は出たんですが、キャラクターの操作はできませんでした。そのほかには、画像のファイルはプロジェクトのフォルダに入っており、特に目立ったエラーは無かったです。
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
を消して、
if(Handle == -1){
return -1;
}
Handle = LoadDivGraph("charall.png",12,3,4,49,67,gh);
のように書き換えたら画像は出たんですが、キャラクターの操作はできませんでした。そのほかには、画像のファイルはプロジェクトのフォルダに入っており、特に目立ったエラーは無かったです。
-
jios
Re: キャラの移動の仕方が分かりません
変えたプログラムはこれですです。
#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;
}
#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: キャラの移動の仕方が分かりません
みけCAT さんの言われる通りcodeタグをお使い下さいね。
http://dixq.net/board/board.html
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: キャラの移動の仕方が分かりません
gpDraw関数内で使われているHandle変数はグローバル変数のそれです。
この変数にはLoadDivGraphの戻り値が入っており、成功なら0、失敗なら-1です。
この値はおそらくグラフィックハンドルとしては無効なので、gpDrawでのDrawRotaGraphでは画像が描画されず、
WinMain関数内のDrawGraph( 0, 0, gh[8], TRUE );の結果が描画されていると思います。
この処理では一定の位置に画像を描画しているため、操作はできないはずです。
この変数にはLoadDivGraphの戻り値が入っており、成功なら0、失敗なら-1です。
この値はおそらくグラフィックハンドルとしては無効なので、gpDrawでのDrawRotaGraphでは画像が描画されず、
WinMain関数内のDrawGraph( 0, 0, gh[8], TRUE );の結果が描画されていると思います。
この処理では一定の位置に画像を描画しているため、操作はできないはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: キャラの移動の仕方が分かりません
WinMain関数内のLoadDivGraphの後、whileのループに入る前でHandleにgh[8]を代入し、
WinMain関数内のwhileループ内のDrawGraph( 0, 0, gh[8], TRUE );を削除してください。
WinMain関数内のwhileループ内のDrawGraph( 0, 0, gh[8], TRUE );を削除してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: キャラの移動の仕方が分かりません
LoadDivGraphの戻り値であるHandleはハンドルではないので、ghを使わないと表示できません。
ghをgpDrawの引数にするか、ghをグローバル変数にする必要があります。
ghをgpDrawの引数にするか、ghをグローバル変数にする必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jios
Re: キャラの移動の仕方が分かりません
ご指摘ありがとうございました。
キャラクターを移動させることができました。
次はキャラクターを歩かせれるように作っていきたいと思うので、またわからないところが出てきたらその時もよろしくお願いします。
キャラクターを移動させることができました。
次はキャラクターを歩かせれるように作っていきたいと思うので、またわからないところが出てきたらその時もよろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: キャラの移動の仕方が分かりません
解決したコードを張ってくださいね。ここのルールと成っています。
codeタグの練習も兼ねられます。
あと投稿時に解決チェックをお願いします。
codeタグの練習も兼ねられます。
あと投稿時に解決チェックをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jios
Re: キャラの移動の仕方が分かりません
返信遅れました。
#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;
}