如何在WinForm屏幕上移动任何对象?
当我按下右键 - >对象将向右移动,直到我按任何其他箭头键
当我按下左边< - 对象将向左移动,直到我按任何其他箭头键
对象一直在运动(如在Snake游戏中)
提前谢谢
答案 0 :(得分:1)
您可能希望继承Form并覆盖OnPaint方法。你可能还需要Invalidate()每次强制重绘。这将设置一个简单的游戏循环,让您可以非常快速地更新屏幕。
在OnPaint方法中,您将根据自上次调用OnPaint方法以及最后按下哪个键以来经过了多长时间来更新对象的位置。你可能会通过使用如下速度来做到这一点:
newPosition = oldPosition + (elapsedTime * velocity)
速度值将根据您按下的键而改变(即左侧为负,右侧为正)。您还需要一个变量和一些代码来跟踪它是水平移动还是垂直移动。
这是一种非常低效的方法来实现这一点(即它是一个黑客)。如果你想坚持使用Windows但是在没有太多工作的情况下获得更好的性能,你可以考虑XNA。如果你想要更好的性能并且愿意做更多的工作,可以使用DirectX和Win32 API查看Interop,或者只是一起切换。
答案 1 :(得分:0)
只需按一下按钮,您就需要一个游戏循环来继续您最初启动的移动方向。
答案 2 :(得分:0)
捕获关键点,调整对象坐标。
答案 3 :(得分:0)
假设您在2D中执行此操作,则可以设置x和y更改因子,并在每次按箭头键时正确设置。然后设置计时器以您想要的速率更新位置。当计时器滴答时,通过x / y变化因子调整对象的位置。
答案 4 :(得分:0)
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大小的矩形。默认情况下,我将向下设置该框的位置。但是当您按任意键时,例如: - 如果您按下左键箭头,则按键事件将会触发,它将向左设置框的位置,框将开始移动在左边,直到按下另一个键