user3303233
user3303233

Reputation: 55

Why is my object not moving?

I have a program where I want to move a Graphic with the keyboard keys. I originally had a function to move the graphic whenever pressed a button, but I abandoned that method to get around the keyboard repeat delay. Instead, I decided I would use a timer, which I would enable upon the KeyPess event, and disable on the KeyUp event. At first, I used 4 different timers for each different direction, and although it worked I noticed my program had begun to freeze quite often. I decided to use a single timer for all movements, and use if statements to determine the direction. Now, it seems that my Graphic doesn't move at all, even though all I did was copy and paste code.

enum Direction
{
    Left, Right, Up, Down
}
private Direction _objectDirection;
int _x = 100, _y = 100;
private void Form1_Paint(object sender, PaintEventArgs e)
{
Picture.MakeTransparent(Color.Transparent);
e.Graphics.DrawImage(Picture, _x, _y);
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.W)
    {
        if (timerAnimation.Enabled == false)
        {
            AnimationMaxFrame = 3;
            timerAnimation.Enabled = true;
        }
        _objectDirection = Direction.Up;
        timerMovement.Enabled = true;
    }
    //The rest of this code is omitted to save space, it is repeated 4 times with the only 
    //changes being the key pressed, and the object direction.
    Invalidate();
}
void Form1_KeyUp(object sender, KeyEventArgs e)
{
    timerAnimation.Enabled = false;
    timerMovement.Enabled = false;
    Picture = Idle;
    this.Refresh();
}
private void timerMovement_Tick(object sender, EventArgs e)
{
    if (_objectDirection == Direction.Up)
    {
        if (_y > 24)
        { _y = _y - 2; }
        else
        { timerMovement.Enabled = false; }
        //This if statement is to ensure that the object doesn't leave the form. 
        //I have tried removing them already, they're not the problem.
    }
    //Again, this is shortened to save space, it is repeated for each direction.
    Invalidate();
}

What is preventing my graphic from moving, and is there a better way to do this? There is still a lot of functionality I want to add to this, but it's already freezing.

Upvotes: 0

Views: 105

Answers (1)

Zachariah Brown
Zachariah Brown

Reputation: 108

Not sure you are making a game with WinForms, but to the point...

You need to handle key pressed events, when a key pressed event fires set a boolean flag in your code depending on if the event was a press or release. Then in your update code check the flag and do your movement accordingly.

It would be something like this (example code):

bool moveup = false;
void KeyPressed(object sender, KeyEventArgs e)
{
   // check for keys that trigger starting of movement
   if (e.KeyCode == Keys.W) moveup = true;
}
void KeyReleased(object sender, EventEventArgs e)
{
   // check for keys that trigger stopping of movement
   if (e.KeyCode == Keys.W) moveup = false;
}
void TimerTick(obect sender, EventArgs e)
{
   if (moveup)
   {
      // move your object
   }
}

Upvotes: 1

Related Questions