Pregunta

Estoy trabajando en un tirador espacial, y no puedo entender cómo hacer que las balas continúen disparando hasta el final de la pantalla después de lanzar la barra espacial. A partir de ahora, si presiono la barra espaciadora que dispara, cuando la libera, la bala se queda donde se alejan. Aquí están mis clases que se llaman en orden en 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;
}
¿Fue útil?

Solución

Eso es fácil.

No hagas esto (en proyectile :: Move ()):

xVel=0;
yVel=0;

Y la bala seguirá moviéndose.

Otro problema está aquí:

if(keystates[SDLK_SPACE])
{             
    yVel-=14;             
}

Básicamente, no deberías hacer -=. O reemplazarlo con yVel = -14 (Todas las balas siempre se moverán con la velocidad de las constantes) o detectarán el momento de "llave abajo" (es decir, la tecla no se ha presionado en el cuadro anterior, y se presiona en la actual), y solo entonces lo hace -= 14. Este tipo de cosas (detectar un evento clave/llave) puede ser más simple si procesa los eventos clave que recibe (en su bucle principal) en lugar de llamar SDL_GetKeyState.

Otros consejos

xVel=0;
yVel=0;

En su método de movimiento, cambia las coordenadas X e Y y luego configura las velocidades a 0. Es por eso que su bala deja de moverse. Mientras presiona el espacio, restando constantemente 14 de la velocidad Y. No desea restablecer las velocidades a 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top