質問します。
自分はシューティングを作ろうと勉強していて、自機がたくさんの弾を発射させたいのですが、下のようにプログラムしても上手く表示されません。
#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発の弾が発射されていることは、分かります。
おそらく、弾同士が重なっているだけだとおもうのですが、どうすれば、解消されるでしょうか?
見苦しいコードですいません。