自機の画像が表示されない

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

自機の画像が表示されない

#1

投稿記事 by dast » 14年前

こんにちは。プログラミングの勉強をし始めた初心者です。
メニュー表示→ゲームスタートを選ぶとゲーム画面に移行→ゲーム画面で左右キーを押すと自機が動く
というプログラムを作ったのですが、ゲーム画面で自機が表示されません。プログラムソースは以下の通りです。

コード:

#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 Back1;
int Waku1;
int Waku2;
int mode;
int SelectNum;
int ziki_img[12];

//構造体の用意
// メニュー用構造体
typedef struct{
	int x, y;       // 座標格納用変数
	char name[128]; // 項目名格納用変数
} MenuElement_t ;

// 自機データ構造体
typedef struct{
	int x, y;       // 座標格納用変数
	int maxx;       // 移動範囲右端
	int minx;       // 移動範囲左端
	int cnt;        // 画像ループ用変数
	int no;         // 画像ループ用変数
	int z;          // 残機数
	int b;          // 残りボム数
} ziki_t ;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
		//ウィンドウモードに設定,DXライブラリ初期化処理,描画先を裏画面に設定

//構造体
		// メニュー項目要素
		MenuElement_t MenuElement[4]={
			{ 260, 285, "ゲームスタート" }, // タグの中身の順番で格納される。xにが、yにが、nameに"ゲームスタート"が
			{ 280, 335, "おまけ" },
			{ 280, 385, "コンフィグ" },
			{ 280, 435, "ゲーム終了" },
		};
		// 自機データ
		ziki_t ziki={200,444,619,20,0,0,3,3};

//変数
		//変数への数値の代入
		mode = 0;
		SelectNum = 0;                   // 現在の選択番号
		ziki.x = (ziki.maxx+ziki.minx)/2;// 自機初期位置
		ziki.no =(ziki.cnt%48)/12;            // 画像ループ用変数設定

		//変数への画像の格納
		Back1 = LoadGraph("画像/システム/神社周辺.png");
		Waku1 = LoadGraph("画像/システム/枠.png");
		Waku2 = LoadGraph("画像/システム/パラメータ表示部分.png");
		LoadDivGraph("画像/キャラ/自機.png",12,3,4,40,40,ziki_img);



		//ループ部分
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 & gpUpdateKey()==0 ){//while(裏画面の物を表画面に写す,メッセージ処理,画面を消去,キーの状態の更新)
			if(mode==0){
				mode=10;
			}
//タイトル画面
			else if(mode==10){
				                                     //計算フェーズ
				                                      //下方向への移動
				if( Key[ KEY_INPUT_DOWN ] == 1 ){      // 下キーが押された瞬間だけ処理
					SelectNum = ( SelectNum + 1 ) % 4; // 現在の選択項目を一つ下にずらす(ループする)
					for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
						if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
							MenuElement[i].x = 260;     // 座標をにする
						} else {                       // 今処理しているのが、選択番号以外なら
							MenuElement[i].x = 280;    // 座標をにする
						}
					}
				}
				                                      //上方向への移動
				if( Key[ KEY_INPUT_UP ] == 1 ){        // 上キーが押された瞬間だけ処理
					SelectNum = ( SelectNum + 3 ) % 4; // 現在の選択項目を一つ上にずらす(逆ループする)
					for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
						if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
							MenuElement[i].x = 260;     // 座標をにする
						} else {                       // 今処理しているのが、選択番号以外なら
							MenuElement[i].x = 280;    // 座標をにする
						}
					}
				}
				if( Key[ KEY_INPUT_A] == 1 ){
					if(SelectNum == 0){
						mode=20;
					}
					if(SelectNum == 3){
						break;
					}
				}
				                                     //描画フェーズ
				for( int i=0; i<4; i++ ){ // メニュー項目を描画
					DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
				}

			}
