現在浅い知識ながらシューティングゲームを作っていて、敵を倒すとゲームクリアの文字が表示されRキーでコンテニューというシステムにしたのですが、
コンテニューは無事にできてもコンテニュー後もう一度敵を倒した際の爆発エフェクトが描画されなくて困ってます。どうしてなのでしょうか。
間違いがわからず全文貼ってしまったので時間に余裕のある方ご教授願いたいです。
#include "DxLib.h"
#define SCROLL_SPEED 2
int p, px, py,pw,ph,pdf;
int e, ex, ey, ew, eh, emuki,edf,sdc;
int sf[10], sx[10], sy[10], sw, sh, sg;
int esf, esx, esy, esw, esh, esg, esc;
int b,bc,bgf,count;
int hx, hy;
int haikei;
int i;
enum{TITLE,MAIN,CLEAR,OVER}status=TITLE;
//タイトル画面
void gameTitle() {
LoadGraphScreen(0, 0, "haikeikari.png", FALSE);
if (CheckHitKey(KEY_INPUT_RETURN)) {
status = MAIN;
}
edf = 0;
pdf = 0;
bgf = 0;
DrawString(225, 225, "PRESS ENTER TO START",GetColor(255,255,255));
}
//メイン画面
void gameMain() {
if (edf == 1) {
status = CLEAR;
}
if (pdf == 1) {
status = OVER;
}
}
//クリア画面
void gameClear() {
DrawString(280, 225, "GAME CLEAR", GetColor(255, 255, 255));
DrawString(240, 245, "PRESS R TO CONTINUE", GetColor(255, 255, 255));
if (CheckHitKey(KEY_INPUT_R)) {
status = TITLE;
}
}
//ゲームオーバー画面
void gameOver() {
DrawString(279, 225, "GAME OVER", GetColor(255, 255, 255));
DrawString(240, 245, "PRESS R TO CONTINUE", GetColor(255, 255, 255));
if (CheckHitKey(KEY_INPUT_R)) {
status = TITLE;
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
//各変数画像設定
p = LoadGraph("player1.png");
sg = LoadGraph("pshot.png");
e = LoadGraph("enemy1.png");
b = LoadGraph("effe.png");
haikei = LoadGraph("haikeikari.png");
esg = LoadGraph("eshot.png");
//背景の初期値設定
hx = 0;
hy = 0;
//自機変数の初期値設定
px = 288;
py = 400;
pdf = 0;
GetGraphSize(p, &pw, &ph);
//敵変数の初期値設定
ex = 320;
ey = 74;
emuki = 1;
edf = 0;
GetGraphSize(e, &ew, &eh);
//自弾変数の初期値設定
GetGraphSize(sg, &sw, &sh);
for (i = 0; i < 10; i++) {
sf[i] = 0;
}
//敵弾変数の初期値設定
GetGraphSize(esg, &esw, &esh);
esf = 0;
esc = 0;
//爆発エフェクトの初期設定
bc = 255;
bgf = 0;
while (!ProcessMessage()) {
ClearDrawScreen();
//背景ループ
{
DrawGraph(hx, hy, haikei, FALSE);
DrawGraph(hx, hy - 480, haikei, FALSE);
if (hy == 480)hy = 0;
hy += SCROLL_SPEED;
}
//自機の操作設定
{
if (CheckHitKey(KEY_INPUT_LEFT)) px -= 4; {
if (px < 0 - 64 + 52)px = 0 - 64 + 52;
}
if (CheckHitKey(KEY_INPUT_RIGHT)) px += 4; {
if (px > 640 - 52)px = 640 - 52;
}
if (CheckHitKey(KEY_INPUT_UP)) py -= 4; {
if (py < 0)py = 0;
}
if (CheckHitKey(KEY_INPUT_DOWN)) py += 4; {
if (py > 480 - 64)py = 480 - 64;
}
if (CheckHitKey(KEY_INPUT_SPACE)) {
for (i = 0; i < 10; i++) {
if (sf[i] == 0) {
sx[i] = px + 28;
sy[i] = py;
sf[i] = 1;
break;
}
}
}
if (pdf == 1) {
bgf = 1;
if (bgf == 1) {
bc = 255 - 255 / 30 * count;
++count;
SetDrawBlendMode(DX_BLENDMODE_ALPHA, bc);
DrawGraph(px, py, b, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
bgf = 0;
}
}
else {
for (i = 0; i < 10; i++) {
if (sf[i] == 1) {
sy[i] -= 8;
if (sy[i] < 0 - 14)sf[i] = 0;
}
DrawGraph(sx[i], sy[i], sg, FALSE);
}
DrawGraph(px, py, p, TRUE);
}
}
//敵プログラム
{
if (edf == 1) {
bgf = 1;
if (bgf == 1) {
bc = 255 - 255 / 30 * count;
++count;
SetDrawBlendMode(DX_BLENDMODE_ALPHA, bc);
DrawGraph(ex, ey, b, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
bgf = 0;
}
}
else {
if (emuki == 1)ex += 4;
if (emuki == 0)ex -= 4;
if (ex > 640 - 64) {
ex = 640 - 64;
emuki = 0;
}
if (ex < 0) {
ex = 0;
emuki = 1;
}
DrawGraph(ex, ey, e, TRUE);
esc++;
if (esc == 60) {
if (esf == 0) {
esx = ex + ew / 2 - esw / 2;
esy = ey + eh / 2 - esh / 2;
esf = 1;
}
esc = 0;
}
}
if (esf == 1) {
esy += 8;
if (esy > 480)esf = 0;
DrawGraph(esx, esy, esg, TRUE);
}
}
//自機の当たり判定
if (esf == 1) {
if (((esx > px&& esx < px + pw) || (px > esx&& px < esx + esw)) && ((esy > py&& esy < py + ph) || (py > esy&& py < esy + esh))) {
esf = 0;
pdf = 1;
}
}
//敵の当たり判定
for (i = 0; i < 10; i++)
{
if (sf[i] == 1) {
if (((sx[i] > ex&& sx[i] < ex + ew) || (ex > sx[i] && ex < sx[i] + sw)) && ((sy[i] > ey&& sy[i] < ey + eh) || (ey > sy[i] && ey < sy[i] + sh))) {
sf[i] = 0;
edf = 1;
}
}
}
switch (status) {
case TITLE:gameTitle(); break;
case MAIN:gameMain(); break;
case CLEAR:gameClear(); break;
case OVER:gameOver(); break;
}
ScreenFlip();
}
DxLib_End();
return 0;
}