DXライブラリでの弾の処理
Posted: 2007年10月31日(水) 18:26
はじめまして。現在DXライブラリを用いてゲーム作成を行っております。キャラクターが右を向いているときは、右方向に弾を発射して、左を向いているときは左方向に発射するというプログラムを作りたいのですが、うまくいきません。
以下のように作ってみたのですが、これだと、右方向に弾を発射している途中に左を押すと、右にいっていた弾が左向きに方向転換して左に飛んで行ってしまいます。
途中で弾の向きが変わらないようにするにはどうすればいいでしょうか?
#include "DxLib.h"
struct CharaData{
int x;
int y;
int muki;
int ghandle;
int life;
};
//プロトタイプ宣言
void JitamaMove();
//グローバル変数
struct CharaData jikidata;
struct CharaData jitama[3];
int trigger = 0;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
jikidata.ghandle = LoadGraph("media\\char01.png");
jikidata.x=0;
jikidata.y=296;
jikidata.muki=1;
int g = LoadGraph("media\\tama.jpg");
for(int i=0; i<3; i=i+1) jitama.ghandle = g;
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClsDrawScreen();
DrawBox(0,360,640,480,65535,TRUE);
//自キャラ移動
int Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if( Key & PAD_INPUT_UP ) jikidata.y -= 3 ; // 上を押していたら上に進む
if( Key & PAD_INPUT_DOWN ) jikidata.y += 3 ; // 下を押していたら下に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.x += 3 ; // 右を押していたら右に進む
if( Key & PAD_INPUT_LEFT ) jikidata.x -= 3 ; // 左を押していたら左に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.muki = 1; //右を押したらjikidata.mukiに1を代入
if( Key & PAD_INPUT_LEFT ) jikidata.muki = 2; //左を押したらjikidata.mukiに2を代入
//右を押したら右向き、左を押したら左向きの画像を表示
if(jikidata.muki==1)
jikidata.ghandle = LoadGraph("media\\char01.png");
if(jikidata.muki==2)
jikidata.ghandle = LoadGraph("media\\char02.png");
DrawGraph(jikidata.x,jikidata.y,jikidata.ghandle,TRUE);
JitamaMove();
ScreenFlip();
}
DxLib_End();
return(0);
}
void JitamaMove(){
//弾の発射
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(( key & PAD_INPUT_B ) && (trigger == 0)){
for(int i=0; i<3; i=i+1){
if(jitama.life == 0){
jitama.life = 1;
jitama.x = jikidata.x+24;
jitama.y = jikidata.y+8;
break;
}
}
trigger = 20;
}
if(trigger>0) trigger = trigger - 1;
//弾の移動
if(jikidata.muki == 1){
for(int i=0; i<3; i=i+1){
if(jitama.life > 0){
jitama.x = jitama.x + 10;
DrawGraph(jitama.x, jitama.y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x >640) jitama[i].life = 0;
}
}
}
else if(jikidata.muki == 2){
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x - 10;
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x <0) jitama[i].life = 0;
}
}
}
}
以下のように作ってみたのですが、これだと、右方向に弾を発射している途中に左を押すと、右にいっていた弾が左向きに方向転換して左に飛んで行ってしまいます。
途中で弾の向きが変わらないようにするにはどうすればいいでしょうか?
#include "DxLib.h"
struct CharaData{
int x;
int y;
int muki;
int ghandle;
int life;
};
//プロトタイプ宣言
void JitamaMove();
//グローバル変数
struct CharaData jikidata;
struct CharaData jitama[3];
int trigger = 0;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
jikidata.ghandle = LoadGraph("media\\char01.png");
jikidata.x=0;
jikidata.y=296;
jikidata.muki=1;
int g = LoadGraph("media\\tama.jpg");
for(int i=0; i<3; i=i+1) jitama.ghandle = g;
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClsDrawScreen();
DrawBox(0,360,640,480,65535,TRUE);
//自キャラ移動
int Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if( Key & PAD_INPUT_UP ) jikidata.y -= 3 ; // 上を押していたら上に進む
if( Key & PAD_INPUT_DOWN ) jikidata.y += 3 ; // 下を押していたら下に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.x += 3 ; // 右を押していたら右に進む
if( Key & PAD_INPUT_LEFT ) jikidata.x -= 3 ; // 左を押していたら左に進む
if( Key & PAD_INPUT_RIGHT ) jikidata.muki = 1; //右を押したらjikidata.mukiに1を代入
if( Key & PAD_INPUT_LEFT ) jikidata.muki = 2; //左を押したらjikidata.mukiに2を代入
//右を押したら右向き、左を押したら左向きの画像を表示
if(jikidata.muki==1)
jikidata.ghandle = LoadGraph("media\\char01.png");
if(jikidata.muki==2)
jikidata.ghandle = LoadGraph("media\\char02.png");
DrawGraph(jikidata.x,jikidata.y,jikidata.ghandle,TRUE);
JitamaMove();
ScreenFlip();
}
DxLib_End();
return(0);
}
void JitamaMove(){
//弾の発射
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(( key & PAD_INPUT_B ) && (trigger == 0)){
for(int i=0; i<3; i=i+1){
if(jitama.life == 0){
jitama.life = 1;
jitama.x = jikidata.x+24;
jitama.y = jikidata.y+8;
break;
}
}
trigger = 20;
}
if(trigger>0) trigger = trigger - 1;
//弾の移動
if(jikidata.muki == 1){
for(int i=0; i<3; i=i+1){
if(jitama.life > 0){
jitama.x = jitama.x + 10;
DrawGraph(jitama.x, jitama.y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x >640) jitama[i].life = 0;
}
}
}
else if(jikidata.muki == 2){
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x - 10;
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
//画面外に出た時の処理
if(jitama[i].x <0) jitama[i].life = 0;
}
}
}
}