シューティング

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
shot

シューティング

#1

投稿記事 by shot » 8年前

コード:


	Enemy v[4];
        float xpos=0.0f,ypos=0.0f;

	v[0].x = pos;
	v[0].y = pos;
	v[0].z = 0.0f;

	v[1].x = pos + 20.0f;
	v[1].y = ypos2;
	v[1].z = 0.0f;

	v[2].x = pos + 20.0f;
	v[2].y = ypos + 20.0f;
	v[2].z = 0.0f;

	v[3].x = xpos;
	v[3].y = ypos + 20.0f;
	v[3].z = 0.0f;

	v[0].rhw = 1.0f;
	v[1].rhw = 1.0f;
	v[2].rhw = 1.0f;
	v[3].rhw = 1.0f;

	v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	v[0].u = 0.0f;
	v[0].v = 1.0f;
	v[1].u = 0.0f;
	v[1].v = 0.0f;
	v[2].u = 1.0f;
	v[2].v = 0.0f;
	v[3].u = 1.0f;
	v[3].v = 1.0f;

縦4横8に敵を配置したいのですが分かりません
縦4横8に配置するプログラムを教えてください

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: シューティング

#2

投稿記事 by あんどーなつ » 8年前

何これわかりづらいwww
つまりこういうことでしょうか?敵を〇としたときに、

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

敵の画像は20.0fx20.0fより小さく、縦横の敵は20.0fごとに並べる。
左上の敵は(pos, pos, 0.0f)に配置。
全ての敵はz平面上に存在。

shot

Re: シューティング

#3

投稿記事 by shot » 8年前

コード:

	for (int i = 1; i <= ENEMYX; i++){
		for (int j = 1; j <= ENEMYY; j++){
			vertex[0].x = xpos2*i;
			vertex[0].y = ypos2*j;
			vertex[0].z = 0.0f;

			vertex[1].x = xpos2*i + 30.0f;
			vertex[1].y = ypos2*j;
			vertex[1].z = 0.0f;

			vertex[2].x = xpos2*i + 30.0f;
			vertex[2].y = ypos2*j + 30.0f;
			vertex[2].z = 0.0f;

			vertex[3].x = xpos2*i;
			vertex[3].y = ypos2*j + 30.0f;
			vertex[3].z = 0.0f;       
敵は上のような感じで増やしました
あたり判定を作ったのですが左上の敵に当てると全ての敵が消滅します
1体ずつのあたり判定の取り方を教えてください

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#4

投稿記事 by みけCAT » 8年前

shot さんが書きました:あたり判定を作ったのですが左上の敵に当てると全ての敵が消滅します
1体ずつのあたり判定の取り方を教えてください
まず、描画の時に敵の絵を増やすのではなく、敵の情報を格納する場所を増やさないといけなそうです。
(もしかしたらすでにあるのかもしれませんが、その部分のコードが提示されていないのでわかりません)
敵1体ずつの情報を用意したら、それぞれについてあたり判定をします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#5

投稿記事 by shot » 8年前

コード:

int x;
int y;

float xpos2[8] = {
	80.0f, 80.0f, 80.0f, 80.0f, 80.0f,80.0f,80.0f,80.0f
};

float ypos2[5] = {
	50.0f, 50.0f, 50.0f, 50.0f
};
void teki(void) {

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float tex_u, tex_v;
	}TEKIT;

	TEKIT vertex[4];

	for ( x = 0; x <8; x++){
		for ( y = 0; y <5; y++){
			vertex[0].x = xpos2[x]*x;
			vertex[0].y = ypos2[y]*y;
			vertex[0].z = 0.0f;

			vertex[1].x = xpos2[x]*x + 30.0f;
			vertex[1].y = ypos2[y]*y;
			vertex[1].z = 0.0f;

			vertex[2].x = xpos2[x]*x + 30.0f;
			vertex[2].y = ypos2[y]*y + 30.0f;
			vertex[2].z = 0.0f;

			vertex[3].x = xpos2[x]*x;
			vertex[3].y = ypos2[y]*y + 30.0f;
			vertex[3].z = 0.0f;

			vertex[0].rhw = 1.0f;
			vertex[1].rhw = 1.0f;
			vertex[2].rhw = 1.0f;
			vertex[3].rhw = 1.0f;

			vertex[0].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[1].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[2].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[3].cor = D3DCOLOR_XRGB(255, 255, 255);

			vertex[0].tex_u = 0.0f;
			vertex[0].tex_v = 1.0f;
			vertex[1].tex_u = 0.0f;
			vertex[1].tex_v = 0.0f;
			vertex[2].tex_u = 1.0f;
			vertex[2].tex_v = 0.0f;
			vertex[3].tex_u = 1.0f;
			vertex[3].tex_v = 1.0f;

			g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(TEKIT));
		}
	}

	if ((int)Test() == 1)
	{
	xpos2[x] = 1000;
	ypos2[y] = 1000;
	}

}

int Test()
{
	if (shot_x[i] + 30 >= xpos2[x] + 16.0f&&shot_y[i] + 10 >= ypos2[y] + 16.0f&&xpos2[x] + 50.0f >= shot_x[i] + 16.0f&&ypos2[y] + 50.0f >= shot_y[i] + 16.0f)
	{

		return 1;
	}
	else
	{
		return 0;
	}
}

左上に当てると自機が右下に移動してしまいます

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#6

投稿記事 by みけCAT » 8年前

shot さんが書きました:左上に当てると自機が右下に移動してしまいます
この提示した部分に「自機」の要素は含まれていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#7

投稿記事 by みけCAT » 8年前

イメージとして、こんな感じのプログラムにすると実装できると思います。

コード:

/* 敵の情報を表す構造体 */
typedef struct {
	float x, y; /* 座標 */
	int is_alive; /* 生きてるか */
} enemy_data;

/* 敵の縦と横の数 */
#define X_NUM 8
#define Y_NUM 4

#define ENEMY_NUM (X_NUM * Y_NUM)

/* 敵の情報 */
enemy_data enemies[ENEMY_NUM];

/* 敵を配置する */
void initEnemy(void) {
	int x, y;
	for (y = 0; y < Y_NUM; y++) {
		for (x = 0; x < X_NUM; x++) {
			enemies[y * X_NUM + x].x = 80.0f + 50.0f * x;
			enemies[y * X_NUM + x].y = 50.0f + 50.0f * y;
			enemies[y * X_NUM + x].is_alive = 1;
		}
	}
}

/* 敵1体を(pos, ypos)に描画する */
void drawOneEnemy(float pos, float ypos) {
	Enemy v[4];

	v[0].x = pos;
	v[0].y = pos;
	v[0].z = 0.0f;

	v[1].x = pos + 20.0f;
	v[1].y = ypos2;
	v[1].z = 0.0f;

	v[2].x = pos + 20.0f;
	v[2].y = ypos + 20.0f;
	v[2].z = 0.0f;

	v[3].x = xpos;
	v[3].y = ypos + 20.0f;
	v[3].z = 0.0f;

	v[0].rhw = 1.0f;
	v[1].rhw = 1.0f;
	v[2].rhw = 1.0f;
	v[3].rhw = 1.0f;

	v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	v[0].u = 0.0f;
	v[0].v = 1.0f;
	v[1].u = 0.0f;
	v[1].v = 0.0f;
	v[2].u = 1.0f;
	v[2].v = 0.0f;
	v[3].u = 1.0f;
	v[3].v = 1.0f;
}

/* 敵の集団を描画する */
void drawEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		/* 生きている敵のみ描画する */
		if (enemies[i].is_alive) {
			drawOneEnemy(enemies[i].x, enemies[i].y);
		}
	}
}

/* 当たり判定を計算させる */
void updateEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			if (/* i番目の敵が「当たった」 */) {
				enemies[i].is_alive = 0;
			}
		}
	}
}

/* ----------------------- */

/* メインループ内 */
updateEnemy();
drawEnemy();
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#8

投稿記事 by shot » 8年前

コード:


/* 敵1体を(pos, ypos)に描画する */
void drawOneEnemy(float pos, float ypos) {

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float u, v;
	}Enemy;

	Enemy v[4];

	v[0].x = pos;
	v[0].y = pos;
	v[0].z = 0.0f;

	v[1].x = pos + 20.0f;
	v[1].y = ypos;
	v[1].z = 0.0f;

	v[2].x = pos + 20.0f;
	v[2].y = ypos + 20.0f;
	v[2].z = 0.0f;

	v[3].x = pos;
	v[3].y = ypos + 20.0f;
	v[3].z = 0.0f;

	v[0].rhw = 1.0f;
	v[1].rhw = 1.0f;
	v[2].rhw = 1.0f;
	v[3].rhw = 1.0f;

	v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	v[0].u = 0.0f;
	v[0].v = 1.0f;
	v[1].u = 0.0f;
	v[1].v = 0.0f;
	v[2].u = 1.0f;
	v[2].v = 0.0f;
	v[3].u = 1.0f;
	v[3].v = 1.0f; 

	g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Enemy));
}

/* 敵の集団を描画する */
void drawEnemy(void) {
	int i;
	int x, y;
	initEnemy();
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			drawOneEnemy(enemies[i].x, enemies[i].y);
		}
	}
}

void updateEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			/*if () {
				enemies[i].is_alive = 0;
			}*/
		}
	}
}

要素は含まれていません
これで実行すると崩れて描画されてしまいます

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#9

投稿記事 by みけCAT » 8年前

shot さんが書きました:要素は含まれていません
では、なぜ関係ない自機のことを報告(そもそもこれは質問ではなさそうな気がしてきました)したのですか?
shot さんが書きました:これで実行すると崩れて描画されてしまいます
崩れて描画されてほしくなければ、崩れて描画されないように修正するか、諦めてプログラムを捨てるといいでしょう。
崩れて描画されてもよいのであれば、わざわざ報告しなくてもいいてましょう。
もしもどうすれば崩れて描画されなくなるかを考えて教えて欲しいのであれば、どのようになってほしくて、現状ではどうなっているのかを具体的に教えてください。
もちろん、わざわざ他人に考えてもらう必要がないのであれば、わざわざ教えてもらう必要はありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#10

投稿記事 by shot » 8年前

〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

上のようにしたいのですが分からないので上のようになるプログラムを教えてください
画像

shot

Re: シューティング

#11

投稿記事 by shot » 8年前

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇

 〇 〇 〇 〇 〇 〇 〇 〇
↑ずれていました
このようにしたいです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#12

投稿記事 by みけCAT » 8年前

15行目の

コード:

	v[0].y = pos;
が間違っていたので、

コード:

	v[0].y = ypos;
