Delphi 画布/位图滚动问题
我正在尝试在Delphi中基于画布制作一个小游戏。基本上,我希望制作一个相当大的位图(例如3000x3000),然后将其加载到画布中,并能够像普通的图像查看器一样向右/向左/向上/向下滚动,但是我似乎找不到我要查找的内容。有什么想法吗?将图像加载到屏幕外的Delphi 画布/位图滚动问题,delphi,canvas,bitmap,2d,terrain,Delphi,Canvas,Bitmap,2d,Terrain,我正在尝试在Delphi中基于画布制作一个小游戏。基本上,我希望制作一个相当大的位图(例如3000x3000),然后将其加载到画布中,并能够像普通的图像查看器一样向右/向左/向上/向下滚动,但是我似乎找不到我要查找的内容。有什么想法吗?将图像加载到屏幕外的TBitmap对象。然后,OnPaint,或在适合您的特定应用程序的任何时候,使用BitBlt或Canvas。Draw在画布上绘制TBitmap的矩形子图像。子部分应从TBitmap上的(X,Y)开始,其宽度和高度分别等于表单的ClientWi
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方向上按deltaX-XOld
滚动位图,在Y方向上按deltaY-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方向上按deltaX-XOld
滚动位图,在Y方向上按deltaY-YOld
。(此处,X
和Y
是MouseMove
事件处理程序的参数;(X,Y)
是光标的当前位置。)MouseMove
过程应以
XOld := X;
YOld := Y;
无论
FMouseDown
是打开还是关闭。为了简化操作,您可以在TScrollBox中使用TPaintBox。将TPaintBox尺寸设置为位图的大小,使用OnPaint事件绘制位图,并使用OnMouse事件以编程方式滚动TScrollBox。虽然功能没有那么强大,但可能满足非常简单的需要。要简化操作,可以在TScrollBox中使用TPaintBox。将TPaintBox尺寸设置为位图的大小,使用OnPaint事件绘制位图,并使用OnMouse事件以编程方式滚动TScrollBox。虽然功能没有那么强大,但可能满足非常简单的需要。