初心者です。
インベーダーゲームのようなものを作ってみようと思っています。
考えた下記コードだと、玉を発射させた後、プレイヤーを左右に動かすと
玉も左右に動いてしまいます。
プレイヤーの位置に関係なく、玉を直進させるには
どうすればよいでしょうか?
アドバイスお願いいたしま~す。
-------------------------------
#include "DxLib.h"
#define PLAYER_Y 416
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
struct shot{
int x,y;
int flag;
};
struct shot tama[10];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16],counter=0;
char Key[256];
ch_t ch;
ch.x =320;
ch.y =PLAYER_Y;
ch.walking_flag=0;
ch.muki=3;
for(int i=0;i<10;i++){
tama.x=320;
tama.y=PLAYER_Y-32;
tama.flag=0;
}
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
///////////////////////////////////////////////////////////////////////
////////////////////// プレイヤー位置操作 ////////////////////////////
///////////////////////////////////////////////////////////////////////
if(ch.x%16==0 && ch.y%16==0){ //座標が16で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //その他ボタンなら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
if(ch.x < 0) ch.x=0; //もし画面外まで来たら
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
if(ch.x > 480-32) ch.x=480-32; //もし画面外まで来たら
}
///////////////////////////////////////////////////////////////////////
////////////////////// 玉発射 ////////////////////////////
///////////////////////////////////////////////////////////////////////
for(int i=0;i<1;i++){ //玉発射位置セット
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
tama.x=ch.x;
for(int i=0;i<1;i++){
if(tama.flag==0) { //発射フラグを立てる
tama.flag=1;
break;
}
}
}
if(tama.flag==1){
tama.y-=1; //座標を8減らす
DrawGraph( tama.x , tama.y , image[6] , TRUE );//玉を描画
// ScreenFlip();//裏画面を表画面に反映
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=PLAYER_Y-32; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
DrawGraph( ch.x , ch.y , image[0] , TRUE ) ;
////////////////////////////////////////////////////////////////////////
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
玉を直進させるには
Re:玉を直進させるには
tama.x=ch.x
↑この弾の座標セットする時にはフラグがたっていない弾だけに対して
座標をセットする必要があるので
if(tama.flag==0)のif文の中で弾の座標をセットしてやればいいかと。
あとざっと見ただけですが、for文使ってる場所とかもなんか変な気がするので
下記のURLを参考にもう一度見直してみたほうがいいかもしれません。
http://dixq.net/g/29.html
↑この弾の座標セットする時にはフラグがたっていない弾だけに対して
座標をセットする必要があるので
if(tama.flag==0)のif文の中で弾の座標をセットしてやればいいかと。
あとざっと見ただけですが、for文使ってる場所とかもなんか変な気がするので
下記のURLを参考にもう一度見直してみたほうがいいかもしれません。
http://dixq.net/g/29.html
Re:玉を直進させるには
こんなに直ぐにコメントいただけるなんて。
解決しました!
ありがとうございました。
///////////////////////////////////////////////////////////////////////
////////////////////// 玉発射 ////////////////////////////
///////////////////////////////////////////////////////////////////////
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<10) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(int i=0;i<10;i++){
if(tama.flag==0) { //発射フラグを立てる
tama.x=ch.x;
tama.flag=1;
break;
}
}
}
for(int i=0;i<10;i++){ //玉発射位置セット
if(tama.flag==1){
tama.y-=1; //座標を8減らす
DrawGraph( tama.x , tama.y , image[6] , TRUE );//玉を描画
// ScreenFlip();//裏画面を表画面に反映
if(tama.y < -32){ //もし画面外まで来たら
tama.y=PLAYER_Y-32; //初期値に戻し、
tama.flag=0; //発射フラグを戻す
}
}
}
DrawGraph( ch.x , ch.y , image[0] , TRUE ) ;
////////////////////////////////////////////////////////////////////////
解決しました!
ありがとうございました。
///////////////////////////////////////////////////////////////////////
////////////////////// 玉発射 ////////////////////////////
///////////////////////////////////////////////////////////////////////
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<10) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(int i=0;i<10;i++){
if(tama.flag==0) { //発射フラグを立てる
tama.x=ch.x;
tama.flag=1;
break;
}
}
}
for(int i=0;i<10;i++){ //玉発射位置セット
if(tama.flag==1){
tama.y-=1; //座標を8減らす
DrawGraph( tama.x , tama.y , image[6] , TRUE );//玉を描画
// ScreenFlip();//裏画面を表画面に反映
if(tama.y < -32){ //もし画面外まで来たら
tama.y=PLAYER_Y-32; //初期値に戻し、
tama.flag=0; //発射フラグを戻す
}
}
}
DrawGraph( ch.x , ch.y , image[0] , TRUE ) ;
////////////////////////////////////////////////////////////////////////