龍神録の8章のキーコンフィグのところなのですが・・

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

龍神録の8章のキーコンフィグのところなのですが・・

#1

投稿記事 by mi_l » 13年前

8章でつまづいてます・・・・・

ビルドは正常終了しています。しかし「CheckStatePadに渡した値が不正です」(key.cppより)と大量に出てしまいキーボードの右キーはできるのですが左キーがききません。

key/cpp

コード:

#include "../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];
}

//パッドの入力状態を格納する変数
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.up]     ,CheckStateKey(KEY_INPUT_UP      ));
        input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT   ));
        input_pad_or_key(&pad.key[configpad.down]   ,CheckStateKey(KEY_INPUT_DOWN    ));
        input_pad_or_key(&pad.key[configpad.shot]   ,CheckStateKey(KEY_INPUT_Z       ));
        input_pad_or_key(&pad.key[configpad.bom]    ,CheckStateKey(KEY_INPUT_X       ));
        input_pad_or_key(&pad.key[configpad.slow]   ,CheckStateKey(KEY_INPUT_LSHIFT  ));
        input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_ESCAPE  ));
        input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
}

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

コード:

#define GLOBAL_INSTANCE 
#include "../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){//メインループ
        switch(func_state){
            case 0:
                load();        //データロード
                first_ini();//初回の初期化
                func_state=100;
                break;
            case 100:
                calc_ch();       //キャラクタ計算
                graph_main();//描画メイン
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }

        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }

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

コード:

//キャラクターに関する構造体
typedef struct{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
}ch_t;

//パッドに関する構造体
typedef struct{
        int key[PAD_MAX];
}pad_t;

//コンフィグに関する構造体
typedef struct{
        int left,up,right,down,shot,bom,slow,start,change;
}configpad_t;
define.h

コード:

/フィールドの広さ
#define FIELD_MAX_X 384		//キャラの動ける領域の広さx軸
#define FIELD_MAX_Y 448		//キャラの動ける領域の広さy軸
//フィールドの左上の座標
#define FIELD_X 32			//その領域の左上のx座標
#define FIELD_Y 16			//その領域の左上のy座標
//パッドキーの最大数
#define PAD_MAX 16

#include "struct.h"		
GV.h

コード:

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

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

#include "function.h"           //関数宣言

//画像用変数宣言部
GLOBAL int img_ch[2][12];       //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
GLOBAL ch_t ch;                 //キャラクタデータ宣言


GLOBAL int func_state;

//ボード
GLOBAL int img_board[40];

//コンフィグ(パッド)
GLOBAL configpad_t configpad;
ini.cpp

コード:

#include "../include/GV.h"

void first_ini()
{
	//一番最初の初期座標
	ch.x = FIELD_MAX_X / 2;
	ch.y = FIELD_MAX_Y * 3/4;

	//コンフィグ(パッド)
	configpad.up = 13;		//上ボタン
	configpad.down = 15;	//下ボタン
	configpad.right = 14;	//右ボタン
	configpad.left = 16;	//左ボタン
	configpad.shot = 2;	//○ボタン	
	configpad.bom = 4;		//□ボタン
	configpad.slow = 8;	//R1ボタン	
	configpad.start = 9;	//startボタン
	configpad.change = 7;	//L1ボタン

}
どこかおかしいでしょうか??
ご指摘お願いします

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

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#2

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

CheckStatePad()を呼び出している所に問題があると思います。
なので、肝心な部分がないので判断できません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#3

投稿記事 by mi_l » 13年前

申し訳ありません。

追記

function.h

コード:

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

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

//laod.cpp
        //データのロード
        GLOBAL void load();

//ini.cpp
		//初期化
		GLOBAL void first_ini();

//char.cpp
		GLOBAL void calc_ch();

//コンフィグ(パッド)
		GLOBAL void GetHitPadStateAll();
		GLOBAL int CheckStatePad(unsigned int Handle);
char.cpp

コード:

#include "../include/GV.h"

void calc_ch(){
        ch.cnt++;
        ch.img=(ch.cnt%24)/6;
        if(CheckStatePad(configpad.left)>0)//左が押されていたら
                ch.x-=3;//座標を左に
        if(CheckStatePad(configpad.right)>0)//右が押されていたら
                ch.x+=3;//座標を右に
}
よろしくお願いします。

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

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#4

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

定義に矛盾があります。

コード:

//パッドキーの最大数
#define PAD_MAX 16
となっているので、

コード:

//パッドに関する構造体
typedef struct{
        int key[PAD_MAX];
}pad_t;
と配列宣言されていますが、

コード:

        input_pad_or_key(&pad.key[configpad.left]   ,CheckStateKey(KEY_INPUT_LEFT    ));
        input_pad_or_key(&pad.key[configpad.up]     ,CheckStateKey(KEY_INPUT_UP      ));
        input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT   ));
        input_pad_or_key(&pad.key[configpad.down]   ,CheckStateKey(KEY_INPUT_DOWN    ));
        input_pad_or_key(&pad.key[configpad.shot]   ,CheckStateKey(KEY_INPUT_Z       ));
        input_pad_or_key(&pad.key[configpad.bom]    ,CheckStateKey(KEY_INPUT_X       ));
        input_pad_or_key(&pad.key[configpad.slow]   ,CheckStateKey(KEY_INPUT_LSHIFT  ));
        input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_ESCAPE  ));
        input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
と言う使われ方ですので、

コード:

    //コンフィグ(パッド)
    configpad.up = 13;      //上ボタン
    configpad.down = 15;    //下ボタン
    configpad.right = 14;   //右ボタン
    configpad.left = 16;    //左ボタン
    configpad.shot = 2; //○ボタン  
    configpad.bom = 4;      //□ボタン
    configpad.slow = 8; //R1ボタン   
    configpad.start = 9;    //startボタン
    configpad.change = 7;   //L1ボタン
PAD_MAXが配列の上限ですので、
configpad.left = 16; //左ボタン
だけ配列の添字の上限を超えています。
16と定義された場合は0から15の範囲でなくてはいけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#5

投稿記事 by mi_l » 13年前

ありがとうございます。
PAD_MAX 17としたらできました!!

しかし、きかなかった左キーがきくようになったのはいいのですが・・次は左キーを押したら左に移動しっぱなしになってしまいました。

右はキーから指を離せば止まってくれるのですが・・・・またどこかおかしいところがあるのでしょうか。
右キーを押したら止まり離したらまた左に行ってしまうって感じです・・・

ご指摘お願いします。

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

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#6

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

他にも16までの決め打ち部分があるのでしょうね。
なので、
configpad.left = 16; //左ボタン
の自体元からこうじゃないですよね?

拡張するのなら全部の部分を正しく理解しないと拡張できませんよ。
8章で追加した部分を全部理解する & configpad.rightとの違いをデバッガで動作を追いかける
などをしてみましょう。

【補足】
こちらが解決していないので、解決した場合は解決チェックをお願いします。
「4.「キャラを描画してみよう」のところなのですが・・・ • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=11387
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#7

投稿記事 by mi_l » 13年前

わかりました。先を急がずやってみます。
ありがとうございます!

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録の8章のキーコンフィグのところなのですが・・

#8

投稿記事 by Dixq (管理人) » 13年前

これは私のコーディングが悪いですね。

コード:

//パッドとキーボードの両方の入力をチェックする関数
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;
        }
の部分の16の決め打ちをPAD_MAXに変更してください。

閉鎖

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