英文:
Tracking player's movement in WPF C# using Canvas
问题
我正在尝试使用WPF C#和Canvas构建原始的吃豆人游戏项目,但在鬼魂的追踪和移动部分遇到了问题。
我的想法是检查鬼魂是否会在下一步移动时穿过墙壁并阻止它。
但显然我编程错误了,鬼魂会一直移动直到达到墙壁,然后向后移动一步,然后再次移动到墙壁,如此反复。
我应该如何修复算法?当然,如果你有其他想法,我很愿意听取。
以下是与鬼魂移动相关的代码:
//flags are used to check if the ghosts next move is through a wall
double x1 = Canvas.GetTop(pacman);
double y = Canvas.GetLeft(pacman);
if (Math.Abs(Canvas.GetTop(redGuy) - x1) > Math.Abs(Canvas.GetLeft(redGuy) - y) && (flagUp == false || flagDown == false))
{
if (Canvas.GetTop(redGuy) < x1)
{
if (flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y && flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
}
}
else
{
if (flagUp == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y && flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
}
}
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y)
{
if (flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagUp == false || flagDown == false)
{
if (Canvas.GetTop(redGuy) > x1 && flagUp == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
}
}
else
{
if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
else if (flagUp == false || flagDown == false)
{
if (Canvas.GetTop(redGuy) > x1 && flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
}
}
}
希望这可以帮助你解决问题。
英文:
I'm trying to build a project of the original pacman game in WPF C# using Canvas and I got stuck on the ghosts tracking and movement.
the Idea is to check if the ghost will move through a wall the next move and prevent it.
But apparently I programed it wrong and the ghost is moving until it reaches the wall, then moving a step backwards, and then again move to the wall and so on.
How am I supposed to fix the algorithm? and of course, If you have any other idea I'd love to hear it.
Thanks!
Here's is the ghosts movement relevant code:
//flags are used to check if the ghosts next move is through a wall
double x1 = Canvas.GetTop(pacman);
double y = Canvas.GetLeft(pacman);
if (Math.Abs(Canvas.GetTop(redGuy) - x1) > Math.Abs(Canvas.GetLeft(redGuy) - y) && (flagUp == false || flagDown == false))
{
if (Canvas.GetTop(redGuy) < x1)
{
if (flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y && flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
}
}
else
{
if (flagUp == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y && flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
}
}
}
else if (flagRight == false || flagLeft == false)
{
if (Canvas.GetLeft(redGuy) < y)
{
if (flagLeft == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) + ghostSpeed);
}
else if (flagUp == false || flagDown == false)
{
if (Canvas.GetTop(redGuy) > x1 && flagUp == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
}
}
else
{
if (flagRight == false)
{
Canvas.SetLeft(redGuy, Canvas.GetLeft(redGuy) - ghostSpeed);
}
else if (flagUp == false || flagDown == false)
{
if (Canvas.GetTop(redGuy) > x1 && flagDown == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) - ghostSpeed);
}
else if (flagRight == false)
{
Canvas.SetTop(redGuy, Canvas.GetTop(redGuy) + ghostSpeed);
}
}
}
}
答案1
得分: 1
我认为你在游戏设计方面的主要问题在于以下几点:
-
不要将用户界面(UI)作为数据存储。
-
相反,将UI用作数据的表示。
你可以将游戏区域视为一个方格网格,大致与你的吃豆人/玩家的大小相同。在内部用一个二维数组来表示,例如Square[100,80]。
每个吃豆人或幽灵都与一个方格相关联,使用整数x、y坐标。
如果一个幽灵的坐标与玩家的坐标相同,那么它们就抓住了玩家。
你仍然可以将精灵定位在画布上,并从它们的坐标计算它们的位置。或者,可以使用ItemsControl来表示游戏板,其中Canvas作为ItemsPanel。这是一种相当常见的方法,如果你搜索一下,应该能找到相关信息。基本上,你将一个ObservableCollection
评论