我正在为一个以经典街机游戏"凤凰"为蓝本的GBA模拟器编写游戏,其中一艘船向其上方的目标发射子弹。我目前游戏运行良好,除了我希望能够一次发射多颗子弹。
我创建了一个较小的源文件,只是为了测试我如何做到这一点,所以没有砖块或船等,只有子弹的来源和背景颜色。
我试图通过创建一个包含 5 个"子弹"结构的数组来为飞船创建一个包含五个子弹的"弹匣",每个结构都包含自己的 x 和 y 坐标。每个子弹还为其分配了一个布尔标志,以确定它是否被发射,允许循环在按下 A 时搜索数组以找到尚未发射的子弹并发射它。
我以为这会起作用,但由于我是初学者,我觉得我可能错过了一些东西。当它运行时,我可以发射一颗子弹,它会按预期在屏幕上动画化,但是在第一个子弹离开屏幕并且它的标志重置为"false"之前,我不能发射第二颗子弹。
也许你可以帮我发现代码中的问题?
谢谢。
#include <stdint.h>
#include "gba.h"
const int MAG_SIZE = 5;
bool bulletFired[MAG_SIZE] = {false};
struct bullet {
int x;
int y;
} bullet[MAG_SIZE];
bool isPressed(uint16_t keys, uint16_t key)
{ // Uses REG_KEYINPUT and a specified key mask to determine if the key is pressed
return (keys & key) == 0;
}
void DrawBullet(int bulletXPos, int bulletYPos)
{ // Fires bullet from player craft
PlotPixel8(bulletXPos, bulletYPos, 2);
}
int main()
{
REG_DISPCNT = MODE4 | BG2_ENABLE;
bool isPressed(uint16_t keys, uint16_t key);
void DrawBullet(int bulletXPos, int bulletYPos);
SetPaletteBG(0, RGB(0, 0, 10)); // Blue
SetPaletteBG(1, RGB(31, 31 ,31)); // White
SetPaletteBG(2, RGB(25, 0, 0)); // Red
ClearScreen8(0);
while (true)
{
WaitVSync();
ClearScreen8(0);
uint16_t currKeys = REG_KEYINPUT;
for (int n = 0; n < 5; n++)
{
if ( bulletFired[n] )
{
bullet[n].y--;
DrawBullet(bullet[n].x, bullet[n].y);
if ( bullet[n].y < 1 )
{
bulletFired[n] = false;
}
}
}
if (isPressed(currKeys, KEY_A))
{ // Key A is pressed
for (int n = 0; n < 5; n++)
{
if ( !bulletFired[n] )
{
bulletFired[n] = true;
bullet[n].x = 120;
bullet[n].y = 134;
}
}
}
FlipBuffers();
}
return 0;
}
问题就在这里
if (isPressed(currKeys, KEY_A))
{ // Key A is pressed
for (int n = 0; n < 5; n++)
{
if ( !bulletFired[n] )
{
bulletFired[n] = true;
bullet[n].x = 120;
bullet[n].y = 134;
}
}
}
当您检测到按键时,您会立即发射所有可用的子弹。
你想要这样的东西:
if (isPressed(currKeys, KEY_A))
{ // Key A is pressed
for (int n = 0; n < 5; n++)
{
if ( !bulletFired[n] )
{
bulletFired[n] = true;
bullet[n].x = 120;
bullet[n].y = 134;
//EXIT THE LOOP
break;
}
}
}
打破循环。您可能还希望在发射子弹或等待完全按键之间插入时间延迟,因为您仍然可能会很快发射子弹。