龍神録の5章を応用したプログラムが上手くいかない

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

龍神録の5章を応用したプログラムが上手くいかない

#1

投稿記事 by dast » 14年前

何度もお世話になっています。プログラミングの勉強をしながら龍神録プログラミングの館を見ている初心者です。
龍神録の7章を応用して(とはいってもほとんど変わりませんが)プログラムを組んでみたのですが、どうも上手くいきません。
ビルドは上手くいくのですがウィンドウの中に画像が表示されず、代わりにfunc_stateのエラー用に用意された「不明なfunc_state」の文がウィンドウの上から下まで表示され続けるという結果になってしまいます。どうしたらいいか教えてください。

プログラムの内容

char.cpp

コード:

#include "../ヘッダー/GV.h"

void calc_ch(){//画像ループ用関数
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}
graph.cpp

コード:

#include "../ヘッダー/GV.h"

void graph_ch(){
	DrawRotaGraph(ch.x,444,1.0,0.0,img[0],TRUE);
}//graph_ch()の中にimgの0番(自機の上向き画像)の作画作業を入れる

void graph_board(){
	DrawGraph(0,0,img_board[10],TRUE);
}

void graph_main(){//描画メイン
	graph_ch();
}//graph_main()の中にgraph_ch()を入れる
ini.cpp

コード:

#include "../ヘッダー/GV.h"

//初期化関数
void first_ini(){//初期化
	ch.x=FIELD_MAX_X/2;//初期の自機座標の設定
}
key.cpp

コード:

#include "../ヘッダー/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}
int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}
load.cpp

コード:

#include "../ヘッダー/GV.h"
void load(){//データをロードする
	img_board[10] = LoadGraph("画像/システム/枠.png");
	img_back[10] = LoadGraph("画像/背景/神社周辺.png");
	LoadDivGraph("画像/キャラグラ/自機.png",12,3,4,38,41,img);
}
main01.cpp

コード:

#define GLOBAL_INSTANCE
#include "../ヘッダー/GV.h"


//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	load();//function.hの関数load()を実行する

    while(ProcessLoop()==0){//ProcessLoopの内容を行う
		switch(func_state){
			case 0://func_stateが0の時
				load();//function.hの関数load()を実行する
				first_ini();//function.hの関数first_ini()を実行する
				func_state = 100;//func_stateを100にする
				break;
			case 100:
				calc_ch();//function.hの関数calc_ch()を実行する
				graph_main();//function.hの関数graph_main()を実行する
				break;
			default://上記のcase以外の場合
				printfDx("不明なfunc_state\n");
				break;
		}

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク



        //ココ!!



        ScreenFlip();
    }

    DxLib_End();
    return 0;
}

define.h

コード:

#include"struct.h"
#define FIELD_MAX_X 619
#define FIELD_X 20
function.h

コード:

//graph.cpp
GLOBAL void graph_main();//描画メイン

//key.cpp
GLOBAL int GetHitKeyStateAll_2();//現在のキー入力を行う
GLOBAL int CheckStateKey(unsigned char Handle);//受け取ったキー番号の現在の入力状態を返す

//load.cpp
GLOBAL void load();//データをロードする

//ini.ccp
GLOBAL void first_ini();//初期化する

//char.cpp
GLOBAL void calc_ch();//画像のループさせる為の準備
GV.h

コード:

#include "DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include"function.h"//関数宣言(function.hの読み込み)

//画像用変数宣言部分
GLOBAL int img[12];//自機画像
GLOBAL int img_board[10];//枠画像
GLOBAL int img_back[10];//一面背景

//構造体変数宣言部分
GLOBAL ch_t ch;

//メインループ用変数宣言部分
GLOBAL int func_state;
struct.h

コード:

typedef struct{
	int cnt;       //画像処理の為のカウンタ
	int num;       //残機数
	int score;     //スコア
	int mutekicnt; //無敵状態とカウント
	int img;       //画像
	double x,y;    //座標
}ch_t;

追記
実行結果の画像も貼りたかったのですがどうやって画像を貼るのかが分かりませんでしたorz
やり方を教えてくれると幸いです

box
記事: 2002
登録日時: 15年前

Re: 龍神録の5章を応用したプログラムが上手くいかない

#2

投稿記事 by box » 14年前

dast さんが書きました:

コード:

			default://上記のcase以外の場合
				printfDx("不明なfunc_state\n");
				break;
私だったら、func_stateの値「も」出力するようなコードを書きます。
どこかで何か変なことをした結果、0や100以外の値が入っているかもしれませんので。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 15年前

Re: 龍神録の5章を応用したプログラムが上手くいかない

#3

投稿記事 by box » 14年前

あと、今回の件と関係があるかどうかはわかりませんが、
dast さんが書きました:

コード:

