77范文网 - 专业文章范例文档资料分享平台

游戏编程文章搜集资料(6)

来源:网络收集 时间:2019-04-13 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

我是按前面的文章中推算的 Tile 形状, 和每个地图块的大小来作的 1:1 的示意图. 绿色框住的是 320x240 的 1/4 屏幕大小的地图块. Tile 的大小设定为 81x41 由于 Tile 间有 1 点的重叠, 所以实际占的空间是 80x40 的. 另外我将左上角的一块 Tile 设定为 (0,0) 其它的 Tile 按相对坐标编了坐标值, 方便大家的观看.

如图,由于 Tile 的大小比较合理, 正好可以在一个地图块中容纳整数个 Tile, 所以我们的坐标变换就非常容易了.按图中所标的相对坐标, 左上角一块为 (0,0). 那么我们将相对坐标 (x,y) 的 Tile 变换为地图块上的像素坐标为(40*(y-x),20*(x+y))

一个地图块里, 包含了 59 个 Tile, 其中边缘部分是和四周重叠的. 如果我们的地图数据是按游戏世界坐标储存. 我们可以看到, 这 59 个 Tile X 范围是 [-4,6] Y 范围是 [-1,9]. 就是说我们至少需要读入游戏世界中的一个 11x11 的地图描述矩阵才能包含这个地图块的数据. 这里, 我建议游戏地图描述数据用 16x16 做一块保存. 在加载几个地图块的图象数据的同时, 我们也可以将相应的地图描述数据的范围计算出来, 分块加载到内存.

两个坐标的换算在解决不同的问题中, 可能有些麻烦, 但我们只需要记住两条基本公式. 游戏世界中的坐标(X,Y)换算到屏幕矩形坐标系(X0,Y0)中是 X0=a*(Y-X),Y0=b*(X+Y) 而反向的转换可以推算出来是 X=(1/2)*(Y0*2-X0)/a, Y=(1/2)*(Y0*2+X0)/a. 在计算除法的时候, 应该注意正负号的问题. (-1/7 取整在这里应该是 -1 而不是 0) 这里 a,b 是矩形的长宽系数, 比如在前面的提到的换算公式中用到的 a=40,b=20 就是 Tile 的长(80)宽(40) 的一半. 同样你要对地图块进行某种运算的时候; 4 和 6 这两个参数将会派上用场 ;-)

by codingnow.com

Tile Based Engine的设计 - 精灵链表

通常说来, 第三人称 2D 游戏中通常把景物和精灵分开处理 (至少我是这样的) 尤其是游戏机上, 硬件对精灵有支持. 现在我们的显卡多也支持显存间的 keycolor 检查 Blt 操作, 实际就是用来加快精灵处理的 (也包括景物)

精灵在运动时, 往往是基于像素的 (虽然有人喜欢简化设计, 精灵在停止的时候仍旧是站在格子里) 而景物却是静止在格子中. 如果能使用更有针对性的方法分别绘制, 将可以提高游戏的速度. 本文的观点源于云风早前所写的斜视角图形引擎的设计系列. 并在近期实践(制作一商业A.RPG游戏)中得到完善.

实际上, 游戏中每帧图象, 没有必要每次用各个图素合成, 尤其在使用了大量如Alpha轮廓, 透明等大运算操作的情况下, 屏幕上并未更改的区域重复被运算非常的浪费时间. 所以我们可以借鉴游戏机的做法, 场景图面创建的稍稍比屏幕大一圈, 只在屏幕移出窗口时再补绘场景, 把精灵提出, 每帧重绘于场景上.

合成精灵与场景有三大问题, 一是如何处理精灵的遮挡问题, Isometric Tile Engine 的遮挡处理一文阐述了云风的观点; 其二是如何清除上一帧的精灵: (当然这一步也可以省略, 改为将场景层和精灵层合成到第三缓冲区) 如果不想多建立一屏幕后台缓冲区, 减少合成图层时的数据移动量, 我们可以采取在绘制精灵前保存精灵原处的场景图象. 具体实施方案在后面将有详细解说。

最后一大要点是以正确的次序绘制精灵了. 这里我想使用一个链表, 串起场景中的所有精灵, 姑且将它称为精灵链表吧. 同时我们还需要另一个链表保存屏幕上可见的精灵, 减少我们处理精灵的数量.

场景精灵链表是创建场景时创建的, 在某精灵消失(死亡)后从链表中删除, 精灵也可以在游戏时被创建加入链表. 而屏幕精灵链表却是绘制屏幕时动态生成, 保证其中精灵满足从后到前的顺序. 这样我们只需要在产生链表后, 依链表次序将精灵绘制到屏幕就可以了 :-)

那么整个处理过程如下:

根据当前的屏幕精灵链表清除上帧图象中所有的精灵 清除当前屏幕精灵链表

遍历整个场景精灵链表, 处理每个精灵的动作和状态, 如果精灵正在屏幕上, 就将其按前后次序插入屏幕精灵链表.

将即将绘制的精灵位置的场景保存 按屏幕精灵链表次序绘制精灵到屏幕 显示一帧图象 循环这些步骤

第一步清除上帧精灵的具体操作中, 我们可以为每一个精灵分配一个缓存图, 保存绘制前的场景. 但这样比较浪费. 因为不在屏幕上的精灵根本用不着这个缓存图. 所以我们可以进一步优化为, 精灵进入屏幕时才分配缓存图, 移出屏幕就释放掉. 不过内存分配实际是一个很消耗时间的过程. 当精灵大小都类似时,进一步的优化方案是限定屏幕上可以同时出现的精灵的数量, 初始化时就统一分配一批等大的缓存图(我称其为缓存池), 其每一个都足已容纳最大的精灵. 当某个屏幕精灵需要缓存图时, 就从缓存池中找一个没有使用的供其使用, 精灵移出屏幕后, 放弃对缓存图的控制即可.

