构建一个2D地图引擎

http://216.5.163.53/DirectX4VB/Tutorials/DirectX7/DD_Tiles.asp

尽管事实上建立一个地图引擎是一件再简单不过事,但是我还是经常收到来自不同的人们的各种邮件,询问我应该怎么样去做,或者是我原来的关于建立一个地图引擎是简单不过的事情的想法是错误的吧,也可能是这些向我求问的人本身很懒吧(你说呢?).因为似乎大家都对这个主题比较感兴趣,这章我将详尽地讲解如何建立一个高的效2D地图引擎.

瓷砖是游戏编程中的专用术语,用来产生2D游戏中的场景,每个瓷砖都对应一种不同的地表结构;比如,海洋,草地,岩石,沙滩.虽然在3D游戏编程中使用了更为先进和生动的场景生成技术,可是运用瓷砖还是能在2D游戏中生成一个较生动和有趣的场景的.相比起来,2D中的这种技术更为容易掌握和应用(而与3D游戏产生的效果是一样的),并且运行得更为快捷.

其实在所有的工作中,最主要的考虑因素还是瓷砖的大小.如果瓷砖太大,用它来表现的地表可能就不细致,反之如果太小,游戏速度将因此而拖慢(因为同样大小的地面,瓷砖小将使用过多数量的瓷砖),并且考虑到降低问题本身的复杂性的方面,用这些瓷砖组合起来的地图大小要正好是屏幕的倍数.比如,X数量的瓷砖总宽度刚好与y个屏幕的宽度相等.下面提供了一张简单的对应表:

屏幕大小 瓷砖设置方式                                  实际要绘制的总瓷砖数         备注

640x480  5x5      128 tiles wide, 96 tiles high =      12,288 tiles to be drawn     Red
         10x10    64 tiles wide, 48 tiles high =       3062 tiles to be drawn       Green 
         16x16    40 tiles wide, 30 tiles high =       1200 tiles to be drawn       Green 
         32x32    20 tiles wide, 15 tiles high =       300 tiles to be drawn        Yellow
 
800x600  5x5      160 tiles wide, 120 tiles high =     19,200 tiles to be drawn     Red
         10x10    80 tiles wide, 60 tiles high =       4800 tiles to be drawn       Green
         16x16    50 tiles wide, 37.5 tiles high =     1850 tiles to be drawn       Green
         32x32    25 tiles wide, 18.75 tiles high =    468 tiles to be drawn        Yellow

1024x768 5x5      204.8 tiles wide, 153.6 tiles high = 31,212 tiles to be drawn     Red
         10x10    102.4 tiles wide, 76.8 tiles high =  7752 tiles to be drawn       Red
         16x16    64 tiles wide, 48 tile high =        3062 tiles to be drawn       Green
         32x32    32 tiles wide, 24 tiles high =       768 tiles to be drawn        Yellow

注意到在某些解决方法中有些瓷砖的组合并不与屏幕大小真正切合;这表明你将需要一些额外的像素来填充这些地图(瓷砖的组合)边缘空出来的屏幕部分.我在上面的表中已经用"Red"注明这些需要避免出现空白的解决方法(与接下来的"Green,Yellow"组成一个"备注"项),用"Green"注明了那些合适的解决方法,用"Yellow"注明了那些需要在必要的时候才应该使用的解决方法.

如果你不打算用上面这些解决方法中的任何一种或者在你使用DX的窗口模式下的情况下,上面这张表对你是没有意义的;但是大体上这些解决方法与其它解决方法都是一样的(都按同一个公式来计算),都遵循一个通用的原则:
只有那些瓷砖数在1000-5000之间的解决方法都是可选的,多于这个数目的瓷砖数将会使要形成的地图引擎的运行速度打折扣.

实际的组合瓷砖形成地图的方法很简单;这里有介绍二种主要用到的方法:

程序运行时,组合瓷砖生成地图内容到一个单独的绘图页上-因此这种方法只涉及到一个生成过程.如果采用这种方法,以上提供的表项将完全无一可用.并且,采用这种方法可能会对接下来的Z轴转换和遮盖处理带来困难.

程序运行时,在一个循环里生成地图.这会在很大程序上降低帧的播放速率(fps,frame per second),在快一点的机器上会更明显.但是在一些优化工作后可以达到一个合理的播放速率.这种方法允许你轻松地生成动画,进行混合处理,透明处理.

我们在接下来的程序中将使用一个简单的循环来组合生成地图;以下实现的组合生成地图的过程可以说是在当前程序运行时完成的,也可以说是在文章最后面链接的那个程序中进行的:

Sub RenderMap(NumTilesX as integer,NumTilesY as integer, TileWidth as integer,TileHeight as integer _
_ TileSourcesurf as DirectDrawSurface7, TileDestSurf as DirectDrawSurface7)

Dim X as integer, Y as integer, r as RECT, retVal as long

For X = 0 to NumTilesX
For Y = 0 to NumTilesY
'Create our Rectangle.
r.Left = 'Left coordinate for Tile on source surface
r.Top = 'Top coordinate for Tile on Destination surface
r.Right = r.Left + TileWidth
r.Bottom = r.Top + TileHeight
'This is where we copy the tile from the source to the destination
retVal = TileDestSurf.BltFast(int(X * TileWidth), int(Y * TileHeight), TileSourceSurf, r, DDBLTFAST_WAIT)
Next Y
Next X

