Как переместить объект на экран

Как я могу переместить любой объект на экране в WinForm?

Когда я нажимаю вправо -> объект будет двигаться вправо, пока я не нажму любую другую клавишу со стрелкой

и когда я нажимаю влево <- объект будет двигаться влево, пока я не нажму любую другую клавишу со стрелкой

Объект все время будет в движении (как в игре Snake)

заранее спасибо

5 ответов

Вы, вероятно, хотите наследовать от Form и переопределить метод OnPaint. Вероятно, вам также придется каждый раз использовать Invalidate() для принудительной перерисовки. Это создаст простой игровой цикл и позволит вам довольно быстро обновлять экран.

В вашем методе OnPaint вы будете обновлять позицию объекта в зависимости от того, сколько времени прошло с момента последнего вызова метода OnPaint и какая клавиша была нажата последней. Вы, вероятно, сделаете это, используя скорость следующим образом:

newPosition = oldPosition + (elapsedTime * velocity)

Значение скорости будет меняться в зависимости от того, какую клавишу вы нажимаете (то есть отрицательное для левого, положительное для правого). Вам также понадобится переменная и некоторый код, чтобы отслеживать, движется ли он горизонтально или вертикально.

Это довольно низкоэффективный способ сделать это (то есть взломать). Если вы хотите придерживаться Windows, но получить лучшую производительность без особых усилий, вы можете заглянуть в XNA. Если вы хотите значительно повысить производительность и готовы выполнять значительно больше работы, изучите Interop с DirectX и Win32 API или просто переключайтесь между собой.

Вам нужен игровой цикл, чтобы продолжить направление движения, которое вы изначально инициировали, одним нажатием кнопки.

Захватывать ключи, корректировать координаты объекта.

Предполагая, что вы делаете это в 2D, вы можете установить коэффициент изменения x и y, который вы устанавливаете должным образом при каждом нажатии клавиши со стрелкой. Затем настройте таймер для обновления позиции с желаемой скоростью. А когда отметится таймер, отрегулируйте положение вашего объекта с помощью коэффициентов изменения x/y.

  enum position
    {
        Left,Right,up,down
    }
    private int _x;
    private int _y;
    private position _objposition;
    public Form1()
    {
        InitializeComponent();
        _x = 50;
        _y = 50;
        _objposition = position.down;
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.DarkSlateBlue,_x,_y,100,100);
    }

    private void timertick_Tick(object sender, EventArgs e)
    {
        if (_objposition == position.Right)
        {
            _x += 10;
        }
        else if (_objposition == position.Left)
        {
            _x -= 10;
        }
        else if (_objposition == position.up)
        {
            _y -= 10;
        }
        else if (_objposition == position.down)
        {
            _y += 10;
        }
        Invalidate();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
            _objposition =position.Left;
        }
        else if (e.KeyCode == Keys.Right)
        {
            _objposition = position.Right;
        }
        else if (e.KeyCode == Keys.Up)
        {
            _objposition = position.up;
        }
        else if (e.KeyCode == Keys.Down)
        {
            _objposition = position.down;
        }
    }
}

Это создаст прямоугольник размером 50X50. По умолчанию я устанавливаю позицию этого поля вниз. Но когда вы нажимаете любую клавишу, например:- если вы нажмете стрелку влево, то событие ключа сработает, и оно установит положение окна влево, и окно начнет двигаться слева, пока не будет нажата другая клавиша

Другие вопросы по тегам