关于第3步将存在于屏幕的精灵插入屏幕精灵链表的操作, 涉及如何判定精灵的前后关系. 我们可以在作图时, 就将精灵的重心定为其参考点保存中图素的文件中. 利用这个参考点的坐标就可以完成精灵的前后判定了 ;-)

本文总结了云风近期制作游戏中的些经验, 希望对后来者有所借鉴. 成文仓促, 错误在所难免. 提及方法也是我的个人观点, 游戏设计的魅力在于其设计时可以不遵循常例,任意发挥, 在此欢迎大家一起探讨, 指出错误和不足.

by codingnow.com

Tile Based Engine的设计 - Tile形状的选取

Tile Base Engine 的优点在于其处理速度. 如果我们设计 Isometric Engine 而无视这个优点, 那未免太亏了. 所以贪图一时编程或美工的方便, 将游戏设计成 Tile 大小随意, 而又不去发挥任意大小 Tile 的优势, (例如形状任意, Sprite 运动路线的任意等等) 将无法超越从前的游戏 Engine。我们必须向效率和表现力两方面中之一努力. 这次我选择了效率.

不象非 Tile Engine 那么自由, Tile Base 的 Engine 必须保证图素被分割成一块块等大的图片, 有利于遮挡运算和重复利用图片.而Isometric Tile 的拼接并不象矩形Tile 那么容易. 计算机位图数据不允许斜线的存在, 所以 Tile 的形状必须细心设计才能保证无缝拼接. 所有拼接问题, 通常指的底面菱形. 下面展示了一组典型的可以相互拼接的菱形. 请注意它们的形状, 四个顶点都是两个点, 这样才能保证可以无缝拼接. 菱形的两条对角线分别是 2n 和 4n+2 (图中 n=5).

除了这种形状,我们还有另一种选择. 就是 4 个顶点都是一个点的. 如图:

看看这种 Tile 的拼接, 我们要注意的是需要在拼接的时候, 顶点重叠对齐. 看看图:

重叠部分是必须的. 这样的菱形对角线分别是 2n-1, 4n+1(图中 n=5). 我的选择正是这第二种形状. 因为它的单个Tile 宽虽然是4n+1, 但每两个间有一点的重合, 整体上看,每个Tile宽占 4n. 而屏幕的宽也是 4 的倍数, 这在后面的设计中可以带来些方便.

P.S. 需要注意的是, Isometric 的 Tile 形状不能任意取, 所以视角也就固定下来了. 我们用 3D 建模软件作图片的时候需要注意视角的问题, 就是摄象机的角度. 在我的另一篇文章《斜视角引擎设计:视角的选择和坐标变换》中讲述过视角的换算方法. 我们这里选取的视角换算出来是 30 度 (arc sin 2n/4n)

by codingnow.com

VAE范例:Apple 制作过程

我的主页http://vczh.cstc.net.cn介绍VAE的文章终于写成几篇了,我便忍不住要开发一个完整的小游戏并写一篇文章来展示展示。所以,这个Apple就新鲜出炉了。关于Apple的代码请见http://vczh.cstc.net.cn。谢谢。 事先声明一下:

图片取自金山打字通2003的“拯救苹果”。

如果金山公司觉得这侵犯了金山公司的利益的话,

请告诉我,我会另换图片。

开始制作了!

事先作一下准备。说是VAE的范例,当然是先下载VAE,然后把vaeDataFile.pas和vaeBmex.pas扔进去。在准备两张图片,一张是Back.bmp,做背景;另一张是Apple.bmp,当然是苹果啦。我依稀记得在几千年前开发Apple的时候,突然心血来潮,使用了Class来编程。所以,大家一定要再建立一个Display.pas来放TApple。哈哈哈……

上面五个文件都放在同一个文件夹里,然后再文件夹里建立一个新的工程叫Apple.exe,现在正式开工。当把vae的两个文件加入工程并且新建Display.pas后,Apple.dpr肯定会变成这样的: program Apple; uses

Forms,

untApple in 'untApple.pas' {frmApple}, Display in 'Display.pas', vaeBmex in 'vaeBmex.pas',

vaeDataFile in 'vaeDataFile.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TfrmApple, frmApple); Application.Run; end.

如果不是这样的话,那就要赶快改一改了。 接着,打开Display.pas,开始编写TApple的代码。 先在interface后加入代码如下 unit Display;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, vaeBmex;

TApple的功能是控制Apple.exe的行为和显示方式。在新的游戏开始后,苹果们会掉下来,并且每个苹果上面印有一个字母。只有按下相应的字母键,该苹果才会消去。如果不行让10个苹果掉了下来,游戏就结束了。所以,玩Apple一定会以失败告终的。因此,Apple提供了一个最高分记录,所以,就当超过最高分为胜利吧。哈哈哈……

Apple.exe一共有五个版面。 1:Logo 2:开始画面

3:游戏画面 4:结束画面

5:难度选择画面

我偷懒了一下,把第1和第4合并了起来。因此,建立五个常数: const

MaxLeft=10;//掉了10个苹果就输了。 R_Static=0;//开始画面

R_Running=1;//游戏画面

R_ShowScore=2;//Logo;结束画面

R_Difficulty=4;//难度选择画面

然后,在implementation上面写一个空的TApple框架: type

TApple=class(TObject) private protected published

public end;

我们需要3个TBmex,一个用来放置背景图片,一个用来放置苹果图片,还有一个做

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库游戏编程文章搜集资料(6)在线全文阅读。

游戏编程文章搜集资料(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/585864.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: