0

我正在开发一个需要绘制平铺图像的 winforms 项目。到目前为止,这就是我所拥有的:

更新方法(挂钩到 timer.tick 事件):

        int elapsedTime = Environment.TickCount - lastTick;

        tempLevel.Update(elapsedTime);
        Invalidate();
        lbl_fps.Text = "FPS: " + FPSHandler.CalculateFrameRate();

        lastTick = Environment.TickCount;

涂装方法:

        public void Paint(PaintEventArgs e)
        {
            GraphicManager.drawTiledImage(e.Graphics, new Rectangle(0,0,level.Length,1024), "paper");
            for (int i = 1; i < 800; i ++)
            {
                GraphicManager.drawLine(e.Graphics,
                    new PointF(i + GraphicManager.winpos.x - 1, level[(int)(i + GraphicManager.winpos.x - 1)] + 400),
                    new PointF(i + GraphicManager.winpos.x, level[(int)(i + GraphicManager.winpos.x)] + 400));
            }
        }     

drawTiledImage 方法:

            ImageAttributes imgA = new ImageAttributes();
            imgA.SetWrapMode(WrapMode.Tile);

            g.DrawImage(images[image], 
                ExtraMath.fromRect(
                new Rectangle(
                    (int)Math.Round(rect.X - winPos.x),
                    (int)Math.Round(rect.Y - winPos.y), 
                    rect.Width, rect.Height)),

                new Rectangle(0, 0, rect.Width, rect.Height),
                GraphicsUnit.Pixel, imgA);

winpos是一个vector,一个类似于PointF的自定义类,除了更多的特性,使用浮点数来存储x/y,可以转换成floats、Points、PointFs。

当我运行这段代码时,它似乎可以工作,直到我开始向下滚动,屏幕如下所示: 毛刺

它应该看起来像这样(减去该行): 首选外观

有什么帮助吗?

额外信息: - winPos 基本上是 PointF 的封装版本,它有更多的操作符等 - 每当 winpos.y 接近图像的高度时,故障就会非常严重 - 向左/向右滚动时不会发生故障

4

0 回答 0