ページ 1 / 1
シューティング
Posted: 2016年12月03日(土) 17:13
by shot
コード:
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に配置するプログラムを教えてください
Re: シューティング
Posted: 2016年12月03日(土) 17:23
by あんどーなつ
何これわかりづらいwww
つまりこういうことでしょうか?敵を〇としたときに、
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
敵の画像は20.0fx20.0fより小さく、縦横の敵は20.0fごとに並べる。
左上の敵は(pos, pos, 0.0f)に配置。
全ての敵はz平面上に存在。
Re: シューティング
Posted: 2016年12月04日(日) 11:12
by shot
コード:
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体ずつのあたり判定の取り方を教えてください
Re: シューティング
Posted: 2016年12月04日(日) 11:42
by みけCAT
shot さんが書きました:あたり判定を作ったのですが左上の敵に当てると全ての敵が消滅します
1体ずつのあたり判定の取り方を教えてください
まず、描画の時に敵の絵を増やすのではなく、敵の情報を格納する場所を増やさないといけなそうです。
(もしかしたらすでにあるのかもしれませんが、その部分のコードが提示されていないのでわかりません)
敵1体ずつの情報を用意したら、それぞれについてあたり判定をします。
Re: シューティング
Posted: 2016年12月04日(日) 12:52
by shot
コード:
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;
}
}
左上に当てると自機が右下に移動してしまいます
Re: シューティング
Posted: 2016年12月04日(日) 13:15
by みけCAT
shot さんが書きました:左上に当てると自機が右下に移動してしまいます
この提示した部分に「自機」の要素は含まれていますか?
Re: シューティング
Posted: 2016年12月04日(日) 13:26
by みけCAT
イメージとして、こんな感じのプログラムにすると実装できると思います。
コード:
/* 敵の情報を表す構造体 */
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();
Re: シューティング
Posted: 2016年12月07日(水) 16:42
by shot
コード:
/* 敵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;
}*/
}
}
}
要素は含まれていません
これで実行すると崩れて描画されてしまいます
Re: シューティング
Posted: 2016年12月07日(水) 18:36
by みけCAT
shot さんが書きました:要素は含まれていません
では、なぜ関係ない自機のことを報告(そもそもこれは質問ではなさそうな気がしてきました)したのですか?
shot さんが書きました:これで実行すると崩れて描画されてしまいます
崩れて描画されてほしくなければ、崩れて描画されないように修正するか、諦めてプログラムを捨てるといいでしょう。
崩れて描画されてもよいのであれば、わざわざ報告しなくてもいいてましょう。
もしもどうすれば崩れて描画されなくなるかを考えて教えて欲しいのであれば、どのようになってほしくて、現状ではどうなっているのかを具体的に教えてください。
もちろん、わざわざ他人に考えてもらう必要がないのであれば、わざわざ教えてもらう必要はありません。
Re: シューティング
Posted: 2016年12月07日(水) 21:39
by shot
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
上のようにしたいのですが分からないので上のようになるプログラムを教えてください

Re: シューティング
Posted: 2016年12月07日(水) 21:41
by shot
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
〇 〇 〇 〇 〇 〇 〇 〇
↑ずれていました
このようにしたいです
Re: シューティング
Posted: 2016年12月07日(水) 23:11
by みけCAT
15行目の
が間違っていたので、
としてみてください。
オフトピック
No: 1のコードからコピペしてvが全角だったから半角に直しただけなんだよな…引っかかってしまった…(´・ω・`)
Re: シューティング
Posted: 2016年12月08日(木) 00:04
by shot
コード:
/* 当たり判定を計算させる */
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;
}
}
あたり判定ができません
現在は弾を当てても無反応です
あたり判定のプログラムを教えてください
Re: シューティング
Posted: 2016年12月08日(木) 00:48
by みけCAT
単純な各辺が軸に垂直または平行な四角形同士の当たり判定でいいのであれば、まず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 となります。
オフトピック
なんでうまくいったとかお礼とか一切書かれないんだろう?
一応まだトピックを閉じても去ってもいないから、規約的にはセーフ…なのか…。
Re: シューティング
Posted: 2016年12月08日(木) 00:52
by みけCAT
提示されたコードには両方の座標に何かの値(マジックナンバー)が足されている、x座標っぽい名前の値とy座標っぽい名前の値を比較している、
という気になる点もありますが、一番気になるのは同じ添字同士しか判定していないことですね。
普通のゲームでは、それぞれの自分の弾について、全ての敵の弾と当たっているかをそれぞれ判定すると思います。
オフトピック
弾幕ゲームとかで弾がいっぱいある場合は、もしかしたら画面を分割して明らかに当たらない位置の弾は判定しないなどの工夫はするかも?
Re: シューティング
Posted: 2016年12月08日(木) 20:12
by shot
コード:
/* 当たり判定を計算させる */
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;
}
}
}
}
現状は弾が当たっても無反応(画面から消えません)
色々とやってみましたができませんでした
分からないのでソースを書いてほしいです
Re: シューティング
Posted: 2016年12月10日(土) 12:22
by shot
コード:
/* 当たり判定を計算させる */
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;
}
}
}
}
現状は弾が当たっても無反応(画面から消えません)
色々とやってみましたができませんでした
分からないのでソースを書いてほしいです
Re: シューティング
Posted: 2016年12月10日(土) 12:41
by みけCAT
shot さんが書きました:現状は弾が当たっても無反応(画面から消えません)
今は敵も弾も大きさが0であり、座標が完全に一致した場合のみ当たったとみなす仕様ですよね。
本当に当たったのですか?
shot さんが書きました:分からないのでソースを書いてほしいです
現状だと、仕様がわからないので書けません。
Re: シューティング
Posted: 2016年12月10日(土) 12:43
by みけCAT
オフトピック
shot さんが書きました:分からないのでソースを書いてほしいです
ソース
ソースを書きました。
何かのおまじないでしょうか?
Re: シューティング
Posted: 2016年12月10日(土) 23:59
by shot
コード:
/* 敵の縦と横の数 */
#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;
}
}
}
}
弾が敵にあたったら あたった敵が消滅(画面外から消え描画されななる)プログラムのソースコードを教えてください
現在は判定がとれていません
Re: シューティング
Posted: 2016年12月11日(日) 00:18
by みけCAT
shot さんが書きました:弾が敵にあたったら あたった敵が消滅(画面外から消え描画されななる)プログラムのソースコードを教えてください
「弾」と「敵」の仕様を決めて教えてください。
例えば
- 当たり判定がある領域は各辺が軸に平行または垂直な四角形?それ以外?
- 値として管理する座標は当たり判定がある領域のどこ(左上、中央など)?
- 当たり判定がある領域の大きさは?
また、「画面外から消え」というのは「画面から消え」という意味ですか?
Re: シューティング
Posted: 2016年12月11日(日) 00:32
by shot
平行な四角形です
中央です
弾と敵が少しでも接触すると
画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
Re: シューティング
Posted: 2016年12月11日(日) 21:54
by shot
みけCAT さんが書きました:平行な四角形です
中央です
弾と敵が少しでも接触すると
画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
平行な四角形です
中央です
弾と敵が少しでも接触すると
画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
Re: シューティング
Posted: 2016年12月11日(日) 22:38
by みけCAT
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 さんが書きました:平行な四角形です
中央です
弾と敵が少しでも接触すると
画面外から消え・・・弾が敵に当たってその敵が描画されなくなることです
自分はこんなことは書いていません。
捏造はやめてください。
不快です。