//ゲーム画面
			else if(mode==20){
				                                     //計算フェーズ
				                                                //自機の設定
				if(Key[KEY_INPUT_LEFT]>=1 && ziki.x>=ziki.minx && Key[KEY_INPUT_RIGHT]==0){    //右キーが押されている間
					ziki.no += 8;
					ziki.x -=2;
				}
				if(Key[KEY_INPUT_RIGHT]>=1 && ziki.x<=ziki.maxx && Key[KEY_INPUT_LEFT]==0){
					ziki.no += 4;
					ziki.x +=2;
				}
				                                     //描画フェーズ
				DrawGraph(0,0,Waku1,TRUE);
				DrawGraph(20,15,Waku2,TRUE);
				DrawGraph(20,80,Back1,TRUE);
				DrawRotaGraph(ziki.x,444,1.0,0.0,ziki_img[ziki.no],TRUE);
			}

	}

        DxLib_End();    // DXライブラリ終了処理
        return 0;
}
Logファイルを確認してみても画像はしっかり読みこまれているのに表示されません。
134行目をDrawRotaGraph(300,444,1.0,0.0,ziki_img[0],TRUE);
と変えても表示されませんでした。
一体どうしたら画像が表示されるようになるでしょうか?
ご教授よろしくお願いします。
あと、このレスを書いている時にテキストボックスのスクロールバーがおかしな動き(下、左、右キーを押すとバーが上に少し上がったり、上を押すとバーが少し下がったり、時々荒ぶったりする)をしていたのですが、これはどうしたら解消できるでしょうか?

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

Re: 自機の画像が表示されない

#2

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

読み込んだのは違う画像ですがこちらでは表示されました。
画像自体に問題があるのかも知れません。
もっと簡単なプログラムで表示を確認してみてください。

あと ziki.no += 4;とかziki.no += 8;としているので左右に移動するとありえないほど大きな数字になります。
アニメーション目的なら、 ziki.noの毎ループ毎の初期設定が必要です。

>あと、このレスを書いている時にテキストボックスのスクロールバーがおかしな動き(下、左、右キーを押すとバーが上に少し上がったり、上を押すとバーが少し下がったり、時々荒ぶったりする)をしていたのですが、これはどうしたら解消できるでしょうか?

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

dast

Re: 自機の画像が表示されない

#3

投稿記事 by dast » 14年前

別のプログラムで問題の画像の表示を確認したところちゃんとアニメーションを表示できました。
それでやっぱりziki.noの初期化が無いのがまずいのかと思い、121行目と122行目の間にziki.no =(ziki.cnt%48)/12;と書いた行を差し込んでみましたがどうにもなりませんでした。この場合どうすればいいと思いますか?
あとスクロールバー云々の話はスルーして貰っても構いません。実際に起こった事をそのまま書いたら自分でも意味不明な文になったので…
ありのまま(ryというやつです。

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

Re: 自機の画像が表示されない

#4

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

大雑把な切り分け法ですがDrawGraph(0,0,ziki_img[0],TRUE);で表示されるならDrawRotaGraph(ziki.x,444,1.0,0.0,ziki_img[ziki.no],TRUE);時に何処かに変数値に問題があると思います。

あとDrawGraph(0,0,ziki_img[0],TRUE);で表示されない場合は、DrawGraph(0,0,ziki_img[0],TRUE);を色んな所に移動してどうすれば表示されるか確認してみてください。表示されれば制御など別の原因です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast

Re: 自機の画像が表示されない

#5

投稿記事 by dast » 14年前

色々試してみてやっとできました。あといままで表示されなかった理由がやっと分かりました。

LoadDivGraph("画像/キャラ/自機.png",12,3,4,40,40,ziki_img);←70行目のコレを
LoadDivGraph("画像/キャラ/自機.png",12,4,3,40,40,ziki_img);←こうしたらできました。

……つまらぬことで騒ぎ立てて本当に申し訳ございませんでした。
ちょっと納豆の糸で首吊って出直してきますorz

閉鎖

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