Я работаю над космическим шутером и не могу понять, как заставить пули продолжать стрелять до конца экрана после того, как я отпущу пробел. На данный момент, если я нажимаю пробел, который он стреляет, когда я выпускаю его, пули остаются там, где они выпали. Вот мои классы, которые вызываются по порядку в main ().
class Projectile : public Character
{
private:
float xVel;
float yVel;
float x;
float y;
public:
void init();
void keys();
void move();
void show();
}bullet;
void Projectile::init()
{
x=315;
y=305;
xVel=0;
yVel=0;
}
void Projectile::keys()
{
bool shoot = true;
Uint8 *keystates = SDL_GetKeyState( NULL );
if(keystates[SDLK_SPACE])
{
yVel-=14;
}
}
void Projectile::move()
{
x=x+xVel;
y=y+yVel;
xVel=0;
yVel=0;
if(y<0)
{
x=charx;
y=chary;
}
}
void Projectile::show()
{
apply_surface(x-5,y-2,jizz,screen);
cout << y << endl;
}
Это легко.
Не делайте этого (в Projectile :: move ()):
xVel=0;
yVel=0;
И пуля будет продолжать двигаться.
Другая проблема здесь:
if(keystates[SDLK_SPACE])
{
yVel-=14;
}
По сути, вы не должны делать -=
, Либо заменить его на yVel = -14
(все пули всегда будут двигаться с постоянной скоростью) или определить момент «нажатия клавиши» (т. е. клавиша не была нажата в предыдущем кадре, а нажата в текущем кадре), и только затем выполнить -= 14
, Подобные вещи (обнаружение события keyup / keydown) могут быть проще, если вы обрабатываете ключевые события, которые вы получаете (в основном цикле) вместо вызова SDL_GetKeyState
,
xVel=0;
yVel=0;
В вашем методе перемещения вы изменяете координаты x и y, а затем устанавливаете скорость обратно на 0. Именно поэтому ваша пуля перестает двигаться. Пока вы нажимаете пробел, вы постоянно вычитаете 14 из Y-скорости. Вы не хотите сбрасывать скорости до 0.