#1
by くろのま » 3年前
初心者です。
DXライブラリを使ってシューティングゲームを作っています。敵を決まったタイミングで表示して動かそうとしました。すると、ちゃんと表示されて動きもするんですが、次の敵が現れたら前に表示された敵は消えてしまいます。それと、敵を倒したら当たり判定が残る?ような現象も発生しています。原因が全く分からないので、教えて頂きたいです。ごちゃごちゃしててすみません。
環境は Windows10、 Visual Studio 2019です。
コード:
#include "Game.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "keyboard.h"
#include "gameclear.h"
#define SHOT 20
#define ENEMY 20
static int mImageHandle; //画像ハンドル格納用変数
static int player; //画像ハンドル格納(自機)
static int bullet; //画像ハンドル格納(弾)
static int enemy; //画像ハンドル格納(敵)
static int enemyBullet; //画像ハンドル格納(敵の弾)
static int SHandle; //音ハンドル格納用変数(戦闘BGM)
static int bulletSHandle; //音ハンドル格納(弾の発射音)
int playerplase_x = 100, playerplase_y = 200; //自機の初期位置
int enemy_h = 64, enemy_w = 64, bullet_h = 16, bullet_w = 16; //敵と弾の幅と高さ
int enemy_x[ENEMY], enemy_y[ENEMY]; //敵の座標
int bullet_x[SHOT], bullet_y[SHOT],bulletFlag[SHOT]; //弾の座標,フラグ
int enemyB_x[ENEMY], enemyB_y[ENEMY], enemySFlag[ENEMY]; //敵の弾の座標、フラグ
int enemyFlag[ENEMY]; //敵が存在しているかのフラグ
int i,j;
int bulletBFlag; //ショットボタンが前のフレームで押されたかどうかを保存する
int countar;
int EbulletCounter = 0; //敵の弾のカウンター
int Ecounter = 0; //敵のカウンター(仮)
int myFlag = 1;
int SoundCount; //戦闘BGM
int Enemycounter; //敵が出現する時間を管理する
//初期化
void Game_Initialize() {
mImageHandle = LoadGraph("画像/menyu.png"); //画像のロード
player = LoadGraph("画像/mon1/mon_006.bmp");
bullet = LoadGraph("画像/mon1/mon_040.bmp");
enemy = LoadGraph("画像/mon1/mon_020.bmp");
enemyBullet = LoadGraph("画像/mon1/mon_001.bmp");
SHandle = LoadSoundMem("BGM/BGM088-100714-kongoushinkidaia-su-wav.wav");
bulletSHandle = LoadSoundMem("BGM/攻撃の音/射撃_ショット.wav");
}
//更新
void Game_Update() {
if (CheckHitKey(KEY_INPUT_BACK) != 0) { //Escキーが押されていたら
SceneMgr_ChangeScene(eScene_Menu); //シーンをメニューに変更
}
if (countar == 5) {
SceneMgr_ChangeScene(eScene_Gameclear);
countar = 0;
SoundCount = 0;
}
for (j = 0; j < ENEMY; j++) {
if (enemySFlag[j] == 1) {
if (((enemyB_x[j] > playerplase_x && enemyB_x[j] < playerplase_x + 48) ||
(playerplase_x > enemyB_x[j] && playerplase_x + 64 < enemyB_x[j])) &&
((enemyB_y[j] > playerplase_y && enemyB_y[j] < playerplase_y + 56) ||
(playerplase_y > enemyB_y[j] && playerplase_y < enemyB_y[j] + 24))) {
enemySFlag[j] = 0;
WaitTimer(1000);
SceneMgr_ChangeScene(eScene_Gameover); //シーンをゲームオーバーに変更
SoundCount = 0;
countar = 0;
break;
}
}
}
}
//描画
void Game_Draw() {
DrawGraph(0, 0, mImageHandle, FALSE);
if (SoundCount == 1) {
PlaySoundMem(SHandle, DX_PLAYTYPE_LOOP);
}
//bulletBFlag = 0; //ショットボタンが前のフレームで押されていない
if (CheckHitKey(KEY_INPUT_RIGHT) == 1) { //右キーが押されていたら
playerplase_x += 5; //右へ移動
}
if (CheckHitKey(KEY_INPUT_DOWN) == 1) { //下キーが押されていたら
playerplase_y += 5; //下へ移動
}
if (CheckHitKey(KEY_INPUT_LEFT) == 1) { //左キーが押されていたら
playerplase_x -= 5; //左へ移動
}
if (CheckHitKey(KEY_INPUT_UP) == 1) { //上キーが押されていたら
playerplase_y -= 5; //上へ移動
}
if (playerplase_x < 0)playerplase_x = 0; //画面からはみ出るのを阻止(左)
if (playerplase_x > 640 - 48)playerplase_x = 640 - 48; //はみ出し阻止(右) 48は画像の幅
if (playerplase_y < 0)playerplase_y = 0; //はみ出し阻止(上)
if (playerplase_y > 480 - 56)playerplase_y = 480 - 56; //はみ出し阻止(下) 56は画像の高さ
DrawGraph(playerplase_x, playerplase_y, player, FALSE); //x,yの位置に自機を描画
if (CheckHitKey(KEY_INPUT_SPACE)) { //スペースキーが押されたら弾を発射
if (bulletBFlag == 0) { //前のフレームでショットボタンが押されていなかったら弾を発射
for (i = 0; i < SHOT; i++) {
if (bulletFlag[i] == 0) {
bullet_x[i] = playerplase_x + 24;
bullet_y[i] = playerplase_y + 20;
bulletFlag[i] = 1;
PlaySoundMem(bulletSHandle, DX_PLAYTYPE_BACK);
break; //弾を出したのでループから抜ける
}
}
}
bulletBFlag = 1; //前フレームでショットボタンを押されていたという情報を代入
}
else { //ショットボタンが押されていなかった場合は
bulletBFlag = 0; //押されていないを代入
}
for (i = 0; i < SHOT; i++) {
if (bulletFlag[i] == 1) {
bullet_x[i] += 16; //弾が発射中なら弾を右へ移動、画面外に出たらフラグをにする
if (bullet_x[i] > 640) {
bulletFlag[i] = 0;
}
DrawGraph(bullet_x[i], bullet_y[i], bullet, FALSE); //弾が発射中の時のみ画像を描画
}
}
if (Enemycounter == 10 || Enemycounter == 90 || Enemycounter == 170) {
for (i = 0; i < 3; i++) {
enemy_x[i] = 640;
enemy_y[i] = 30;
enemyFlag[i] = 1;
break;
}
}
for (i = 0; i < ENEMY; i++) {
if (enemyFlag[i] == 1) {
enemy_x[i] -= 2;
if (enemy_x[i]+64 < 0) { //画面外に出たらフラグを0にする処理
enemyFlag[i] = 0;
}
DrawTurnGraph(enemy_x[i], enemy_y[i], enemy, FALSE);
break;
}
}
EbulletCounter++;
for (j = 0; j < ENEMY; j++) { //敵の弾の座標を格納
if (EbulletCounter == 120 && enemyFlag[j] == 1) {
enemyB_x[j] = enemy_x[j];
enemyB_y[j] = enemy_y[j] + 15;
enemySFlag[j] = 1;
EbulletCounter = 0;
break;
}
}
for (j = 0; j < ENEMY; j++) {
if (enemySFlag[j] == 1) { //敵の弾のフラグが1なら
enemyB_x[j] -= 6; //敵の弾のx座標を1フレームごとに6移動する
if (enemyB_x[j] + 32 < 0) { //敵の弾のx座標が0より小さくなったら(画面外に出たら)
enemySFlag[j] = 0;
}
DrawTurnGraph(enemyB_x[j],enemyB_y[j],enemyBullet,FALSE);
break;
}
}
for (j = 0; j < SHOT; j++) { //自機の弾と敵の当たり判定
if (bulletFlag[j] == 1) {
if (((bullet_x[j] > enemy_x[j] && bullet_x[j] < enemy_x[j] + enemy_w) ||
(enemy_x[j] > bullet_x[j] && enemy_x[j] < bullet_x[j] + bullet_w)) &&
((bullet_y[j] > enemy_y[j] && bullet_y[j] < enemy_y[j] + enemy_h) ||
(enemy_y[j] > bullet_y[j] && enemy_y[j] < bullet_y[j] + bullet_h))) {
bulletFlag[j] = 0;
enemyFlag[j] = 0;
countar += 1;
break;
}
}
}
SoundCount++;
Enemycounter++;
}
//終了処理
void Game_Finalize() {
DeleteGraph(mImageHandle); //画像の開放
DeleteGraph(player); //画像の開放
DeleteGraph(bullet); //解放(弾)
DeleteGraph(enemy); //解放(敵)
DeleteGraph(enemyBullet); //解放(敵の弾)
DeleteSoundMem(SHandle); //音の開放(戦闘BGM)
DeleteSoundMem(bulletSHandle); //音の開放(弾の発射音)
}
初心者です。
DXライブラリを使ってシューティングゲームを作っています。敵を決まったタイミングで表示して動かそうとしました。すると、ちゃんと表示されて動きもするんですが、次の敵が現れたら前に表示された敵は消えてしまいます。それと、敵を倒したら当たり判定が残る?ような現象も発生しています。原因が全く分からないので、教えて頂きたいです。ごちゃごちゃしててすみません。
環境は Windows10、 Visual Studio 2019です。
[code]
#include "Game.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "keyboard.h"
#include "gameclear.h"
#define SHOT 20
#define ENEMY 20
static int mImageHandle; //画像ハンドル格納用変数
static int player; //画像ハンドル格納(自機)
static int bullet; //画像ハンドル格納(弾)
static int enemy; //画像ハンドル格納(敵)
static int enemyBullet; //画像ハンドル格納(敵の弾)
static int SHandle; //音ハンドル格納用変数(戦闘BGM)
static int bulletSHandle; //音ハンドル格納(弾の発射音)
int playerplase_x = 100, playerplase_y = 200; //自機の初期位置
int enemy_h = 64, enemy_w = 64, bullet_h = 16, bullet_w = 16; //敵と弾の幅と高さ
int enemy_x[ENEMY], enemy_y[ENEMY]; //敵の座標
int bullet_x[SHOT], bullet_y[SHOT],bulletFlag[SHOT]; //弾の座標,フラグ
int enemyB_x[ENEMY], enemyB_y[ENEMY], enemySFlag[ENEMY]; //敵の弾の座標、フラグ
int enemyFlag[ENEMY]; //敵が存在しているかのフラグ
int i,j;
int bulletBFlag; //ショットボタンが前のフレームで押されたかどうかを保存する
int countar;
int EbulletCounter = 0; //敵の弾のカウンター
int Ecounter = 0; //敵のカウンター(仮)
int myFlag = 1;
int SoundCount; //戦闘BGM
int Enemycounter; //敵が出現する時間を管理する
//初期化
void Game_Initialize() {
mImageHandle = LoadGraph("画像/menyu.png"); //画像のロード
player = LoadGraph("画像/mon1/mon_006.bmp");
bullet = LoadGraph("画像/mon1/mon_040.bmp");
enemy = LoadGraph("画像/mon1/mon_020.bmp");
enemyBullet = LoadGraph("画像/mon1/mon_001.bmp");
SHandle = LoadSoundMem("BGM/BGM088-100714-kongoushinkidaia-su-wav.wav");
bulletSHandle = LoadSoundMem("BGM/攻撃の音/射撃_ショット.wav");
}
//更新
void Game_Update() {
if (CheckHitKey(KEY_INPUT_BACK) != 0) { //Escキーが押されていたら
SceneMgr_ChangeScene(eScene_Menu); //シーンをメニューに変更
}
if (countar == 5) {
SceneMgr_ChangeScene(eScene_Gameclear);
countar = 0;
SoundCount = 0;
}
for (j = 0; j < ENEMY; j++) {
if (enemySFlag[j] == 1) {
if (((enemyB_x[j] > playerplase_x && enemyB_x[j] < playerplase_x + 48) ||
(playerplase_x > enemyB_x[j] && playerplase_x + 64 < enemyB_x[j])) &&
((enemyB_y[j] > playerplase_y && enemyB_y[j] < playerplase_y + 56) ||
(playerplase_y > enemyB_y[j] && playerplase_y < enemyB_y[j] + 24))) {
enemySFlag[j] = 0;
WaitTimer(1000);
SceneMgr_ChangeScene(eScene_Gameover); //シーンをゲームオーバーに変更
SoundCount = 0;
countar = 0;
break;
}
}
}
}
//描画
void Game_Draw() {
DrawGraph(0, 0, mImageHandle, FALSE);
if (SoundCount == 1) {
PlaySoundMem(SHandle, DX_PLAYTYPE_LOOP);
}
//bulletBFlag = 0; //ショットボタンが前のフレームで押されていない
if (CheckHitKey(KEY_INPUT_RIGHT) == 1) { //右キーが押されていたら
playerplase_x += 5; //右へ移動
}
if (CheckHitKey(KEY_INPUT_DOWN) == 1) { //下キーが押されていたら
playerplase_y += 5; //下へ移動
}
if (CheckHitKey(KEY_INPUT_LEFT) == 1) { //左キーが押されていたら
playerplase_x -= 5; //左へ移動
}
if (CheckHitKey(KEY_INPUT_UP) == 1) { //上キーが押されていたら
playerplase_y -= 5; //上へ移動
}
if (playerplase_x < 0)playerplase_x = 0; //画面からはみ出るのを阻止(左)
if (playerplase_x > 640 - 48)playerplase_x = 640 - 48; //はみ出し阻止(右) 48は画像の幅
if (playerplase_y < 0)playerplase_y = 0; //はみ出し阻止(上)
if (playerplase_y > 480 - 56)playerplase_y = 480 - 56; //はみ出し阻止(下) 56は画像の高さ
DrawGraph(playerplase_x, playerplase_y, player, FALSE); //x,yの位置に自機を描画
if (CheckHitKey(KEY_INPUT_SPACE)) { //スペースキーが押されたら弾を発射
if (bulletBFlag == 0) { //前のフレームでショットボタンが押されていなかったら弾を発射
for (i = 0; i < SHOT; i++) {
if (bulletFlag[i] == 0) {
bullet_x[i] = playerplase_x + 24;
bullet_y[i] = playerplase_y + 20;
bulletFlag[i] = 1;
PlaySoundMem(bulletSHandle, DX_PLAYTYPE_BACK);
break; //弾を出したのでループから抜ける
}
}
}
bulletBFlag = 1; //前フレームでショットボタンを押されていたという情報を代入
}
else { //ショットボタンが押されていなかった場合は
bulletBFlag = 0; //押されていないを代入
}
for (i = 0; i < SHOT; i++) {
if (bulletFlag[i] == 1) {
bullet_x[i] += 16; //弾が発射中なら弾を右へ移動、画面外に出たらフラグをにする
if (bullet_x[i] > 640) {
bulletFlag[i] = 0;
}
DrawGraph(bullet_x[i], bullet_y[i], bullet, FALSE); //弾が発射中の時のみ画像を描画
}
}
if (Enemycounter == 10 || Enemycounter == 90 || Enemycounter == 170) {
for (i = 0; i < 3; i++) {
enemy_x[i] = 640;
enemy_y[i] = 30;
enemyFlag[i] = 1;
break;
}
}
for (i = 0; i < ENEMY; i++) {
if (enemyFlag[i] == 1) {
enemy_x[i] -= 2;
if (enemy_x[i]+64 < 0) { //画面外に出たらフラグを0にする処理
enemyFlag[i] = 0;
}
DrawTurnGraph(enemy_x[i], enemy_y[i], enemy, FALSE);
break;
}
}
EbulletCounter++;
for (j = 0; j < ENEMY; j++) { //敵の弾の座標を格納
if (EbulletCounter == 120 && enemyFlag[j] == 1) {
enemyB_x[j] = enemy_x[j];
enemyB_y[j] = enemy_y[j] + 15;
enemySFlag[j] = 1;
EbulletCounter = 0;
break;
}
}
for (j = 0; j < ENEMY; j++) {
if (enemySFlag[j] == 1) { //敵の弾のフラグが1なら
enemyB_x[j] -= 6; //敵の弾のx座標を1フレームごとに6移動する
if (enemyB_x[j] + 32 < 0) { //敵の弾のx座標が0より小さくなったら(画面外に出たら)
enemySFlag[j] = 0;
}
DrawTurnGraph(enemyB_x[j],enemyB_y[j],enemyBullet,FALSE);
break;
}
}
for (j = 0; j < SHOT; j++) { //自機の弾と敵の当たり判定
if (bulletFlag[j] == 1) {
if (((bullet_x[j] > enemy_x[j] && bullet_x[j] < enemy_x[j] + enemy_w) ||
(enemy_x[j] > bullet_x[j] && enemy_x[j] < bullet_x[j] + bullet_w)) &&
((bullet_y[j] > enemy_y[j] && bullet_y[j] < enemy_y[j] + enemy_h) ||
(enemy_y[j] > bullet_y[j] && enemy_y[j] < bullet_y[j] + bullet_h))) {
bulletFlag[j] = 0;
enemyFlag[j] = 0;
countar += 1;
break;
}
}
}
SoundCount++;
Enemycounter++;
}
//終了処理
void Game_Finalize() {
DeleteGraph(mImageHandle); //画像の開放
DeleteGraph(player); //画像の開放
DeleteGraph(bullet); //解放(弾)
DeleteGraph(enemy); //解放(敵)
DeleteGraph(enemyBullet); //解放(敵の弾)
DeleteSoundMem(SHandle); //音の開放(戦闘BGM)
DeleteSoundMem(bulletSHandle); //音の開放(弾の発射音)
}
[/code]