Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

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.

share|improve this question
add comment

2 Answers

up vote 1 down vote accepted

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.

share|improve this answer
add comment

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.