GLOBAL int img_board[10];//枠画像
GLOBAL int img_back[10];//一面背景
このように定義していますので、img_board[]やimg_back[]の使える添字の範囲は
0~9です。ところが、
dast さんが書きました:

コード:

void graph_board(){
	DrawGraph(0,0,img_board[10],TRUE);
}
void load(){//データをロードする
	img_board[10] = LoadGraph("画像/システム/枠.png");
	img_back[10] = LoadGraph("画像/背景/神社周辺.png");
}
上記のコード群では配列の定義範囲外の領域にアクセスしています。
大丈夫でしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

dast

Re: 龍神録の5章を応用したプログラムが上手くいかない

#4

投稿記事 by dast » 14年前

助言をいただいて色々とプログラムをいじってみました。
そうしたら自機は表示できたものの肝心のボードの画像が表示されません。どうしたらいいでしょうか?

現在のプログラム

char.cpp

コード:

#include "../ヘッダー/GV.h"

void calc_ch(){//画像ループ用関数
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}
graph.cpp

コード:

#include "../ヘッダー/GV.h"

void graph_ch(){
	DrawRotaGraph(ch.x,444,1.0,0.0,img[0],TRUE);
}//graph_ch()の中にimgの0番(自機の上向き画像)の作画作業を入れる

void graph_board(){
	DrawGraph(0,0,img_board10,TRUE);
}


void graph_main(){//描画メイン
	graph_ch();
}//graph_main()の中にgraph_ch()を入れる
ini.cpp

コード:

#include "../ヘッダー/GV.h"

//初期化関数
void first_ini(){//初期化
	ch.x=FIELD_MAX_X/2;//初期の自機座標の設定
}
key.cpp

コード:

#include "../ヘッダー/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
        else                            stateKey[i]=0;
    }
    return 0;
}
int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}
load.cpp

コード:

#include "../ヘッダー/GV.h"
void load(){//データをロードする
	img_board10 = LoadGraph("画像/システム/枠.png");
	img_back10 = LoadGraph("画像/背景/神社周辺.png");
	LoadDivGraph("画像/キャラグラ/自機.png",12,3,4,38,41,img);
}
main01.cpp

コード:

#define GLOBAL_INSTANCE
#include "../ヘッダー/GV.h"


//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	load();//function.hの関数load()を実行する

    while(ProcessLoop()==0){//ProcessLoopの内容を行う
		switch(func_state){
			case 0://func_stateが0の時
				load();//function.hの関数load()を実行する
				first_ini();//function.hの関数first_ini()を実行する
				func_state = 100;//func_stateを100にする
				break;
			case 100:
				calc_ch();//function.hの関数calc_ch()を実行する
				graph_main();//function.hの関数graph_main()を実行する
				break;
			default://上記のcase以外の場合
				printfDx("不明なfunc_state%d\n",func_state);
				break;
		}

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク



        //ココ!!



        ScreenFlip();
    }

    DxLib_End();
    return 0;
}

define.h

コード:

#include"struct.h"
#define FIELD_MAX_X 619
#define FIELD_X 20
function.h

コード:

//graph.cpp
GLOBAL void graph_main();//描画メイン

//key.cpp
GLOBAL int GetHitKeyStateAll_2();//現在のキー入力を行う
GLOBAL int CheckStateKey(unsigned char Handle);//受け取ったキー番号の現在の入力状態を返す

//load.cpp
GLOBAL void load();//データをロードする

//ini.ccp
GLOBAL void first_ini();//初期化する

//char.cpp
GLOBAL void calc_ch();//画像のループさせる為の準備
GV.h

コード:

#include "DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include"function.h"//関数宣言(function.hの読み込み)

//画像用変数宣言部分
GLOBAL int img[12];//自機画像
GLOBAL int img_board10;//枠画像
GLOBAL int img_back10;//一面背景

//構造体変数宣言部分
GLOBAL ch_t ch;

//メインループ用変数宣言部分
GLOBAL int func_state;
struct.h

コード:

typedef struct{
	int cnt;       //画像処理の為のカウンタ
	int num;       //残機数
	int score;     //スコア
	int mutekicnt; //無敵状態とカウント
	int img;       //画像
	int img_bord10;//枠画像
	int img_back10;//一面背景
	double x,y;    //座標
}ch_t;

追記
このプログラムは5章ではなく7章を応用していたものでした。トピック詐欺みたいなことになって申し訳ございません

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

Re: 龍神録の5章を応用したプログラムが上手くいかない

#5

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

graph_board()を呼び出している所が無いように見えますが?

画像が表示されない時は、
(1)ちゃんとロードされている事。
(2)画像の表示処理がちゃんと呼び出されている事。
を確認するようにしてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast

Re: 龍神録の5章を応用したプログラムが上手くいかない

#6

投稿記事 by dast » 14年前

ありがとうございました。今度こそ上手くいきました。
つまらぬことでお騒がせして申し訳ございませんでした。

閉鎖

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