シューティングで複数の弾の発射について

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

シューティングで複数の弾の発射について

#1

投稿記事 by しろ » 15年前

C言語初心者のしろです。

昨日投稿した
http://www.play21.jp/board/formz.cgi?ac ... &rln=52791
の続きの質問になります。

前の投稿は弾を一つ出すためのプログラムでしたが
次は複数の弾を同時に発射するためのプログラムです。

下記のように(書籍に書いてあるデータ同様)プログラムを組んでみました。

まずJitamaMove関数の中のbreakの意味がわかりません。
書籍には「一発の発射処理の中で複数の弾が出ないようにするため、for文から脱出」とあるのですが、そもそもif文の中にあるので、for文の脱出ならfor{if{}break}のように書くのが正しい?

それとプログラム自体強制終了してしまうのも、なぜでしょう? 前回の投稿のプログラムに有限回の繰り返しfor文を組み込んだのですが、どこかに根本的な誤りがありますでしょうか?

お手数をおかけいたしますが、ご教授いただけますよう何とぞよろしくお願いいたします。
(これから仕事なので、返信できるのはおそらく帰宅後になります。申し訳ございません)

#include "DxLib.h"

typedef struct CharaData{
int x;
int y;
int ghandle;
int life;
}CharaData;

CharaData jikidata;//自機データ
CharaData jitama[3];//自機弾データ

//JitamaMove関数の宣言
void JitamaMove();




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理


int i;
jikidata.x=50;
jikidata.y=50;
jikidata.ghandle=LoadGraph("media\\test_jiki.bmp");
int g=LoadGraph("media\\test_tama.bmp");
char Key[256];

for(i=0;i<3;i++){
jitama.ghandle=g;
}

SetDrawScreen( DX_SCREEN_BACK ) ;

while(!ProcessMessage()&&!GetHitKeyStateAll(Key)){


ClearDrawScreen();
if(Key[KEY_INPUT_RIGHT]){
jikidata.x++;
}
if(Key[KEY_INPUT_LEFT]){
jikidata.x--;
}
if(Key[KEY_INPUT_UP]){
jikidata.y--;
}
if(Key[KEY_INPUT_DOWN]){
jikidata.y++;
}

if(Key[KEY_INPUT_RIGHT]&&Key[KEY_INPUT_X]){
jikidata.x=jikidata.x+2;
}
if(Key[KEY_INPUT_LEFT]&&Key[KEY_INPUT_X]){
jikidata.x=jikidata.x-2;
}
if(Key[KEY_INPUT_UP]&&Key[KEY_INPUT_X]){
jikidata.y=jikidata.y-2;
}
if(Key[KEY_INPUT_DOWN]&&Key[KEY_INPUT_X]){
jikidata.y=jikidata.y+2;
}

DrawGraph(jikidata.x,jikidata.y,jikidata.ghandle,TRUE);
JitamaMove();
ScreenFlip();



if(Key[KEY_INPUT_SPACE])
break;




}



DxLib_End();
return 0;
}




//JitamaMove関数の定義
void JitamaMove(){
char Key[256];
GetHitKeyStateAll(Key);
int i;

if(Key[KEY_INPUT_A]){

for(i=0;i<3;i++){
if(jitama.life==0){
jitama.life=1;
jitama.x=jikidata.x+10;
jitama.y=jikidata.y+8;
break; //ココ

}
}


}


if(jitama.life>0){
for(i=0;i<3;i++){
jitama.x=jitama.x+10;
DrawGraph(jitama.x,jitama.y,jitama[i].ghandle,TRUE);
//画面外に出たときの処理
if(jitama[i].x>640)
jitama[i].life=0;
}
}

}

ru

Re:シューティングで複数の弾の発射について

#2

投稿記事 by ru » 15年前

>まずJitamaMove関数の中のbreakの意味がわかりません。
>書籍には「一発の発射処理の中で複数の弾が出ないようにするため、for文から脱出」とあるのですが、そもそ
>もif文の中にあるので、for文の脱出ならfor{if{}break}のように書くのが正しい?
if(Key[KEY_INPUT_SPACE])
break;
これと同じ

>それとプログラム自体強制終了してしまうのも、なぜでしょう? 前回の投稿のプログラムに有限回の繰り返
>しfor文を組み込んだのですが、どこかに根本的な誤りがありますでしょうか?
if(jitama.life>0){ //
の外側にfor文書かないから

//JitamaMove関数の定義 
void JitamaMove()
{ 
    char Key[256]; 
    GetHitKeyStateAll(Key); 
    int i; 
     
    if(Key[KEY_INPUT_A])
    {
        for(i=0;i<3;i++)
        { 
            if(jitama.life==0)
            { 
                jitama.life=1; 
                jitama.x=jikidata.x+10; 
                jitama.y=jikidata.y+8; 
                break;    //ココ
            }
        }
    }

    for(i=0;i<3;i++)
    {
        if(jitama.life>0)
        {
            jitama.x=jitama.x+10; 
            DrawGraph(jitama.x,jitama[i].y,jitama[i].ghandle,TRUE); 
            //画面外に出たときの処理 
            if(jitama[i].x>640) 
                jitama[i].life=0; 
        }
    }
}

しろ

Re:シューティングで複数の弾の発射について

#3

投稿記事 by しろ » 15年前

なるほど、ようやく理解できました。

ただ、理解はできるのですが、これをいきなり書けるか、といわれると・・・・・・
大学の数学とかもそうでしたが、なんかの定理を(誰かに質問をして)理解はできても、自分で証明できるかっていわれるとそうでもなかったですからね・・・・・・

まぁ繰り返し、「考える、理解、書く」をするしかないんでしょうが。

閉鎖

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