写这篇文章是因为从小喜欢游戏,一直以来,学习编程的过程中一直喜欢
游戏方面的东东.我想和我一样的人,大概还有很多吧?
## 这里将要讨论的不是什么高深的游戏原理.而只是在易语言中如何
画出游戏画面.因为懂的不多,请高手指正.
主要内容 : 1:如何画出图像.
2:如何消除闪烁.
3:如何设计角色结构.
4:如何进行半透明混合
5:如何进行高级图像处理
**********************************************************************
(一):
首先,如何画出图像?
太简单了,用画板.
先
图片号=载入图片("图片文件名")
画板1.画图片(图片号)
**其次,画动画
也很简单: 首先载入多个图片,其图片号存入 图片号数组[N]中.
计次循环首(图片数,计次变量)
画板1.画图片(图片号数组[计次变量])
计次循环尾
******* 你现在大概看到了他的坏处,太闪烁了.
我们可以有两个办法.
1: 画板1.禁止重画()
画板1.画图片()
画板1.充许重画()
2: 再放一个 画板2
先在画板2上面画出我们想画的图像.再把画板2 复制到 画板1 上去.
## 实际上, 我们将要采用的就是方法 2.
你可以试一下,两个画板复制 的速度是 画图片 的多少倍.我想
大概有 10 倍左右.
********************************************
上面的试验 如果 每一次画 只画一个图片上去,那么你看不出有什么不同.
但实际操作中,每一帧画面都是由许多 小图片 所组成的.
比如,一个飞机游戏. 敌机有十多架,再加上満天的子弹,都要我们一个一个的画
上去,如果直接在 窗口主画板 上画,必然会出现闪烁. 所以我们要设两个
画板, 主画板 和 副画板. 先在副画板上 把要画的飞机和子弹 一个 一个的
画上去, 再用一个
副画板.复制(,,,,主画板,,,)
把他们一下子复制到主画板上去.
## 这里,我再加一句,敌机和子弹 也是图片,如果直接用 画图片() 画到副画板
上,会消耗时间. 所以, 还要再加一个画板
材料画板
那么是不是 有多少敌机图片就要加多少画板呢?
不可以.
这里就要 设计一下 数据的结构了.
设一个 结构名为 [ 原型 ]
它有如下 成员:
1:x
2:y
3:宽度
4:高度
5:停留时间
载入图片时,可以将所有要用到的图片 集合到一张图片上,载入此图片到材料画板
然后 设一个 数组变量
物体原型[N] 数据类型 原型
程序运行前将 材料画板上的各个 要画的物体 在材料画板上的 左顶点,长度,
宽度,依次 赋值 给 物体原型[N]数组的各个元素.
这样,在程序中使用起来,就方便了.
材料画板.复制(,,物体原型[N].宽度,物体原型[N].高度,副画板,物体原型[N].x,物体原型[N].y,)
实际上,我们将来还要再来一个 结构 [ 实物体 ]
他的成员为:
1:x
2:y
3:原型 数据类型 原型
4:层次 (指示其在多个物体时的遮挡层次)
5:是否碰撞检测
6:前进方向
7:所去目标坐标
8:被碰撞时的处理方法
到时候真正用到的将 是这个实物体.
说了这么多,很无聊.实际上,相当于我们构建一个 易语言 中的可视控件.
比如 图片框1.x=100,图片框1.y=200 就可以将它移动到 100,200 处.
我们就是在模仿它的原理.
## 为什么 不直接 用可视控件 来做呢?? 就是因为 速度.
************************************************
上面讨论了 一下 游戏中的结构,实际上你可以自已任意的设计.只要你觉得方便就可以.
所以我也不多说了.主要还是讲讲图像方面.
## 如何 画半透明合成 的图像?
这个又叫 alpha 混合. 是很多大型游戏中 必被用到的.在API 中有一个函数可以供我
们使用. AlphaBlend()
---------------------------------------
Dll命令:半透明混和
返回值类型:逻辑型
Dll库文件名:msimg32.dll
在Dll库中的命令名:AlphaBlend
参数:hdc1
参数:x
参数:y
参数:宽度
参数:高度
参数:hdc2
参数:x2
参数:y2
参数:宽度2
参数:高度2
参数:复制方式 数据类型:整数型
----------------------------------------
实际上它的使用方法和 画板的 复制方法差不多,只是多了两个参数.
其中的参数 hdc1 和 hdc2 是源画板和目标画板的设备句柄. 要用下面这个API 取得.
--------------------------------------
Dll命令:getdc
返回值类型:整数型
Dll库文件名:user32.dll
在Dll库中的命令名:GetDC
参数:窗口句柄
--------------------------------------
具体使用方法如下:
------------------------------------
子程序:__启动窗口_创建完毕
hdc1 = getdc (画板1.取窗口句柄 ())
hdc2 = getdc (画板2.取窗口句柄 ())
------------------------------------
------------------------------------
子程序:_按钮4_被单击
alphafunc (hdc1, 0, 0, 200, 200, hdc2, 0, 0, 200, 200, 混合度 × 50)
------------------------------------
说明: 上面的 混合度=求次方(2,16) ,后面所跟的 50 是混合度,从(0~255).
之所以这样是因为 这个参数是一个 四字节的结构指针.
上面的程序是可以运行的,当然你的画板2 上要先画上图片,或者先设好了底图.
实际上,不光 画板 可以 取出dc ,任何窗口对像都有dc, 所以你可以把 按钮控件(
或者其它任何控件) 复制到画板上,或者任何地方.
当然,用完了dc,还要安全释放.
在 _启动窗口_将被销毁 中加入以下命令.
释放dc(_启动窗口.取窗口句柄(),hdc1)
释放dc(_启动窗口.取窗口句柄(),hdc2)
该命令的 定义如下:
------------------------------------
Dll命令:释放dc
Dll库文件名:user32.dll
在Dll库中的命令名:ReleaseDC
参数:窗口句柄
参数:hdc
------------------------------------
*********************************************************************************
## 如何进行 高级图形处理?
说明: 请你看清了, 是高级而不是高速.因为我至今还没有学会高速处理图像的方法.
这里所说的,将是最简易的方法.如果你知道,请回一贴,我十分感激.
先打个比方, 有些游戏 一进的进候,屏幕慢慢变黑或变白.有些时候,又会慢慢变成红
色(多半是死亡时).就像是一层 透明彩色纸 挡住了一样.
这是如何实现的呢?
先定义一个字节集 zz
然后
zz=画板1.取图片()
此时, zz数组中就存有了 画板1 上的所有点的颜色值.它的格式是这样的.
前54个元素 是格式说明(我也不知道,猜的)
从 第 55 个元素起,一直到最后,是图像各个点的数据.
说明如下: 假若 画板1 左下角 处有一个 红色点 .则.
zz[55]=0 蓝色值
zz[56]=0 绿色值
zz[57]=255 红色值
知道了这些,就可以用我们自已的方法来处理图像了.
----------------------------------------------------
子程序:_按钮1_被单击
局部容器:zz 数据类型:字节集
局部容器:计次 数据类型:字节集
zz = 画板1.取图片 (, )
计次=55
计次循环首( 画板1.宽度 * 画板1 .高度, )
zz[计次]=255
计次=计次+3
计次循环尾
画板1.底图 = zz
----------------------------------------------------
上面 我们把所有 的蓝色都改为 255 (最大值),整个画板上的图像都像蒙了一层
蓝色透明纸一样.我们的愿望实现了......
最后不得不说的是:这种方法处理起来很慢,主要时间就浪费在 画板.取图片() 和
画板1.底图= zz 上面了.
这种办法最简单.但最不高效.在我这里测试了一下,
当画板大小为 400 * 200 时
上面的 程序执行时间大约是0.4--0.5 秒左右.也就是说:每秒只能画两帧图像.
适当的调大颜色变化值,每帧图像的 像素颜色变化值 调大到 10 左右时,
效果看起来还差不多,可以实现淡入淡出效果了.
有了这种方法,还可以进行各种处理,如 滤镜效果.浮雕效果.真正半透明合成 等等.
(上面介绍的Alphablend () API 并不是真正的 alpha 混合,而只是固定混合)
「知无不言.言无不尽.百人誉之不加密.百人毁之不加疏.」-- 诸葛廷栋
游戏修改器本质就是修改内存
核心的操作就是改写内存数据
你不如去网上下载独立团写挂的教程,看了你就知道怎么写修改器