Delphi 画布/位图滚动问题

Delphi 画布/位图滚动问题,delphi,canvas,bitmap,2d,terrain,Delphi,Canvas,Bitmap,2d,Terrain,我正在尝试在Delphi中基于画布制作一个小游戏。基本上,我希望制作一个相当大的位图(例如3000x3000),然后将其加载到画布中,并能够像普通的图像查看器一样向右/向左/向上/向下滚动,但是我似乎找不到我要查找的内容。有什么想法吗?将图像加载到屏幕外的TBitmap对象。然后,OnPaint,或在适合您的特定应用程序的任何时候,使用BitBlt或Canvas。Draw在画布上绘制TBitmap的矩形子图像。子部分应从TBitmap上的(X,Y)开始,其宽度和高度分别等于表单的ClientWi

我正在尝试在Delphi中基于画布制作一个小游戏。基本上,我希望制作一个相当大的位图(例如3000x3000),然后将其加载到画布中,并能够像普通的图像查看器一样向右/向左/向上/向下滚动,但是我似乎找不到我要查找的内容。有什么想法吗?

将图像加载到屏幕外的
TBitmap
对象。然后,
OnPaint
,或在适合您的特定应用程序的任何时候,使用
BitBlt
Canvas。Draw
在画布上绘制
TBitmap
的矩形子图像。子部分应从
TBitmap
上的
(X,Y)
开始,其宽度和高度分别等于表单的
ClientWidth
ClientHeight

现在,响应键盘事件。编写一个
FormKeyDown
事件处理程序,并听
Key=VK_LEFT
Key=VK_RIGHT
Key=VK_UP
Key=VK_DOWN
(使用
case
语句)。当检测到这样一个键被按下时,根据需要增加/减少
X
Y
,然后使用此起点再次绘制场景

您还可以响应
MouseDown
MouseMove
MouseUp
事件以使用鼠标滚动。您可以只使用中间的一个(
MouseMove
):您可以检查光标是否靠近窗体的边缘,如果是,则可以平滑地向该方向滚动(例如,使用
TTimer
)。或者,您可以在
MouseDown
中将
FMouseDown
标记设置为
true
,并在
MouseUp
中将其重置为
false
。然后,在
MouseMove
中,如果
FMouseDown
true
,则在X方向上按delta
X-XOld
滚动位图,在Y方向上按delta
Y-YOld
。(此处,
X
Y
MouseMove
事件处理程序的参数;
(X,Y)
是光标的当前位置。)
MouseMove
过程应以

XOld := X;
YOld := Y;

无论
FMouseDown
是打开还是关闭。

将图像加载到屏幕外
TBitmap
对象。然后,
OnPaint
,或在适合您的特定应用程序的任何时候,使用
BitBlt
Canvas。Draw
在画布上绘制
TBitmap
的矩形子图像。子部分应从
TBitmap
上的
(X,Y)
开始,其宽度和高度分别等于表单的
ClientWidth
ClientHeight

现在,响应键盘事件。编写一个
FormKeyDown
事件处理程序,并听
Key=VK_LEFT
Key=VK_RIGHT
Key=VK_UP
Key=VK_DOWN
(使用
case
语句)。当检测到这样一个键被按下时,根据需要增加/减少
X
Y
,然后使用此起点再次绘制场景

您还可以响应
MouseDown
MouseMove
MouseUp
事件以使用鼠标滚动。您可以只使用中间的一个(
MouseMove
):您可以检查光标是否靠近窗体的边缘,如果是,则可以平滑地向该方向滚动(例如,使用
TTimer
)。或者,您可以在
MouseDown
中将
FMouseDown
标记设置为
true
,并在
MouseUp
中将其重置为
false
。然后,在
MouseMove
中,如果
FMouseDown
true
,则在X方向上按delta
X-XOld
滚动位图,在Y方向上按delta
Y-YOld
。(此处,
X
Y
MouseMove
事件处理程序的参数;
(X,Y)
是光标的当前位置。)
MouseMove
过程应以

XOld := X;
YOld := Y;

无论
FMouseDown
是打开还是关闭。

为了简化操作,您可以在TScrollBox中使用TPaintBox。将TPaintBox尺寸设置为位图的大小,使用OnPaint事件绘制位图,并使用OnMouse事件以编程方式滚动TScrollBox。虽然功能没有那么强大,但可能满足非常简单的需要。要简化操作,可以在TScrollBox中使用TPaintBox。将TPaintBox尺寸设置为位图的大小,使用OnPaint事件绘制位图,并使用OnMouse事件以编程方式滚动TScrollBox。虽然功能没有那么强大,但可能满足非常简单的需要。