自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

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

自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#1

投稿記事 by こめかみ » 17年前

今、龍神録の館の17章まで来ています。

正常にビルドされた後、
自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

スロー(低速移動)モードに移行する左シフトキーは有効ですが、Zキーのみ無効です。

現在、左に移動しながらでないとショットが出来ない状況にあります。


ソースはコピペに頼らないで書いています。
キーコンフィグの設定どこかおかしいでしょうか。

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==1) stateKey++;
    else              stateKey=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++;
      else         pad.key=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;
    }
}



cshot.cpp内の自機ショット登録関数はこちらです。

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

int cshot0num[2]  ={2,4};
int cshot0pos_x[4]  ={-10, 10,-30, 30};
int cshot0pos_y[4]  ={-30,-30,-10,-10};

//自機ショットの登録可能番号を返す
int search_cshot(){
  for(int i=0;i<CSHOT_MAX;i++){
    if(cshot.flag==0)
      return i;
  }
  return -1;
}

//通常ショット登録
void ch0_shot_pattern(){
  int k;
  for(int i=0;i<cshot0num[ch.power?0:1];i++){
    if((k=search_cshot())!=-1){
      cshot[k].flag=1;
      cshot[k].cnt=0;
      cshot[k].angle=-PI/2;
      cshot[k].spd=20;
      cshot[k].x=ch.x+cshot0pos_x;
      cshot[k].y=ch.y+cshot0pos_y;
      cshot[k].power=23;
      cshot[k].knd=0;
    }
  }
  se_flag[2]=1;//発射音オン
}

//低速通常ショット登録
void ch1_shot_pattern(){
  int k;
  for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
    if((k=search_cshot())!=-1){
      cshot[k].flag=1;
      cshot[k].cnt=0;
      cshot[k].angle=-PI/2;
      cshot[k].spd=20;
      cshot[k].x=ch.x+cshot0pos_x/3;//低速中なら位置を中心側へ
      cshot[k].y=ch.y+cshot0pos_y/2;
      cshot[k].power=23;
      cshot[k].knd=0;
    }
  }
  se_flag[2]=1;
}

//ショット登録部
void enter_shot(){
  //ショットボタンが押されていたら
  if(CheckStatePad(configpad.shot>0)){
    ch.shot_cnt++;
    if(ch.shot_cnt%3==0){//3カウントに1回
      if(CheckStatePad(configpad.slow)>0)//低速移動中なら
        ch1_shot_pattern();
      else
        ch0_shot_pattern();
    }
  }
  else
    ch.shot_cnt=0;
}

//ショットの移動計算
#define CSOUT 20 //どのくらい画面から外れたら消すか
void calc_cshot(){
  for(int i=0;i<CSHOT_MAX;i++){
    if(cshot[i].flag==1){
      cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
      cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
      if(cshot[i].x<-CSOUT || cshot[i].x>FIELD_MAX_X+CSOUT ||
        cshot[i].y<-CSOUT || cshot[i].y>FIELD_MAX_Y+CSOUT)//画面から外れたら
        cshot[i].flag=0;
    }
  }
}

//自機ショットに関する関数
void cshot_main(){
  calc_cshot();//ショットの軌道計算
  enter_shot();//ショットの登録
}


ゲームパッドでも同じ状況です、
どのような原因が考えられるでしょうか。

また、館でまとめてダウンロードできるプロジェクトの17章では正常にショットが撃てます。

at

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#2

投稿記事 by at » 17年前

コードが長くて読む気がしません。もう少し具体的に質問したほうがいいと思います。
あと、
else
ch.shot_cnt=0;
}
のような省略は誤作動の元ですので、初心者のうちは面倒でも
else { ch.shot_cnt=0; }
のように細部まで書く習慣をつけたほうがいいです。

array

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#3

投稿記事 by array » 17年前

パッと見、間違いはなさそうに見えますが、左を押した時にショットが登録されているみたいなので、プロジェクト内検索を使い『configpad.left』『ch1_shot_pattern();』『ch0_shot_pattern();』を検索して、『configpad.left』を押した時にショットパターンを登録していないか確認するしかないのではないでしょうか。

それと、そのプログラムは自分で弄られた部分があるのでしょうか、龍神録の館のプログラム、私は35章での不具合が出ていないので35章をそのまま使った時にもエラーは出るのか、そういった情報もあればこめかみさんの記述ミスか、パソコン自体に問題があるのか分かると思います。

array

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#4

投稿記事 by array » 17年前

すみません、館の方ではうまく動作するんですね^^;

なのでもう一度詳しく見てみたのですが、やっぱり大丈夫そうな感じです・・・orz

first_ini()の初期化に問題ないか、PAD_MAXはちゃんと登録されているかなど確認するのも良いかもしれません。

要約すると
・『configpad.left』によって『ch○_shot_pattern()』が呼び出されていないか。(低速パターンのショットがでるなら『ch1』通常ショットなら『ch0』と変わってくると思います。)
・単純にキーコンフィグのどこかが間違っている。
シフトを押して左を押すと低速時ショット、シフトを押さず左を押すと通常ショットなら、ほぼ80%以上キーコンフィグに問題があると思います

くらいしか予想できません

こめかみ

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#5

投稿記事 by こめかみ » 17年前

>atさん
アドバイスありがとうございます。
書き写しながらそのように書いていこうと思います。

>arrayさん

ありがとうございます。
今ソースを隅から隅まで比較しているところです、それでもダメだったらまた質問にきます。

定義は最近痛い目を見たので気をつけているつもりなんですが・・・「つもり」じゃダメなんでしょうね。

>シフトを押して左を押すと低速時ショット、シフトを押さず左を押すと通常ショットなら、ほぼ80%以上キーコンフィグに問題があると思います。

