使区域无效以获得平滑动画c#

时间:2016-12-29 15:20:43

标签: c# animation graphics region invalidation

我正在做一个关于象棋类游戏的项目,所以玩家在地图上拥有他们的棋子。每当玩家决定移动一个棋子时,他需要从骰子中获取一个数字,然后该棋子将根据滚动的数字移动。完成了典当的移动功能,但我没有显示它们的移动过程。

我有一个用于地图的面板和四个用于开始基础的面板(在游戏开始时保持棋子)。 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();
        }
    }

这不能正常工作,面板上的所有内容仍在重绘。为什么呢?

除了项目之外,我确实有一个关于区域无效的问题。就像我告诉绘制事件的绘图规则一样,面板使自身无效。当我们要使一个区域无效时,系统如何知道有关绘图的规则?

0 个答案:

没有答案