gpt4 book ai didi

c# - 如何在运行时移动游戏 block (控件)?

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:28 24 4
gpt4 key购买 nike

我正在用 C# 编写一个简单的 C# 游戏 Knights Tour 程序,这是学习所有 C# 的艰难方法。我有一 block 木板和一 block 骑士棋子,骑士是带有骑士图片的自定义面板。

我试图做的是允许用户在运行时单击并拖动骑士棋子控件(这正是您在设计时移动控件以放置它的方式),但无论出于何种原因,我都得到了一些非常不良结果。

    private void KTmain_Load(object sender, EventArgs e)
{
boolKnightmoves = false;
}

private void kpcKnight_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
boolKnightmoves = true;

intCurMouseX = e.X;
intCurMouseY = e.Y;

break;
case MouseButtons.Right:

case MouseButtons.Middle:

case MouseButtons.XButton1:

case MouseButtons.XButton2:

case MouseButtons.None:
default:
boolKnightmoves = false;
break;
}
}

private void kpcKnight_MouseUp(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
boolKnightmoves = false;
break;
case MouseButtons.Right:

case MouseButtons.Middle:

case MouseButtons.XButton1:

case MouseButtons.XButton2:

case MouseButtons.None:
default:
boolKnightmoves = false;
break;
}
}

private void kpcKnight_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (boolKnightmoves)
{
txtTest.Text = e.X + ", " + e.Y;
txtTest.Text += Environment.NewLine + kpcKnight.Location;

int i = e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1;
int j = e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1;

txtTest.Text += Environment.NewLine + i.ToString() + ", " + j.ToString();

kpcKnight.Location = new Point(
kpcKnight.Location.X + i,
kpcKnight.Location.Y + j);//e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1);
//e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1,
intCurMouseX = e.X;
intCurMouseY = e.Y;
}
}

private void kpcKnight_MouseLeave(object sender, EventArgs e)
{
boolKnightmoves = false;
}

private void kpcKnight_LocationChanged(object sender, EventArgs e)
{
kpcKnight.Refresh();
}

我看不出这段代码不会做同样事情的真正原因,但我显然遗漏了一些东西。当我点击骑士并移动它时,它的移动速度与鼠标不同,它移动得更慢。将它移动到您看不到的地方时,它也会消失。

我如何使骑士棋子以与在表单设计器中相同的方式移动,使棋子在棋盘上移动有意义?

我们将不胜感激。


我更新了一些代码,它似乎确实有所帮助,但它的动画方面仍然很不稳定,面板在移动和放置时会拾取一些背景。

它是如何在表单设计器中做到如此流畅的?

    private void kpcKnight_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (boolKnightmoves)
{
txtTest.Text = e.X + ", " + e.Y;
txtTest.Text += Environment.NewLine + kpcKnight.Location;

int x = kpcKnight.Location.X + e.X - intCurMouseX;
int y = kpcKnight.Location.Y + e.Y - intCurMouseY;

kpcKnight.Location = new Point(x, y);
kpcKnight.Refresh();
/*
int i = e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1;
int j = e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1;

txtTest.Text += Environment.NewLine + i.ToString() + ", " + j.ToString();

kpcKnight.Location = new Point(
kpcKnight.Location.X + i,
kpcKnight.Location.Y + j);//e.Y == intCurMouseY ? 0 : e.Y > intCurMouseY ? 1 : -1);
//e.X == intCurMouseX ? 0 : e.X > intCurMouseX ? 1 : -1,
intCurMouseX = e.X;
intCurMouseY = e.Y;*/
}
}

最佳答案

为什么不在 Mouse_Move 方法中将骑士的位置设置为与鼠标位置相同?

类似于:

kpcKnight.Location = new Point(e.X, e.Y)

显然,您可以通过了解 Knight 最初被点击的位置并根据该增量平滑移动而没有初始抖动来使其移动得更好。

关于c# - 如何在运行时移动游戏 block (控件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com