そのとおりなんですが、それに加えて左に移動するんですよ。どうなってるんでしょう・・・


ちょっと今疲れてるんで。目がさめたらまた挑戦します。

わからなくても成功しても必ず報告に来ますのでよろしくお願いします。

こめかみ

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#6

投稿記事 by こめかみ » 17年前

間違って雑談にしてしまいました。
一応解決するまで質問にしておきます。
失礼します。

管理人

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#7

投稿記事 by 管理人 » 17年前

//ショット登録部
void enter_shot(){
  //ショットボタンが押されていたら
    if(CheckStatePad(configpad.shot>0)){  

ここじゃないですか?
お解かりだと思いますが、

    if(CheckStatePad(configpad.shot)>0){

こうですね。
 
また、今回の場合は、全てコピペしてもらえて良かったと思います。

こちらにコンパイルプロジェクトもありますし、他のファイルを含め、
バグが生じている時、自分が予期していないコードが原因となっている場合もあるので、
ファイルの内容をそのまま張ってもらった方がいいと思います。

そして、cshot.cppの内容を変更するとバグが生じるため、
ここにバグの原因があるという推測も良かったと思います。

もしも、今後同じようなバグが生じてお悩みになることがあれば、
今回と同じように質問してもらって大丈夫だと思います。

ただ、ブレイクポイントを使えばかなりバグが限定出来るので、
ご自分でもバグが無いかブレイクポイントで探していって下さい。
ブレイクポイントについて使い方がわからなければ、また別途ご質問下さい。

バグの探し方ですが、今回はショットキーじゃなくても、ショットが登録されてしまっていました。
なので、とりあえず

//ショット登録部
void enter_shot(){

ショット登録部から探していこうと思いますね。

CheckStatePad(configpad.shot)

これは、キー番号を渡し、そのキー番号が押されているかチェックする関数です。
今回そのキー番号にショットキー番号を渡しています。
ショットキーが押されていないのにここが真になるのなら、
ここがおかしいのではないかと、ここにブレイクポイントを置いてみます。

まぁ今回の場合はブレイクポイントを置く前に原因がわかりますね。
 

こめかみ

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#8

投稿記事 by こめかみ » 17年前

ありがとうございました管理人さん!

無事解決しました。

そのあたりは何度も確認してたのに見事に見過ごしてました、なさけねー。

括弧を打ち足りないというミスばかりしていたので、括弧の位置を疑っていなかったようです。

こめかみ

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#9

投稿記事 by こめかみ » 17年前

報告です。


●11章
エクセルデータとそのスクリーンショットの

アイテムの種類の注釈
"item_n[0]"
、は

"item_n"
じゃないでしょうか、
以降のデータも全部そうなってますし。



●12章
"--enemy.cppに以下を追加--"のところの
//敵の行動制御
void enemy_act(){
    int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemy.flag==1){//その敵のフラグがオンになってたら
            if(0<=ENEMY_PATTERN_MAX && enemy.pattern<ENEMY_PATTERN_MAX){
                enemy_pattern[enemy.pattern](i);


これはダウンロードしたプロジェクトの内容と違ったのですが、プロジェクトの内容のほうが正しいようです。

//敵の行動制御
void enemy_act(){
    int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemy.flag==1){//その敵のフラグがオンになってたら
            if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX){
                enemy_pattern[enemy.pattern](i);



"if(0<=ENEMY_PATTERN_MAX && enemy.pattern<ENEMY_PATTERN_MAX)"
が↓
"if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX)"
こうです。



●13章
"ここでその弾幕データはどうなっているか、構造体の定義と変数の宣言を見てみましょう。"
の、

//ショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号、色
int flag,knd,cnt,num;

"色"のコメントが余分なようです。


●16章
画像タイトル"ミシャクジさま弾幕を作ってみよう"ですが、
日本神話的にはどっちでもいいようですが、
東方的には"ミシャ「グ」ジさま"
、のようです。


●18章
out.cppの中の

se_flag[1]=1;//敵のピチュリ音

ピチュ"る"の連用形ピチュ"り"、
活用語尾はひらがなです。


●龍神録プログラミングの館、各章へのリンクへのタイトル画像。

15章のみょん弾幕の章から文字が右によってたり、真ん中にあったりで不定ですが、
意図があるのでしょうか。


●"規約と使い方"の中の

7  許容行為

・宿題の質問は大いに結構です。是非ドンドン質問してください。
しかし宿題の完全丸投げをする


文章が途中で止まっていました。

●同じく"規約と使い方"のページの下のほう、

"このサイトの主旨"の中の一番下、


などなど、ドシドシご質問ください。

などなど。


↑二回言ってます。




以上です。

こめかみ

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#10

投稿記事 by こめかみ » 17年前

あと一個、

●17章

---- load.cpp の load()関数に以下を追加 ----

のところで、

sound_se[2]=LoadSoundMem("../dat/se/cshot.wav");

の追加を指摘するのを忘れているようです。

管理人

Re:自機移動の左(←)キーで、Zキーの自機ショットが始まってしまいます。

#11

投稿記事 by 管理人 » 17年前

ありがとうございます。修正しました。

>"item_n[0]"

これは
item1がitem_n[0]にはいり、
item2がitem_n[1]にはいり、
item3がitem_n[2]にはいり・・・ということを示したかったのですが、
その説明が中途半端になってしまったようです;
どこかできちんと説明を追加しようと思います。

>●龍神録プログラミングの館、各章へのリンクへのタイトル画像。

弾幕作製の章は右寄せ、通常の章は中央寄せなのですが、わかりにくかったですね・・。
もう少しわかりやすい見せ方を工夫します;

閉鎖

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