ページ 11

DXライブラリでの弾の処理

Posted: 2007年10月31日(水) 18:26
by C.K
はじめまして。現在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;
}
}
}
}

Re:DXライブラリでの弾の処理

Posted: 2007年10月31日(水) 19:42
by やそ
一度発射された弾にはその時のjikidata.muki をjitama.muki
にセットしておいて、弾の移動ルーチンの判定は
jitama.mukiを使うといいんじゃないかな?
if(jitama.life > 0){
//life>0なら弾がある
  switch (jitama.muki) {
//右方向に発射!どっかーん!
    case 1:
     jitama.x = jitama.x + 10; 
//画面外に出た時の処理 ばいばいきーん!
      if(jitama.x >640) jitama.life = 0; 
      break;
//左方向に発射!ばっきゅーん!
    case 2:
     jitama.x = jitama[i].x - 10; 
//画面外に出た時の処理 ばいばいきーん!
      if(jitama[i].x <0) jitama[i].life = 0; 
      break;
  }
  DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE); 
}


こんなかんじ?

Re:DXライブラリでの弾の処理

Posted: 2007年10月31日(水) 20:50
by ibis
switch (jitama.muki) {
//右方向に発射!どっかーん!
case 1:
  jitama.x = jitama.x + 10;
break;
//左方向に発射!ばっきゅーん!
case 2:
  jitama.x = jitama.x - 10;
break;
}
//画面外に出た時の処理 ばいばいきーん!
if(jitama.x <0 || jitama >640) jitama.life = 0;

弾の消滅で、ほぼ同じ処理が重複してますので、
こうすると少し見やすいかと。(見やすいか否かは個人差があるかとは思いますが)
まぁ一般的には「同じ事を2度書くな」と言いますし。

論点がずれてますよね。
失礼しました。

Re:DXライブラリでの弾の処理

Posted: 2007年10月31日(水) 23:32
by C.K
>やそ様
お教えいただいてありがとうございました。
教えていただいた方法で無事にできました!
ありがとうございました!

>ibis様
見やすく書くのに慣れていないのでとても参考になりました。
ありがとうございました!