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;
}
}
}
シューティングで複数の弾の発射について
Re:シューティングで複数の弾の発射について
>まずJitamaMove関数の中のbreakの意味がわかりません。
>書籍には「一発の発射処理の中で複数の弾が出ないようにするため、for文から脱出」とあるのですが、そもそ
>もif文の中にあるので、for文の脱出ならfor{if{}break}のように書くのが正しい?
if(Key[KEY_INPUT_SPACE])
break;
これと同じ
>それとプログラム自体強制終了してしまうのも、なぜでしょう? 前回の投稿のプログラムに有限回の繰り返
>しfor文を組み込んだのですが、どこかに根本的な誤りがありますでしょうか?
if(jitama.life>0){ //
の外側にfor文書かないから
>書籍には「一発の発射処理の中で複数の弾が出ないようにするため、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:シューティングで複数の弾の発射について
なるほど、ようやく理解できました。
ただ、理解はできるのですが、これをいきなり書けるか、といわれると・・・・・・
大学の数学とかもそうでしたが、なんかの定理を(誰かに質問をして)理解はできても、自分で証明できるかっていわれるとそうでもなかったですからね・・・・・・
まぁ繰り返し、「考える、理解、書く」をするしかないんでしょうが。
ただ、理解はできるのですが、これをいきなり書けるか、といわれると・・・・・・
大学の数学とかもそうでしたが、なんかの定理を(誰かに質問をして)理解はできても、自分で証明できるかっていわれるとそうでもなかったですからね・・・・・・
まぁ繰り返し、「考える、理解、書く」をするしかないんでしょうが。