シューティングで複数の弾の発射について
Posted: 2010年5月26日(水) 07:37
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;
}
}
}
昨日投稿した
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;
}
}
}