我正在做一个关于象棋类游戏的项目,所以玩家在地图上拥有他们的棋子。每当玩家决定移动一个棋子时,他需要从骰子中获取一个数字,然后该棋子将根据滚动的数字移动。完成了典当的移动功能,但我没有显示它们的移动过程。
我有一个用于地图的面板和四个用于开始基础的面板(在游戏开始时保持棋子)。 GUI for gameboard
在绘画事件中,我要求系统绘制所有内容。
private void P_Map_Paint(object sender, PaintEventArgs e)
{
manager.VisualizeCollection(map, gr_map);
manager.VisualizeStartingBase(bases, grs);
manager.VisualizePawns(manager.Players, grs, gr_map);
manager.DisplayAvailablePawn(gr_map, grs);
manager.DisplaySelectedPawn(gr_map, grs);
}
对于棋子的每次移动,我都试图使用计时器让图像在屏幕上移动。
public void DoMovement(Pawn pawn)
{
if (TargetSpot != null)
{
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
EventHandler t_tick = null;
Point targetP = TargetSpot.Location;
Point currentP = pawn.ImageLocation;
int XMove = (targetP.X - currentP.X) / 10;
int YMove = (targetP.Y - currentP.Y) / 10;
Rectangle drawRange = new Rectangle(pawn.ImageLocation.X - (int)(0.5 * pawn.Image.Width),
pawn.ImageLocation.Y - (int)(0.5 * pawn.Image.Height), pawn.Image.Width, pawn.Image.Height);
t_tick = (senders, args) =>
{
if (currentP.X > targetP.X - XMove || currentP.X < targetP.X + XMove)
{// if the image of the pawn doesn't reach the destination
//we keep moving it and ask the pawn to redraw the old place
pawn.ImageLocation = new Point(currentP.X + XMove, currentP.Y + YMove);
pawn.CurrentPanel.Invalidate(drawRange);
}
else
{
pawn.CurrentLocation.LeaveAPawn(pawn);
pawn.CurrentLocation = TargetSpot;
TargetSpot.AddAPawn(pawn);
pawn.CurrentPanel.Invalidate(drawRange);
}
};
t.Tick += t_tick;
t.Interval = 300;
t.Start();
}
}
这不能正常工作,面板上的所有内容仍在重绘。为什么呢?
除了项目之外,我确实有一个关于区域无效的问题。就像我告诉绘制事件的绘图规则一样,面板使自身无效。当我们要使一个区域无效时,系统如何知道有关绘图的规则?