游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6975|回复: 4

关于45度斜角2D引擎的实现

[复制链接]

26

主题

101

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2005-9-30 17:32:00 | 显示全部楼层 |阅读模式
关于45度斜角2D引擎的实现

下面是引用别人的一个文章,用古月来如何实现,可否有个这样的例子呢?


引用:
尽管事实上建立一个地图引擎是一件再简单不过事,但是我还是经常收到来自不同的人们的各种邮件,询问我应该怎么样去做,或者是我原来的关于建立一个地图引擎是简单不过的事情的想法是错误的吧,也可能是这些向我求问的人本身很懒吧(你说呢?).因为似乎大家都对这个主题比较感兴趣,这章我将详尽地讲解如何建立一个高的效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.
使用瓷砖的另外一个方面是实际绘制它们.最重要的事是要保证它们之间是无缝拼合的,你至少不能看到明显的缝隙,这就是人们常说的"无缝拼接",

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2005-9-30 17:56:00 | 显示全部楼层

Re:关于45度斜角2D引擎的实现

  搞笑!古月的开发者和技术提供者大部分都是以写RPG成名的,一个斜45度2D地图系统根本不成为技术问题。所以这种给初学者看的文章你就不必贴出来让我们看了。

  目前要解决的是在多种类型游戏下,如何共同一个地图系统,并不单单是RPG的问题。而且古月已经迈入3D加速时代,不能单纯的以2D手法来解决,需要充分的利用3D加速的优势。

  目前斜45度2D RPG地图系统的大部分前期工作已经完成,将会在最快的时间交付给用户使用。可以告诉各位的就是:这次RPG系统的设计将会有包括仙剑、轩辕剑等著名RPG游戏在内的数位程序高手支援,对其实用性尽可放心。

26

主题

101

帖子

119

积分

注册会员

Rank: 2

积分
119
 楼主| 发表于 2005-10-1 16:36:00 | 显示全部楼层

Re:关于45度斜角2D引擎的实现

呵呵。老大误会了,我贴出来不是给各位高手看的,是给像我这样的菜鸟看的。

看来很不错,期待中,努力学习中,请老大多指教!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2005-10-1 17:49:00 | 显示全部楼层

Re:关于45度斜角2D引擎的实现

你说的也夸张了点儿!

如果你是想要一个即时战略游戏,那可能我就没有办法了!

但你如果只是想要斜45度画面的RPG引擎,的确不是问题,因为这毕竟是我们的专长。

8

主题

310

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
QQ
发表于 2005-10-9 22:36:00 | 显示全部楼层

Re:关于45度斜角2D引擎的实现

2D结合3D?请教高手门,我该怎样在2D的地图上加上3D模型?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-22 14:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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