0
\$\begingroup\$

when a sprite, like a space ship, reach the window border I call a method to "turn off" the engine by setting the speed to 0. But then it's impossible to move the sprite back, because the speed is set to 0! I would preciate some help to solve this! Perhaps there is another way to do this? Thanks!

Some of the code

if (position.X > 800)
EngineOff();

direction = new Vector2((float)Math.Cos(rotation - 1.62), (float)Math.Sin(rotation - 1.62));
position += direction * speed; 

And the method that controls the engine

 // Engine on
    public void EngineOn()
    {
        speed = 1;
    }

    // engine off
    public void EngineOff()
    {
        speed = 0;
    }

EDIT: Would it be possible to rotate the ship, so it's point inwards the game area? Would it be possible to rotate it 1/2 of a turn or 1/4 of a turn? My thought was that when the spaceship hit the border, it just turn around and continue moving inwards the game area.

\$\endgroup\$

2 Answers 2

1
\$\begingroup\$

You would need to re-position your ship back so that if (position.X > 800) would equal false.

if (position.X > 800)
{
   EngineOff();
   position.X = 800;
}

Similar to a collision, once the collision occurs you would typically reset your ship's position to the exact point of impact.

\$\endgroup\$
1
\$\begingroup\$

Considered that you are already storing the 2D position and the velocity in 2D vectors, what you could easily do is:

public void update(dt)
{
    // If needed, depending on user input
    Position.x += Direction.x * speed;
    Position.y += Direction.y * speed;

    checkCollisions();
}

private void checkCollisions()
{
    // if it collides with border
    if (Position.x + this.width >= 800)
    {
        Position.x = 800 - this.width - 2 // -2 to give some more separation
        Direction.x *= -1;
    }
    if (Position.y + this.height >= 800)  // 800 Y border
    {
        Position.y = 800 - this.height - 2 // -2 to give some more separation
        Direction.y *= -1;
    }
    // Similar for X left border, Similar for Y bottom border
}

This way, you will mirror the moving direction depending on the collision side pong-style, to speak. You don't really need to set your speed to 0 unless you don't want to turn on/off every time there is an user input. To block your sprite, you can add a bool blocked property to it and update/process user input only when the sprite is not blocked. If you want to simulate acceleration-style of moving, use the properties Velocity and Acceleration (2D vectors) as they need to be updated following the standard simple physics equations of accelerated motion. The additional -2 is added to make sure that a collision is not detected two times consequently by mistake (can happen). Anyway, if the scenario becomes more complicated, consider adopting an easy 2D physics engine.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .