开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4789|回复: 13
收起左侧

[图文资料] 在易语言中写 [小游戏] 的技巧

[复制链接]
发表于 2010-6-27 13:13:21 | 显示全部楼层 |阅读模式   山东省菏泽市
按这个计算.我1000金币.每天存取一次.一年后就变成20多亿.太吓人了.
RMB有这个利润就好了.
****************** 在易语言中写 [小游戏] *********************

## 首先说明:我没有 也不会 写游戏.也从来没有写过一个最简单的游戏.

写这篇文章是因为从小喜欢游戏,一直以来,学习编程的过程中一直喜欢
游戏方面的东东.我想和我一样的人,大概还有很多吧?

## 这里将要讨论的不是什么高深的游戏原理.而只是在易语言中如何
画出游戏画面.因为懂的不多,请高手指正.



主要内容 : 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 混合,而只是固定混合)

发表于 2010-7-2 23:03:15 | 显示全部楼层   广东省汕头市
沙发。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2010-8-24 20:59:02 | 显示全部楼层   上海市上海市
好用,画图还是不太懂,上次想写一个扫雷的,哎呀,失败了
回复 支持 反对

使用道具 举报

发表于 2010-9-4 17:22:08 | 显示全部楼层   河南省南阳市
无法俄如果他 um
回复 支持 反对

使用道具 举报

发表于 2011-4-10 03:50:07 | 显示全部楼层   江苏省南京市
看了头很晕,还是先去看简单的吧
回复 支持 反对

使用道具 举报

发表于 2011-5-15 14:01:09 | 显示全部楼层   广东省湛江市
请问一下,有没有图文的教程啊???谢谢
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-7-13 03:08:39 | 显示全部楼层   甘肃省嘉峪关市
等等我也试试
回复 支持 反对

使用道具 举报

发表于 2011-10-29 18:17:41 | 显示全部楼层   四川省德阳市
zz到底是字节集还是字节集数组?
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2012-1-1 20:38:03 | 显示全部楼层   山东省青岛市
希望做个 语音视频教程
回复 支持 反对

使用道具 举报

发表于 2012-1-7 20:16:37 | 显示全部楼层   贵州省贵阳市
看看!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表