End Sub 
 
以上函数将完成一个生成地图的过程.我们可以对它作一些改变以加快地图在每一个循环里被生成的速度.

Remove the Multiplications. There are 6 different maths functions in the above code. This could possibly be cut down. Using Multiplication and/or division is quite costly on a loop basis. The easiest way that this can be done is by using a lookup table. On the first loop we calculate ALL the coordinates and store them in an array, then on subsequent loops we just look at this array and the calculation will be done; this is known as a lookup table. 
移除乘法运算(而改用加法或使用其它办法).以上的子程序用到了6个不同的数学函数.实际上这可以被精简.使用乘法运算和逻辑运算将在一个循环的主体里花费不少的系统占用.最直观和简单的方法是使用一个对照表.
Only Draw if necessary. This is the simplest way of speeding things up. The Fruitworld game does this, all the tiles are represented by a number in an array, if this array has changed since the last loop it will draw it, otherwise it moves onto the next iteration. This can easily be combined with the lookup table suggested above. 
只在需要绘制的时候进行实际的绘制.这是最让人信服的提速的方法了.游戏"水果世界"的源代码使用了这个方法,所有的瓷砖都对应一个索引值被存放在一个数组里以供调用,
The other aspect of using tiles is actually drawing them. The most important thing is that they join together perfectly - and you cant see the joins between them, this is called a seamless pattern, and you can use PaintShop Pro to generate one for you. The next aspect is what they look like; although detail is important, there is a fine line. Assuming that you are drawing generic landscape (Grass, Sand, Water) - you dont want the user's eye to be focused on it; the grass, water and sand are the background, not the foreground.
使用瓷砖的另外一个方面是实际绘制它们.最重要的事是要保证它们之间是无缝拼合的,你至少不能看到明显的缝隙,这就是人们常说的"无缝拼接",

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Scratch制作2D吃鸡游戏是十分有趣和创造性的。以下是一种可能的方法来完成这个项目。 首先,我们需要定义游戏中的角色和场景。角色可以包括玩家、敌人、武器、道具等。场景可以是一个小岛或者一个城市。 玩家的角色可以通过键盘控制移动和跳跃,可以使用鼠标来瞄准和射击。敌人可以使用随机生成的算法来决定它们的行动,比如移动、射击、躲避等。武器和道具可以通过触碰物品来增强玩家的能力,如增加生命值、攻击力等。 在游戏中,我们需要设定一定的规则和目标。比如,玩家需要在限定的时间内击败所有敌人,或者达到某个得分才能获得胜利。如果玩家的生命值降低到零,游戏就会结束。 为了使游戏更加生动和真实,我们需要添加一些特效和音效。比如,当玩家射击时可以添加火花特效,当玩家受到攻击时可以添加爆炸特效。而音效可以根据不同的场景和事件来选择,如枪声、爆炸声等。 最后,为了使游戏更加有趣和具有挑战性,我们可以添加一些障碍物和关卡设计。比如,在地图中设置一些建筑物或草丛来提供掩护,或者设定一些迷宫和谜题。 通过以上步骤,我们可以使用Scratch制作出一个2D吃鸡游戏。这个过程不仅可以帮助我们提高编程技能,还能够激发创造力和想象力,带来更多乐趣和挑战。希望这个回答对你有所帮助! ### 回答2: Scratch是一种编程语言和在线创作平台,可以进行简单而有趣的2D游戏开发。以下是使用Scratch制作2D吃鸡的步骤: 1. 设计游戏场景:通过选择背景和精灵,可以创建一个有趣的吃鸡游戏场景。你可以选择适合的地图背景,并添加一些建筑物和障碍物来构建一个逼真的环境。 2. 创建角色:使用Scratch的角色编辑器,你可以绘制并自定义游戏角色。对于吃鸡游戏,你可以创建一个主角,并为其设计外观、动画和能力。 3. 添加动作和交互:使用Scratch的积木编程,你可以为角色添加动作和交互。例如,你可以使用控制积木来移动角色,使用碰撞检测积木来判断角色是否与障碍物相撞。 4. 添加敌对角色:与吃鸡游戏的核心玩法相反,你可以创建一些敌对角色,他们会攻击主角,主要目标是生存下来。 5. 设计装备和道具:通过编程和操作Scratch的积木,你可以创建各种各样的武器、工具和装备。这些道具可以帮助主角在游戏中生存下来,比如提供额外防御或攻击力。 6. 游戏结束和胜利条件:你可以设定游戏结束和胜利的条件。例如,主角的生命值降至零时游戏结束,或是最后一人存活时宣布胜利。 通过以上步骤,你可以使用Scratch制作一个简单的2D吃鸡游戏。当然,Scratch的功能和限制相对较为简单,因此它适合初学者进行快速原型开发,以了解游戏开发的基本概念和原理。如果想要制作更复杂和真实的吃鸡游戏,你可能需要使用专业的游戏开发引擎编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值