エラーと他方向分岐?についての質問

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

エラーと他方向分岐?についての質問

#1

投稿記事 by たいが » 14年前

visualC++ DXライブラリ使用です
今、野球ゲーム作りを目指していて、下のようなプログラムを書きました


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

void mode_pitch(){
DrawGraph( 0 , 0 , mound_h , TRUE);
LoadGraphScreen( pitch_x , 90 , "../dat/左上.png" , TRUE ) ;
if(pitch_x>290&&pitch_x<330&&pitch==0){
if(CheckStateKey(KEY_INPUT_RIGHT)>1){
pitch_x++;
}
if(CheckStateKey(KEY_INPUT_LEFT)>1){
pitch_x--;
}
if(pitch_x==290)pitch_x=291;
if(pitch_x==330)pitch_x=329;
}
if(CheckStateKey(KEY_INPUT_RETURN)==1&&(!(CheckStateKey(KEY_INPUT_UP)>1))&&(!(CheckStateKey(KEY_INPUT_DOWN)>1))&&pitch==0){
Sleep(1000);
pitch = 1;
ball_x=pitch_x;
ball_y = 90;
}else if(CheckStateKey(KEY_INPUT_RETURN)==1&&CheckStateKey(KEY_INPUT_UP)>1&&pitch==0){
Sleep(1000);
pitch = 2;
ball_x=pitch_x;
ball_y = 90;
}else if(CheckStateKey(KEY_INPUT_RETURN)==1&&CheckStateKey(KEY_INPUT_DOWN)>1&&pitch==0){
Sleep(1000);
pitch = 3;
ball_x=pitch_x;
ball_y = 90;
}else if(CheckStateKey(KEY_INPUT_RSHIFT)==1&&pitch==0){
pitch = 4;
}else if(ball_y >= 480){
pitch = 0;
}

if(pitch==1){
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y=ball_y+10;
if(CheckStateKey(KEY_INPUT_RIGHT)>1){
ball_x=ball_x++;
}
if(CheckStateKey(KEY_INPUT_LEFT)>1){
ball_x=ball_x--;
}
}else if(pitch==2){
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y=ball_y+5;
if(CheckStateKey(KEY_INPUT_RIGHT)>1){
ball_x=ball_x++;
}
if(CheckStateKey(KEY_INPUT_LEFT)>1){
ball_x=ball_x--;
}
}else if(pitch==3){
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y=ball_y+5;
if(ball_y>300){
LoadGraphScreen( ball_x , ball_y+1 , "../dat/影.png" , TRUE ) ;
}
}else if(pitch==4){
mode_run();
mode_def();
}
mode_bat_com();
}

簡単に言うとエンター押すと投球に入り、右シフトで牽制するという感じ(mode_run();mode_def();は牽制のために画面が切り替わって行動する関数って感じです)なのですが実はこの関数、どこかに欠陥があるみたいで、最初から右シフト押すと牽制画面にちゃんといくのですが、一度投球してからだと牽制画面にうまくいきません

どううまくいかないかというとほんの一瞬は牽制の画面が映るのですが、すぐにこの投球画面に戻ってしまう感じです

ですから投げた後の初期化がうまくいってないのではないかと思うんですがどこがいけないのかさっぱりで・・・


あと他方向分岐についてっていうのは
else if(ball_y >= 480){
pitch = 0;
}
のところを
if(ball_y >= 480){
pitch = 0;
}
にしたら今度はほんの一瞬の牽制画面すら映らなくなったんですがなぜでしょうか?
正直else ifっていらなくね?ifでいいじゃん っていうアホなレベルなので・・・


よろしくお願いします

五反田

Re:エラーと他方向分岐?についての質問

#2

投稿記事 by 五反田 » 14年前

一瞬しか牽制画面に行かない理由は、多分
}else if(pitch==4){
        mode_run();
        mode_def();
 }
ここで牽制画面に行く時に、その前にボールを投げたことによってball_yが480以上になったままになってしまっているからだと思います。

そこで、この部分を抜けてもう一度このvoid mode_pitch()が呼ばれたときに、前半のelse if分岐で
}else if(ball_y >= 480){
        pitch = 0;
}
これに引っかかって、すぐにpitchが4から0にされてしまうため牽制部分が一回しか呼ばれなくなってしまっています。

なので
}else if(pitch==4){
        mode_run();
        mode_def();
 }
}else if(pitch==4){
    ball_y=-30;//画面外に放置。
        mode_run();
        mode_def();
 }
のような感じで書き換える必要が有るかと思われます。


2つめの質問については、
if(ball_y >= 480){
        pitch = 0;
    }

