我正在开发一个需要绘制平铺图像的 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 接近图像的高度时,故障就会非常严重 - 向左/向右滚动时不会发生故障