我正在努力做到这一点。 我想要做的是将面板(10px×10px)移动到另一个相同尺寸的面板。
我想知道它是如何移动到另一个面板的...我用计时器实现了这一点。
我的代码有效,但我确实有一个问题我无法过去......
大多数情况下,正在移动的面板首先到达x或y坐标,然后在水平或垂直线上移动到另一个面板。
当移动速度非常快时看起来不错......但是当慢慢移动时我可以看到它看起来非常错误。
这只是我创建的一个小油漆工作,以向您展示我的想法:
我希望B点直线移动到A点。
CODE:
private void timer_Tick(object sender, EventArgs e)
{
smallX = pnlTo.Location.X;
smallY = pnlTo.Location.Y;
largeX = pnlFrom.Location.X;
largeY = pnlFrom.Location.Y;
//Should we find the ratio??
// ####### X #######
if (largeX != smallX)
{
int xRatio;
if (largeX > smallX)
{
//If 'large' is to the right.
//Find ratio.
xRatio = largeX / smallX;
pnlFrom.Left -= xRatio;
}
else
{
//If 'large' is to the left.
//Find ratio.
xRatio = smallX / largeX;
pnlFrom.Left += xRatio;
}
}
// ####### Y #######
if (largeY != smallY)
{
int yRatio;
if (largeY > smallY)
{
//If 'large' is to the bottom.
yRatio = largeY / smallY;
pnlFrom.Top -= yRatio;
//pnlFrom.Top -= pixelsToMove;
}
else
{
//If 'large' is to the top.
yRatio = smallY / largeY;
pnlFrom.Top += yRatio;
//pnlFrom.Top += pixelsToMove;
}
}
lblLargeX.Text = pnlFrom.Location.X.ToString();
lblLargeY.Text = pnlFrom.Location.Y.ToString();
if (largeX == smallX && largeY == smallY)
{
timer.Stop();
}
}
我知道如何实现这一目标我是错误的...但有人可以帮助我朝着正确的方向前进吗?
提前谢谢。
答案 0 :(得分:1)
我不知道你的算法应该如何运作以及哪些错误(无论是逻辑还是实现),但从(x1;y1)
转移到(x2;y2)
很简单:
int steps = 10; // how many steps animation/timer will have
int x = x1 + (x2 - x1) * step / steps;
int y = y1 + (y2 - y1) * step / steps;
注意:
(x,y)
是给定步骤的坐标step
是范围内的当前步骤:从1到steps
delta
算法不同,您必须使用float
/ double
并且只存储delta
和steps
); 答案 1 :(得分:0)
您可能会发现一种更平滑的方法是在开始之前检查X和Y之间的差异,然后使用除以您想要作为“速度”的步数来划分。因此,如果要移动10个刻度,计算LargeY和SmallY,然后将其除以刻度并将类级变量设置为该量。每个滴答都按该数量递增。