简介
在impact中,图片的绘制靠的是xGraphPool类模块。xGraphPool可以对图像进行分割、显示图片部分范围、镜像、旋转、缩放。我将图片的绘制总结成五步。
第一步:创建一个xGraphPool对象
'创建一个图片对象
Dim LiuZhuni As New xGraphPool '用来加载柳逐霓头像
上面的代码就是创建了一个名为LiuZhuni的xGraphPool对象,这行代码我们暂时写在窗口代码的公共区域。
第二步:加载一张图片
我准备了一张仙剑二中“柳逐霓”的头像,使用LoadGraph函数加载图片。这个函数有
两个必填参数和两个可选参数。第一个参数Pathname:图片路径,第二个参数ColorKey:透明色(将图片中指定颜色变完全透明),剩下两个参数以后再讲。
'加载图片
LiuZhuni.LoadGraph "1.png", D3DColorARGB(0, 255, 255, 255)
由于加载的png图片(自带透明通道),所以第二个参数写ARGB(0,255,255,255),这个是完全透明的白色(因为png自带透明通道,而这个函数又必须指定一个透明色,所以使用0,255,255,255就不会影响到png的其他颜色)。
第三步:对图片进行操作
在绘制图片之前,往往会对图片进行一些旋转、镜像等操作。当然,也可以什么操作都不做。下面,我们就让“柳逐霓”头像不停旋转。使用SetRotate函数可以设置旋转角。
'让旋转角度不停的在0~360度变化
angle = angle + 1
angle = angle Mod 360
LiuZhuni.SetRotate angle
上面的代码是放在循环里执行的。angle不停的+1,angle对360取余是防止angle+1导致溢出。
第四步:绘制图片
'游戏主循环
Do
'防止线程卡死
DoEvents
'限制FPS在60(每秒循环60次)
LimitFPS 60
'让旋转角度不停的在0~360度变化
angle = angle + 1
angle = angle Mod 360
LiuZhuni.SetRotate angle
'把整个窗口填充为黑色
PaintScreen 0
'开始渲染(它和RenderEnd是一对好基友)
RenderBegin
'画柳逐霓
LiuZhuni.DrawGraph 0, 0
RenderEnd
Loop
其中,PaintScreen 0相当于把屏幕刷一层黑色的漆,上一次绘制的内容也会被刷掉。大家可以试试把这句注释掉看看是什么效果。
所有绘图代码必须放在RenderBegin和RenderEnd之间。LiuZhuni.DrawRraph 0,0是在窗口(0,0)处绘制图片。需要注意的是,图片的原点是在左上角,窗口的原点也是左上角,并且y轴正方向是竖直向下的,x轴正方向是水平向右的。如图:
第五步:释放图片
举一个比较常见的例子,2D游戏中地图背景图应该算是比较大的图片了吧,一般都有几兆甚至十多兆。当我们从“地图1”进入到“地图2”的时候,“地图1”的图片就不需要了。所以在切换场景时,释放图片是比较常见的操作。释放图片的操作也很简单,LiuZhuni.Release就行了。
完整代码:
Option Explicit
'创建一个图片对象
Dim LiuZhuni As New xGraphPool '用来加载柳逐霓头像
Private Sub Form_Load()
'设置窗口大小为800*16(这里乘以15是因为vb窗口默认以缇为单位,在标准dpi下1缇为15像素)
Me.Width = 800 * 15
Me.Height = 600 * 15
'以窗口模式创建一个800*600的渲染区域
InitDXGraph 800, 600, Me.hWnd, xgWindow
Me.Show
'加载图片
LiuZhuni.LoadGraph "1.png", D3DColorARGB(0, 255, 255, 255)
'旋转角度
Dim angle As Integer
Dim t As Integer
'游戏主循环
Do
'防止线程卡死
DoEvents
'限制FPS在60(每秒循环60次)
LimitFPS 60
'让旋转角度不停的在0~360度变化
angle = angle + 1
angle = angle Mod 360
LiuZhuni.SetRotate angle
'把整个窗口填充为黑色
PaintScreen 0
'开始渲染(它和RenderEnd是一对好基友)
RenderBegin
'画柳逐霓
LiuZhuni.DrawGraph 0, 0
RenderEnd
Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
'释放资源
LiuZhuni.Release
'释放DX内存
UnloadDXGraph
End
End Sub
代码都有比较详细的注释了,如果有什么不清楚的地方,欢迎评论。