擎墨閣文學 2008-5-1 11:54
扑克牌类游戏DIY之一:整体布局的设计 (1)
[table=98%][tr][td][align=left]牌类游戏都少不了放牌的桌面,这实际上就是一个标准的窗口,如果你不希望使用者可调整窗体的大小,最好事先计算出一个合理的窗体比例。因为窗体大小的改变要涉及牌桌上所有图片、文字的摆放,重定位十分困难。固定窗体大小,只需将Form的BorderStyle属性设为3 - Fixed Dialog ,MaxButton属性设为False即可。为保证各种屏幕分辨率环境下都能正常使用,可把窗体按最小的640 X 480大小来设计(如:图1)。[/align][/td][/tr][tr][td][align=center][img=599,483]http://www.ccw.com.cn/htm/center/topic/02_5_28_2a.jpg[/img][/align][/td][/tr][/table][table=98%][tr][td]桌面背景对烘托游戏气氛十分重要,建议不要直接改Form的Picture属性,而采用外部图片,一来可减小EXE的体积,二来便于更换。游戏中应加入一个标准模块,并在其中建立主过程Sub Main,用LoadPicture函数载入窗体图像。若想让图像自动适应窗体大小,可在窗体Load事件中加入以下代码:[/td][/tr][/table][table=98%][tr][td]With Me[/td][/tr][/table][table=98%][tr][td].Picture = LoadPicture(App.Path & "\pic\default.jpg") '载入窗体图片[/td][/tr][/table][table=98%][tr][td].AutoRedraw = Ture[/td][/tr][/table][table=98%][tr][td].PaintPicture .Picture, 0, 0, .Left, .Top, .Width, .Height '按窗体大小画图片[/td][/tr][/table][table=98%][tr][td]End With[/td][/tr][/table][table=98%][tr][td]记住,这种绘图法缩放图片,需要设计时将窗体的AutoRedraw属性设为True,或用代码改变,否则画过后图像会丢失,不过打开该属性会占用一些内存,要综合考虑。[/td][/tr][/table][table=98%][tr][td]桌面上主要摆放的是扑克牌,扑克当然要使用图片,VB提供两种图片控件,Image与PictureBox前者GDI资源占用很小,后者要大得多。要知道一副扑克要用54个控件,两副就要108个了,使用后者,系统资源将会多占用15%左右。但是牌是要动的,使用Image在做动画时,整个桌面会有明显的闪烁,且速度也慢。为了有更好的效果,我当时选用了PictureBox。至于扑克图片的获取吗,一般扑克类游戏的资源文件里都有,可用ExeScope类的程序把它们取出来为已用就行了。[/td][/tr][/table][table=98%][tr][td]108张牌并不是要在设计时就添加 108个控件,这样不仅会使设计窗体看得混乱,在以后的控制上也会很困难的。我的设计窗口看起来很简朴,就是因为采用了控件数组与资源文件结合的办法加载扑克图片:首先添加一个PictureBox控件,取名PK,Index属性设为0,这样一个图片框控件数组便建立了;然后使用资源编器(如:图2),[/td][/tr][tr][td][align=center][img=435,323]http://www.ccw.com.cn/htm/center/topic/02_5_28_2b.jpg[/img][/align][/td][/tr][tr][td]建立一个资源文件,添加进54张扑克的位图,记住加入时应按一定的顺序,我是结合斗地主游戏的特点,按牌点从小到大,每个牌点又按黑、红、梅、方的顺序加入的,斗地主时3最小,所以4个3先加,最后是小王、大王。如些一来,它们的资源ID号便是连续的了。加载窗体在Sub Main中加入以下代码:[/td][/tr][/table][table=98%][tr][td]Dim i As Long[/td][/tr][/table][table=98%][tr][td]With Form1[/td][/tr][/table][table=98%][tr][td].PK(0) = LoadResPicture(101, vbResBitmap) '假设扑克图片的资源ID号从101开始[/td][/tr][/table][table=98%][tr][td]For i = 1 To 107[/td][/tr][/table][table=98%][tr][td]Load .PK(i) '动态加载控件的方法[/td][/tr][/table][table=98%][tr][td].PK(i) = LoadResPicture(101 + i \ 2, vbResBitmap) '资源中54张图片按控件索引奇偶重复的方式加入,变成两副牌[/td][/tr][/table][table=98%][tr][td]Next[/td][/tr][/table][table=98%][tr][td]End With[/td][/tr][/table][table=98%][tr][td]在上面循环中还可加入给扑克初始定位的语句,若你准备日后允许窗口改变大小,牌所摆放的位置应该用变量来表示。我采用的方式是,用四个变量mlnPlayer1X,mlnPlayer1Y,mlnPlayer2X, mlnPlayer2Y确定下方与右侧两家牌的Left和Top属性,其余所有牌的位置都通过与它们的相对位置关系定位,如牌桌中心放的牌,可用(mlnPlayer1X,mlnPlayer2Y)定位,有兴趣大家自己试试。[/td][/tr][/table]