龍神録の8章で画像がループされない

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

龍神録の8章で画像がループされない

#1

投稿記事 by dast » 14年前

何度もお世話になっています。龍神録プログラミングを見ながらプログラミングの勉強をしている初心者です。
龍神録の第8章を応用したプログラムで自機の画像がループしてくれず同じ画像が表示され続けてしまいます。どうしたらいいか教えてください。

以下プログラム文

char.cpp

コード:

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

void calc_ch(){//画像ループ用関数
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
	if(CheckStatePad(configpad.left)>0)//左に押されていたら
		ch.x-=2;//座標を左に
	if(CheckStatePad(configpad.right)>0)//右に押されていたら
		ch.x+=2;//座標を右に
}
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_board();
}//graph_main()の中にgraph_ch()を入れる
ini.cpp

コード:

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

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

	configpad.left=1;
	configpad.right=2;
	configpad.shot=0;
	configpad.bom=4;
	configpad.start=7;
}
key.cpp

コード:

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

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){//ここから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;
}//ここまでGetHitKeyStateAll_2()関数(受け取ったキー番号の現在のキー入力状態を返す)
int CheckStateKey(unsigned char Handle){//ここからCheckStateKey(unsigned char Handle)関数(受け取ったキー番号の現在の入力状態を返す)
        return stateKey[Handle];
}//ここまでCheckStateKey(unsigned char Handle)関数

//パッドの入力状態を入れる変数(struct.h参照)
pad_t pad;

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
	*p = *p>k ? *p : k;
}

//パッドとキーボードの両方の入力状態をチェックする関数
void GetHitPadStateAll(){
	int i,PadInput,mul=1;
	PadInput = GetJoypadInputState(DX_INPUT_PAD1);//パッドの入力状態を取得
	for(i=0;i<16;i++){
		if(PadInput & mul) pad.key[i]++;
		else pad.key[i]=0;
		mul*=2;
	}
	input_pad_or_key(&pad.key[configpad.left]   ,CheckStateKey(KEY_INPUT_LEFT));
	input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT));
	input_pad_or_key(&pad.key[configpad.shot]   ,CheckStateKey(KEY_INPUT_A));
	input_pad_or_key(&pad.key[configpad.bom]    ,CheckStateKey(KEY_INPUT_S));
	input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_X));
}

//渡されたパッドキーの入力状態を返す。返り値が-1なら不正
int CheckStatePad(unsigned int Handle){
	if(0<=Handle && Handle<PAD_MAX){
		return pad.key[Handle];
	}
	else{
		printfDx("CheckStatePadに渡した値が不正です\n");
		return -1;
	}
}
load.cpp

コード:

#include "../ヘッダー/GV.h"
void load(){//データをロードする
	img_board10 = LoadGraph("画像/システム/枠.png");
	img_back10 = LoadGraph("画像/背景/神社周辺.png");
	LoadDivGraph("画像/キャラグラ/自機.png",12,4,3,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();//現在のキー入力処理を行う
	GetHitPadStateAll();//現在のパッド入力処理を行う
    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;//初期化と裏画面化

    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

コード:


#define FIELD_MAX_X 619
#define FIELD_X 20
//パッドキーの最大数
#define PAD_MAX 16

#include"struct.h"
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();//画像のループさせる為の準備

//key.cpp
GLOBAL void GetHitPadStateAll();
GLOBAL int CheckStatePad(unsigned int Handle);
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;

//コントローラー用構造体変数宣言部分
GLOBAL configpad_t configpad;
struct.h

コード:

//キャラクタに関する構造体
typedef struct{
	int cnt;       //画像処理の為のカウンタ
	int num;       //残機数
	int score;     //スコア
	int mutekicnt; //無敵状態とカウント
	int img;       //画像
	double x,y;    //座標
}ch_t;

//コントローラに関する構造体
typedef struct{
	int key[PAD_MAX];
}pad_t;

//コンフィグに関する構造体
typedef struct{
	int left,right, shot, bom, start;
}configpad_t;

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 龍神録の8章で画像がループされない

#2

投稿記事 by h2so5 » 14年前

コード:

void graph_ch(){
    DrawRotaGraph(ch.x,444,1.0,0.0,img[0],TRUE);
}//graph_ch()の中にimgの0番(自機の上向き画像)の作画作業を入れる
常に同じ画像しか指定していないのだから、同じ画像が表示され続けるのは当然では?

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

Re: 龍神録の8章で画像がループされない

#3

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

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

dast

Re: 龍神録の8章で画像がループされない

#4

投稿記事 by dast » 14年前

>>h2so5さん
……はい、graph.cppの4行目を

コード:

	DrawRotaGraph(ch.x,444,1.0,0.0,img[ch.cnt%48/12],TRUE);
と変えたらできました。新たに編集したchar.cppの方に問題があるとばかり思っていてそちらの方を失念していました。
とにかくありがとうございました。

>>softya(ソフト屋)さん
申し訳ございません。そちらの方に関しては
試してみる→理解が追い付かず頭が沸騰する→とりあえず他のことをする→新たな疑問が湧く
というループを繰り返している状況に陥っています…orz
できる限りそちらのトピックの方にも顔を出したいと思っていますのでご容赦ください。

閉鎖

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