これに書き換えた場合、一回ボールを投げたあとだと、やはりすでにball_y>=480が成立しているので、
pitchが4になっていてもすぐに0に変わってしまい、下の方のelse if分岐のpitch==4に全く引っかからなくなるからです。

ゆーずぃ

Re:エラーと他方向分岐?についての質問

#3

投稿記事 by ゆーずぃ » 14年前

>正直else ifっていらなくね?ifでいいじゃん

確かに全部ifで大丈夫です。ですが、関連性のある条件分岐の場合はelse ifの方が処理速度が向上します。
例えば
for(i=0; i < 3 ;i++){
1 if(a == 1)
      a = 2;
2 if(a == 2)
      a = 3;
3 if(a == 3)
      a = 4;
  }
というのがあったとして、これをelse ifで書くとどうなるか。
   for(i=0; i < 3 ;i++){
4  if(a == 1)
      a = 2;
5  else if(a == 2)
      a = 3;
6  else if(a == 3)
      a = 4;
   }
a=1で始まったとします。forで3回回した時、
ifだけで書いた方では
1→2→3→次のループ→1→2→3→次のループ→1→2→3
と、合計9回の判断を行います。

ではこれをelse ifで回すと
4→次のループ→4→5→次のループ→4→5→6
と、合計6回の判断で済みます。

こんな簡単な条件分岐ならswitchでもいいんですけどw
else ifの場合はその条件に引っ掛かれば以降の条件を判断しないという利点があります。
あまりに判定が多い場合などは少しでも判定回数を減らした方が処理速度向上に繋がりますし、
if ~ else ifで繋げれば読み手としても
「あぁ、これは関連性のある判定なんだな」と察することが出来ます。
ということで、一応実用性もある書き方です。

あと、ちょっと気になったんですが、左右同時押しとかした場合も意に沿う動きをしますか?

たいが

Re:エラーと他方向分岐?についての質問

#4

投稿記事 by たいが » 14年前

>五反田さん
ありがとうございます!
携帯から見させていただいて、返事は遅くなりましたがさっそく作業にとりかかることができ助かりました
2つめのほうもわかりやすかったです!

>ゆーずぃさん
なるほど!処理速度に関わってくるのですか
さっそく関連性あるものはelse ifにしてみました
短いので違いはわかりませんけどww

左右同時押しの件ですが、そのことは考えてなかったのでやってみました
するとなぜか投手と打者の動きに差がでました

投手の動き

if(pitch_x>290&&pitch_x<330&&pitch==0){
if(CheckStateKey(KEY_INPUT_C)>1){
pitch_x++;
}
if(CheckStateKey(KEY_INPUT_Z)>1){
pitch_x--;
}
if(pitch_x==290)pitch_x=291;
if(pitch_x==330)pitch_x=329;
}

打者の動き


if(CheckStateKey(KEY_INPUT_RETURN)==1&&swing==0){

}else if(batter_x<=250&&CheckStateKey(KEY_INPUT_RIGHT)>1){
batter_x++;
}else if(batter_x>=200&&CheckStateKey(KEY_INPUT_LEFT)>1){
batter_x--;
}else if(batter_y>=235&&CheckStateKey(KEY_INPUT_UP)>1){
batter_y--;
}else if(batter_y<=305&&CheckStateKey(KEY_INPUT_DOWN)>1){
batter_y++;
}

ってな感じにしたんですが
投手は同時押しすると動きが止まります
打者は・・・なぜか右が優先されるみたいです
右→左と押しても左→右と押しても右に動きます

なんかへんなとこでもあるのでしょうか

ゆーずぃ

Re:エラーと他方向分岐?についての質問

#5

投稿記事 by ゆーずぃ » 14年前

>投手は同時押しすると動きが止まります
打者は・・・なぜか右が優先されるみたいです

そこまで分析できたのなら、あとは原因を探るだけです。
ヒントは、さっき私が書いたifとelse ifの違いです。全てはそこです。

また、それぞれのヒントとして、
投手は右の動きと左の動きが別々に判定されていること。(正確には動きが止まっているわけではない)
打者はif~else ifで上からたった一つだけの判定を探していること。

デス!(●・w・●)ゝ

たいが

Re:エラーと他方向分岐?についての質問

#6

投稿記事 by たいが » 14年前

ああそうか!
さっきゆーずぃさんがおっしゃられたように右に移動した時点で判断を終えているから左には行かないわけデスネ!?
理解できました、ホント毎回ありがとうございまっす!!

たいが

Re:エラーと他方向分岐?についての質問

#7

投稿記事 by たいが » 14年前

解決忘れたのでもう一度コメをば

閉鎖

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