弾の発射について
Posted: 2010年9月23日(木) 14:58
今、ゲームプログラミングの館にて、キャラの移動と弾の発射を参考にして、自機の位置から2段階の速度の弾を発射するプログラムを書いてみました。
shotが普通の弾を打ち出すもので、
fastshotが速い弾を打ち出すものです。
普通の弾の方はしっかり描画されるのですが、速い方はなぜか描画がされません。
速い方の処理は、iの所をfに変えています。
ちなみに、自機の画像は、通常弾と同じものを使用しています。
自機の構造体などに関わる部分は省略して表記させていただきます。
#include "DxLib.h"
struct shot{
int x,y;
int flag;
};
struct fastshot{
int x,y;
int flag;
};
int WINAPI WinMain ~略~
int image,i,counter=0; //counter=発射してからのカウントをする変数。
int fimage,f,fcounter = 0;
char Key[256];
struct shot tama[10]; //tamaを10個作る。
struct fastshot ftama[5];
for(i=0;i<10;i++){ //初期化処理
tama.x=640/2; tama.y=480; //座標代入
tama.flag=0; //飛んでいない事を示すフラグ=0
}
SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
image = LoadGraph( "tama.png") ;//画像を分割してimage配列に保存
ch.img = LoadGraph ("tama.png");
fimage = LoadGraph("ftama.png");
while(1){
ClearDrawScreen(); //裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
~略~
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
~略~
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x+=5;
}
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama.flag==0){ //発射していない玉を探し、
tama.flag=1; //発射フラグを立てる
tama.x = ch.x ;
tama.y = ch.y ;
break;
}
}
}
for(i=0;i<10;i++){
if(tama.flag==1){ //発射している玉なら
tama.y-=4; //座標を8減らす
DrawGraph( tama.x , tama[i].y , image , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
if(fcounter<5) //前にエンターを押してから5カウント未満なら
fcounter++; //カウントアップ
else if( Key[ KEY_INPUT_A ] == 1 ){//5カウント以上たっていたら
fcounter=0; //カウンターを戻す
for(f=0;f<5;f++){
if(ftama[f].flag==0){ //発射していない玉を探し、
ftama[f].flag=1; //発射フラグを立てる
ftama[f].x = ch.x ;
ftama[f].y = ch.y ;
break;
}
}
}
for(f=0;f<5;f++){
if(ftama[f].flag==1){ //発射している玉なら
ftama[f].y-=8; //座標を8減らす
DrawGraph( ftama[f].x , ftama[f].y , fimage , TRUE );//玉を描画
if(ftama[f].y < -32){ //もし画面外まで来たら
ftama[f].y=480; //初期値に戻し、
ftama[f].flag=0; //発射フラグを戻す
}
}
}
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break;//Escボタンが押されたらブレイク
ScreenFlip() ;//裏画面データを表画面へ反映
}
DxLib_End() ;// DXライブラリ使用の終了処理
return 0 ;// ソフトの終了
}
ここがおかしいのでは?などと思い当たる方おられましたらご指摘をお願いします。
shotが普通の弾を打ち出すもので、
fastshotが速い弾を打ち出すものです。
普通の弾の方はしっかり描画されるのですが、速い方はなぜか描画がされません。
速い方の処理は、iの所をfに変えています。
ちなみに、自機の画像は、通常弾と同じものを使用しています。
自機の構造体などに関わる部分は省略して表記させていただきます。
#include "DxLib.h"
struct shot{
int x,y;
int flag;
};
struct fastshot{
int x,y;
int flag;
};
int WINAPI WinMain ~略~
int image,i,counter=0; //counter=発射してからのカウントをする変数。
int fimage,f,fcounter = 0;
char Key[256];
struct shot tama[10]; //tamaを10個作る。
struct fastshot ftama[5];
for(i=0;i<10;i++){ //初期化処理
tama.x=640/2; tama.y=480; //座標代入
tama.flag=0; //飛んでいない事を示すフラグ=0
}
SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
image = LoadGraph( "tama.png") ;//画像を分割してimage配列に保存
ch.img = LoadGraph ("tama.png");
fimage = LoadGraph("ftama.png");
while(1){
ClearDrawScreen(); //裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
~略~
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
~略~
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x+=5;
}
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama.flag==0){ //発射していない玉を探し、
tama.flag=1; //発射フラグを立てる
tama.x = ch.x ;
tama.y = ch.y ;
break;
}
}
}
for(i=0;i<10;i++){
if(tama.flag==1){ //発射している玉なら
tama.y-=4; //座標を8減らす
DrawGraph( tama.x , tama[i].y , image , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
if(fcounter<5) //前にエンターを押してから5カウント未満なら
fcounter++; //カウントアップ
else if( Key[ KEY_INPUT_A ] == 1 ){//5カウント以上たっていたら
fcounter=0; //カウンターを戻す
for(f=0;f<5;f++){
if(ftama[f].flag==0){ //発射していない玉を探し、
ftama[f].flag=1; //発射フラグを立てる
ftama[f].x = ch.x ;
ftama[f].y = ch.y ;
break;
}
}
}
for(f=0;f<5;f++){
if(ftama[f].flag==1){ //発射している玉なら
ftama[f].y-=8; //座標を8減らす
DrawGraph( ftama[f].x , ftama[f].y , fimage , TRUE );//玉を描画
if(ftama[f].y < -32){ //もし画面外まで来たら
ftama[f].y=480; //初期値に戻し、
ftama[f].flag=0; //発射フラグを戻す
}
}
}
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break;//Escボタンが押されたらブレイク
ScreenFlip() ;//裏画面データを表画面へ反映
}
DxLib_End() ;// DXライブラリ使用の終了処理
return 0 ;// ソフトの終了
}
ここがおかしいのでは?などと思い当たる方おられましたらご指摘をお願いします。