トップページ > 過去ログ > 記事閲覧
弾が思い通りに表示されない
名前:モクベ 日時: 2012/06/26 23:27

質問します。 自分はシューティングを作ろうと勉強していて、自機がたくさんの弾を発射させたいのですが、下のようにプログラムしても上手く表示されません。 #include "DxLib.h" #define PI 3.141592653 #define shot 10 int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey(){ char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る for( int i=0; i<256; i++ ){ if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); SetGraphMode(640,480,16);{ int tekiGraph=0,tamaGraph=0; int x=320,y=400; //自分の座標 int ex=0,ey=100; //敵の座標 int ty[shot]={0},tx[shot]={0}; //弾の座標 int shotflag[shot]={0}; //弾のフラグ int i=0; //ループ int shotw,shoth; //当たり判定用 int tekiw,tekih; //当たり判定用 int atarihantei=0; int atarihantei2=0; int tekitama=0; int ttx,tty; int tekishot=0; //画像をロード int me=LoadGraph("C:/Users/Owner/Pictures/イラスト/me.png"); int enemy=LoadGraph("C:/Users/Owner/Pictures/イラスト/enemy.png"); int tama=LoadGraph("C:/Users/Owner/Pictures/イラスト/tama.png"); int teki_atari=LoadGraph("C:/Users/Owner/Pictures/イラスト/teki_atari.png"); //弾のグフィックのサイズをえる GetGraphSize(tama,&shotw,&shoth); //敵のグラフィクのサイズを得る GetGraphSize(enemy,&tekiw,&tekih); while(ScreenFlip()==0 && ProcessMessage() ==0 && ClearDrawScreen() ==0 && gpUpdateKey() ==0 ){ //表示する DrawGraph(x,y,me,TRUE); //俺 for(i=0;i<=shot;i++){ if(shotflag[i]==1){ DrawGraph(tx[i],ty[i],tama,TRUE); } } //自機の移動計算 if(CheckHitKey(KEY_INPUT_UP)==1) y-=2; if(CheckHitKey(KEY_INPUT_DOWN)==1) y+=2; if(CheckHitKey(KEY_INPUT_LEFT)==1) x-=2; if(CheckHitKey(KEY_INPUT_RIGHT)==1) x+=2; if(y<0) y=0; if(x<0) x=0; if(y>480) y=480; if(x>640) x=640; //敵の移動計算 ex+=3; if(ex>=640){ ex=0; } //敵のあたり判定 if(atarihantei==1){ DrawGraph(ex,ey,teki_atari,TRUE); atarihantei2++; }else{ DrawGraph(ex,ey,enemy,TRUE); } if(atarihantei2 ==60){ atarihantei=0; atarihantei2=0; } //スペースが押されたときに弾がなければ表示する。 for(i=0;i<shot;i++){ if(CheckHitKey(KEY_INPUT_SPACE)==1 && shotflag[i]==0){ tx[i]=x; ty[i]=y; shotflag[i]=1; } } //弾の移動処理 for(i=0;i<shot;i++){ if(shotflag[i]==1){ ty[i]-=5; } } //画面外の弾を消す for(i=0;i<shot;i++){ if(shotflag[i]==1 && ty[i]<=0 ){ shotflag[i]=0; } } //敵の弾の移動処理 if(tekitama==1){ tty+=5; DrawGraph(ttx,tty,tama,TRUE); } //敵の弾の発射処理 if(tekishot==60){ tekitama=1; ttx=ex; tty=ey; } tekishot+=1; //画面外の弾は消去(敵 if(tty>=480){ tekitama=0; tekishot=0; tty=0; } //当たり判定 for(i=0;i<shot;i++){ if(shotflag[i]==1){ if(((tx[i]>ex && tx[i]<ex+tekiw) || (ex>tx[i] && ex<tx[i]+shotw)) && ((ty[i]>ey && ty[i]<ey+tekih) || (ey>ty[i] && ey<ty[i]+shoth))){ shotflag[i]=0; atarihantei=1; } } } } } DxLib_End(); return 0; } しかし、 //弾の移動処理 for(i=0;i<shot;i++){ if(shotflag[i]==1){ ty[i]-=i; } } とすると、とりあえず10発の弾が発射されていることは、分かります。 おそらく、弾同士が重なっているだけだとおもうのですが、どうすれば、解消されるでしょうか? 見苦しいコードですいません。

Page: 1 |

Re: 弾が思い通りに表示されない ( No.1 )
名前:管理人 日時:2012/06/27 01:23

スペースキーが押されていたときに弾を発射するようになっていると思いますが、 //スペースが押されたときに弾がなければ表示する。 for( i = 0 ; i < shot ; i++ ) { if( CheckHitKey( KEY_INPUT_SPACE ) == 1 && shotflag[ i ] == 0 ) { tx[i]=x; ty[i]=y; shotflag[i]=1; } } こちらですとスペースキーが押された場合は10発全てが一度に発射されてしまいます ( スペースキーが押されている限り CheckHitKey( KEY_INPUT_SPACE ) の戻り値は常に1なので ) 「スペースキーが1回押されたら1発だけ撃つ」という風にしたい場合は 「スペースキーが押された瞬間だけ弾を1発撃つ」とする必要があります 「スペースキーが押された瞬間」とは 「一つ前のループではスペースキーが押されていなくて、今回のループではスペースキーが押されている」ときです なので一つ前のループの時にスペースキーが押されていたかどうかを変数に保存しておき、 「一つ前のループのスペースキーの押下状態を保存した変数が0で、CheckHitKey( KEY_INPUT_SPACE ) の戻り値が1のとき」 がスペースキーが押された瞬間、ということになります 具体的にはグローバル変数に int BackSpaceKeyInput ; こんな感じの「一つ前のループのときの CheckHitKey( KEY_INPUT_SPACE ) の戻り値」を保存するための変数を追加して //スペースが押されたときに弾がなければ表示する。 for( i = 0 ; i < shot ; i++ ) { if( CheckHitKey( KEY_INPUT_SPACE ) == 1 && shotflag[ i ] == 0 ) { tx[i]=x; ty[i]=y; shotflag[i]=1; } } こちらを int NowSpaceKeyInput ; // 今回のループのスペースキーの押下状態を取得する NowSpaceKeyInput = CheckHitKey( KEY_INPUT_SPACE ) ; // 前回のループではスペースキーが押されていなくて、 // 今回のループではスペースキーが押されている場合のみ弾を撃つ処理を行う if( BackSpaceKeyInput == 0 && NowSpaceKeyInput == 1 ) { // 使われていない弾を探して弾を撃つ for( i = 0 ; i < shot ; i++ ) { if( shotflag[ i ] == 0 ) { tx[i]=x; ty[i]=y; shotflag[i]=1; // 一発有効にしたらループを抜ける // これが無いと一度に10発全部発射されてしまう break ; } } } // 次のループのときのために今回のループでのスペースキーの押下状態を BackSpaceKeyInput に代入する BackSpaceKeyInput = NowSpaceKeyInput ; こんな感じに変更します よろしければ試してみてください
Re: 弾が思い通りに表示されない ( No.2 )
名前:モクベ 日時:2012/06/28 23:27

返事が遅れてしまい申し訳ありません。 管理人様の通りにやったら、思い通りに行きました。 ありがとうございました。

Page: 1 |