VB开发2DRPG游戏教程(2):绘制图片

简介

    在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
代码都有比较详细的注释了,如果有什么不清楚的地方,欢迎评论。

猜你喜欢

转载自blog.csdn.net/qq_39687901/article/details/79722125