としてみてください。
オフトピック
No: 1のコードからコピペしてvが全角だったから半角に直しただけなんだよな…引っかかってしまった…(´・ω・`)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#13

投稿記事 by shot » 8年前

コード:


/* 当たり判定を計算させる */
void updateEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			if (shot_x[i] + 30 >= enemies[i].x + 16.0f&&shot_y[i] + 10 >= enemies[i].y + 16.0f&&enemies[i].x + 50.0f >= shot_x[i] +       16.0f&&enemies[i].x + 50.0f >= shot_y[i] + 16.0f){
				enemies[i].is_alive = 0;
			}
		}
	}
}
	//弾
	for (int i = 0; i < 5; i++)
	{
		if (shot_flg[i] == 1)
		{
			vertex[0].x = shot_x[i];
			vertex[0].y = shot_y[i];
			vertex[0].z = 0.0f;

			vertex[1].x = shot_x[i] + 5.0f;
			vertex[1].y = shot_y[i];
			vertex[1].z = 0.0f;

			vertex[2].x = shot_x[i] + 5.0f;
			vertex[2].y = shot_y[i] + 5.0f;
			vertex[2].z = 0.0f;

			vertex[3].x = shot_x[i];
			vertex[3].y = shot_y[i] + 5.0f;
			vertex[3].z = 0.0f;

			vertex[0].rhw = 1.0f;
			vertex[1].rhw = 1.0f;
			vertex[2].rhw = 1.0f;
			vertex[3].rhw = 1.0f;

		}
		
   }

あたり判定ができません
現在は弾を当てても無反応です
あたり判定のプログラムを教えてください

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#14

投稿記事 by みけCAT » 8年前

単純な各辺が軸に垂直または平行な四角形同士の当たり判定でいいのであれば、まず1次元で考え、
それをx方向とy方向で計算し、どちらも当たっていたら当たった、そうでなければ当たっていない、と判定すればいいでしょう。

1次元の範囲同士の当たり判定は、以下のように考えます。
範囲Aを[x1, x1 + width1]、範囲Bを[x2, x2 + width2]とします。 (width1 > 0, width2 > 0)
(1) 範囲Aが範囲Bの左にある場合 (当たっていない)

コード:

                   x1 + width1
                   v
範囲A    -----------
範囲B                   ---------
                        ^
                        x2
図より、 x1 + width1 < x2 となります。

(2) 範囲Aが範囲Bの右にある場合 (当たっていない)

コード:

                       x1
                       v
範囲A                  -----------
範囲B    ---------
                 ^
                 x2 + width2
図より、 x2 + width2 < x1 となります。

(3) どちらでもない場合 (当たっている)
(1)でも(2)でもないので、
!(x1 + width1 < x2 || x2 + width2 < x1)
すなわち、 x2 <= x1 + width1 && x1 <= x2 + width2 となります。
オフトピック
なんでうまくいったとかお礼とか一切書かれないんだろう?
一応まだトピックを閉じても去ってもいないから、規約的にはセーフ…なのか…。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#15

投稿記事 by みけCAT » 8年前

提示されたコードには両方の座標に何かの値(マジックナンバー)が足されている、x座標っぽい名前の値とy座標っぽい名前の値を比較している、
という気になる点もありますが、一番気になるのは同じ添字同士しか判定していないことですね。
普通のゲームでは、それぞれの自分の弾について、全ての敵の弾と当たっているかをそれぞれ判定すると思います。
オフトピック
弾幕ゲームとかで弾がいっぱいある場合は、もしかしたら画面を分割して明らかに当たらない位置の弾は判定しないなどの工夫はするかも?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#16

投稿記事 by shot » 8年前

コード:

/* 当たり判定を計算させる */
void updateEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			if (enemies[i].x >= shot_x[i] && enemies[i].x <= shot_x[i] && enemies[i].y >= shot_y[i] && enemies[i].y <= shot_y[i]){
			enemies[i].is_alive = 0;
			}
		}
	}
}
現状は弾が当たっても無反応(画面から消えません)
色々とやってみましたができませんでした
分からないのでソースを書いてほしいです

shot

Re: シューティング

#17

投稿記事 by shot » 8年前

コード:

/* 当たり判定を計算させる */
void updateEnemy(void) {
    int i;
    for (i = 0; i < ENEMY_NUM; i++) {
        if (enemies[i].is_alive) {
            if (enemies[i].x >= shot_x[i] && enemies[i].x <= shot_x[i] && enemies[i].y >= shot_y[i] && enemies[i].y <= shot_y[i]){
            enemies[i].is_alive = 0;
            }
        }
    }
}
現状は弾が当たっても無反応(画面から消えません)
色々とやってみましたができませんでした
分からないのでソースを書いてほしいです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#18

投稿記事 by みけCAT » 8年前

shot さんが書きました:現状は弾が当たっても無反応(画面から消えません)
今は敵も弾も大きさが0であり、座標が完全に一致した場合のみ当たったとみなす仕様ですよね。
本当に当たったのですか?
shot さんが書きました:分からないのでソースを書いてほしいです
現状だと、仕様がわからないので書けません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#19

投稿記事 by みけCAT » 8年前

オフトピック
shot さんが書きました:分からないのでソースを書いてほしいです
ソース

ソースを書きました。
何かのおまじないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#20

投稿記事 by shot » 8年前

コード:

 /* 敵の縦と横の数 */
#define X_NUM 8
#define Y_NUM 4

#define ENEMY_NUM (X_NUM * Y_NUM)

/* 敵の情報 */
enemy_data enemies[ENEMY_NUM];

/* 敵の情報を表す構造体 */
typedef struct {
	float x, y;	  /* 座標 */
	int is_alive; /* 生きてるか */
} enemy_data;


float charax = 300.0f;						
float charay = 350.0f;							
int i;					

int shot_flg[5] =
{
	0, 0, 0, 0, 0
};

float shot_x[5] =
{
	0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};

float shot_y[5] =
{
	0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};


void tama() {

	if (GetKeyboardPress(DIK_Z)){

		if (shot_y[i] < 0){
			shot_x[i] = charax + 21.f;
			shot_y[i] = charay + 10.0f;
		}

		for (int i = 0; i < 5; i++)
		{
			shot_flg[i] = 1;
			if (shot_flg[i] == 0)
			{
				shot_x[i] = charax + 21.f;
				shot_y[i] = charay + 10.0f;
				break;
			}
		}
	}

	for (int i = 0; i < 5; i++)
	{
		if (shot_flg[i]==1)
		{
			shot_y[i] -= 8;
		}
		if (shot_y[i] <0.0f)
		{
			shot_flg[i] = 0;
		}
	}

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float u, v;
	}TAMA;

	
	TAMA vertex[4];


	for (int i = 0; i < 5; i++)
	{
		if (shot_flg[i] == 1)
		{
			vertex[0].x = shot_x[i];
			vertex[0].y = shot_y[i];
			vertex[0].z = 0.0f;

			vertex[1].x = shot_x[i] + 5.0f;
			vertex[1].y = shot_y[i];
			vertex[1].z = 0.0f;

			vertex[2].x = shot_x[i] + 5.0f;
			vertex[2].y = shot_y[i] + 5.0f;
			vertex[2].z = 0.0f;

			vertex[3].x = shot_x[i];
			vertex[3].y = shot_y[i] + 5.0f;
			vertex[3].z = 0.0f;

			vertex[0].rhw = 1.0f;
			vertex[1].rhw = 1.0f;
			vertex[2].rhw = 1.0f;
			vertex[3].rhw = 1.0f;

			vertex[0].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[1].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[2].cor = D3DCOLOR_XRGB(255, 255, 255);
			vertex[3].cor = D3DCOLOR_XRGB(255, 255, 255);

			vertex[0].u = 0.0f;
			vertex[0].v = 0.0f;
			vertex[1].u = 1.0f;
			vertex[1].v = 0.0f;
			vertex[2].u = 1.0f;
			vertex[2].v = 1.0f;
			vertex[3].u = 0.0f;
			vertex[3].v = 1.0f;
		}
		g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(TAMA));
	}
}

void ziki (void) {

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float u, v;
	}ZIKI;

	ZIKI vertex[4];

	if (GetKeyboardPress(DIK_LEFT)) {
		charax -= 4.0f;
	}

	if (GetKeyboardPress(DIK_RIGHT)) {
		charax += 4.0f;
	}

	vertex[0].x = charax;
	vertex[0].y = charay;
	vertex[0].z = 0.0f;

	vertex[1].x = charax + 50.0f;
	vertex[1].y = charay;
	vertex[1].z = 0.0f;

	vertex[2].x = charax + 50.0f;
	vertex[2].y = charay + 50.0f;
	vertex[2].z = 0.0f;

	vertex[3].x = charax;
	vertex[3].y = charay + 50.0f;
	vertex[3].z = 0.0f;

	vertex[0].rhw = 1.0f;
	vertex[1].rhw = 1.0f;
	vertex[2].rhw = 1.0f;
	vertex[3].rhw = 1.0f;

	vertex[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	vertex[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	vertex[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	vertex[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	vertex[0].u = 0.0f;
	vertex[0].v = 1.0f;
	vertex[1].u = 0.0f;
	vertex[1].v = 0.0f;
	vertex[2].u = 1.0f;
	vertex[2].v = 0.0f;
	vertex[3].u = 1.0f;
	vertex[3].v = 1.0f;

	g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(ZIKI));
}

/* 敵を配置する */
void initEnemy(void) {
	int x, y;
	for (y = 0; y < Y_NUM; y++) {
		for (x = 0; x < X_NUM; x++) {
			enemies[y * X_NUM + x].x = 80.0f + 50.0f * x; 
			enemies[y * X_NUM + x].y = 50.0f + 50.0f * y; 
			enemies[y * X_NUM + x].is_alive = 1;
		}
	}
}

/* 敵1体を(pos, ypos)に描画する */
void drawOneEnemy(float pos, float ypos) {

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float u, v;
	}Enemy;

	Enemy v[4];

	v[0].x = pos;
	v[0].y = ypos;
	v[0].z = 0.0f;

	v[1].x = pos + 20.0f;
	v[1].y = ypos;
	v[1].z = 0.0f;

	v[2].x = pos + 20.0f;
	v[2].y = ypos + 20.0f;
	v[2].z = 0.0f;

	v[3].x = pos;
	v[3].y = ypos + 20.0f;
	v[3].z = 0.0f;

	v[0].rhw = 1.0f;
	v[1].rhw = 1.0f;
	v[2].rhw = 1.0f;
	v[3].rhw = 1.0f;

	v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	v[0].u = 0.0f;
	v[0].v = 1.0f;
	v[1].u = 0.0f;
	v[1].v = 0.0f;
	v[2].u = 1.0f;
	v[2].v = 0.0f;
	v[3].u = 1.0f;
	v[3].v = 1.0f; 

	g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Enemy));
}

/* 敵の集団を描画する */
void drawEnemy(void) {
	int i;
	initEnemy();
 /* 生きている敵のみ描画する */
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			drawOneEnemy(enemies[i].x, enemies[i].y);
		}
	}
}


/* 当たり判定を計算させる */
void updateEnemy(void) {
	int i;
	for (i = 0; i < ENEMY_NUM; i++) {
		if (enemies[i].is_alive) {
			if (enemies[i].x+30 >= shot_x[i]+10 && enemies[i].x+30 <= shot_x[i]+10&& enemies[i].y+10 >= shot_y[i]+10 && enemies[i].y+30 <= shot_y[i]+10){
			enemies[i].is_alive = 0;
			}
		}
	}
}
	
弾が敵にあたったら あたった敵が消滅(画面外から消え描画されななる)プログラムのソースコードを教えてください
現在は判定がとれていません

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#21

投稿記事 by みけCAT » 8年前

shot さんが書きました:弾が敵にあたったら あたった敵が消滅(画面外から消え描画されななる)プログラムのソースコードを教えてください
「弾」と「敵」の仕様を決めて教えてください。
例えば
  • 当たり判定がある領域は各辺が軸に平行または垂直な四角形?それ以外?
  • 値として管理する座標は当たり判定がある領域のどこ(左上、中央など)?
  • 当たり判定がある領域の大きさは?
また、「画面外から消え」というのは「画面から消え」という意味ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shot

Re: シューティング

#22

投稿記事 by shot » 8年前

平行な四角形です
中央です
弾と敵が少しでも接触すると

画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです

shot

Re: シューティング

#23

投稿記事 by shot » 8年前

みけCAT さんが書きました:平行な四角形です
中央です
弾と敵が少しでも接触すると

画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
平行な四角形です
中央です
弾と敵が少しでも接触すると

画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シューティング

#24

投稿記事 by みけCAT » 8年前

shot さんが書きました:平行な四角形です
中央です
弾と敵が少しでも接触すると

画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
こんな感じでしょうか? (コンパイル・テストはしていません)

コード:

/* (xpos, ypos)に大きさsizeのキャラクターを描画する */
void drawCharacter(float xpos, float ypos, float size, int type) {

	typedef struct {
		float x, y, z;
		float rhw;
		D3DCOLOR cor;
		float u, v;
	} Character;

	Character v[4];

	v[0].x = xpos - size / 2.0f;
	v[0].y = ypos - size / 2.0f;
	v[0].z = 0.0f;

	v[1].x = xpos + size / 2.0f;
	v[1].y = ypos - size / 2.0f;
	v[1].z = 0.0f;

	v[2].x = xpos + size / 2.0f;
	v[2].y = ypos + size / 2.0f;
	v[2].z = 0.0f;

	v[3].x = xpos - size / 2.0f;
	v[3].y = ypos + size / 2.0f;
	v[3].z = 0.0f;

	v[0].rhw = 1.0f;
	v[1].rhw = 1.0f;
	v[2].rhw = 1.0f;
	v[3].rhw = 1.0f;

	v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
	v[3].cor = D3DCOLOR_XRGB(255, 255, 255);

	switch (type) {
		case 0:
			v[0].u = 0.0f;
			v[0].v = 1.0f;
			v[1].u = 0.0f;
			v[1].v = 0.0f;
			v[2].u = 1.0f;
			v[2].v = 0.0f;
			v[3].u = 1.0f;
			v[3].v = 1.0f;
			break;
		case 1:
			v[0].u = 0.0f;
			v[0].v = 0.0f;
			v[1].u = 1.0f;
			v[1].v = 0.0f;
			v[2].u = 1.0f;
			v[2].v = 1.0f;
			v[3].u = 0.0f;
			v[3].v = 1.0f;
			break;
	}

	g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Character));
}

/* 敵の縦と横の数 */
#define X_NUM 8
#define Y_NUM 4

#define ENEMY_NUM (X_NUM * Y_NUM)

/* 敵の情報を表す構造体 */
typedef struct {
	float x, y;	  /* 座標 */
	int is_alive; /* 生きてるか */
} enemy_data;

/* 敵の情報 */
enemy_data enemies[ENEMY_NUM];

float charax = 325.0f;
float charay = 375.0f;
int i;

int shot_flg[5] =
{
	0, 0, 0, 0, 0
};

float shot_x[5] =
{
	0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};

float shot_y[5] =
{
	0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};


void tama() {

	if (GetKeyboardPress(DIK_Z)){

		if (shot_y[i] < 0){
			shot_x[i] = charax - 1.5f;
			shot_y[i] = charay - 12.5f;
		}

		for (int i = 0; i < 5; i++)
		{
			shot_flg[i] = 1;
		}
	}

	for (int i = 0; i < 5; i++)
	{
		if (shot_flg[i]==1)
		{
			shot_y[i] -= 8;
		}
		if (shot_y[i] <0.0f)
		{
			shot_flg[i] = 0;
		}
	}

	for (int i = 0; i < 5; i++)
	{
		if (shot_flg[i] == 1)
		{
			drawCharacter(shot_x[i], shot_y[i], 5.0f, 1);
		}
	}
}

void ziki (void) {

	if (GetKeyboardPress(DIK_LEFT)) {
		charax -= 4.0f;
	}

	if (GetKeyboardPress(DIK_RIGHT)) {
		charax += 4.0f;
	}

	drawCharacter(charax, charay, 50.0f, 0);
}

/* 敵を配置する */
void initEnemy(void) {
	for (int y = 0; y < Y_NUM; y++)
	{
		for (int x = 0; x < X_NUM; x++)
		{
			enemies[y * X_NUM + x].x = 70.0f + 50.0f * x;
			enemies[y * X_NUM + x].y = 40.0f + 50.0f * y;
			enemies[y * X_NUM + x].is_alive = 1;
		}
	}
}

/* 敵の集団を描画する */
void drawEnemy(void) {
	/* 生きている敵のみ描画する */
	for (int i = 0; i < ENEMY_NUM; i++)
	{
		if (enemies[i].is_alive) {
			drawCharacter(enemies[i].x, enemies[i].y, 20.0f, 0);
		}
	}
}


/* 当たり判定を計算する */
void updateEnemy(void) {
	for (int i = 0; i < ENEMY_NUM; i++)
	{
		if (enemies[i].is_alive) {
			for (int j = 0; j < 5; j++)
			{
				if (shot_flg[j] == 1 &&
				fabs(enemies[i].x - shot_x[j]) <= (20.0f + 5.0f) / 2.0f &&
				fabs(enemies[i].y - shot_y[j]) <= (20.0f + 5.0f) / 2.0f) {
					enemies[i].is_alive = 0;
					break;
				}
			}
		}
	}
}
fabs()を使ったので、math.hをインクルードしてください。
また、メインループが含まれていないので、別に用意する必要があります。

毎フレームinitEnemy()を呼び出してしまうとせっかく敵を消しても(当然)毎フレーム復活してしまうので、それは避けてゲーム開始時に呼び出すようにしましょう。
shot さんが書きました:
みけCAT さんが書きました:平行な四角形です
中央です
弾と敵が少しでも接触すると

画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
自分はこんなことは書いていません。
捏造はやめてください。
不快です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る