回 帖 发 新 帖 刷新版面

主题:[讨论]2D斜视角游戏中地形贴图的思考

一般,1我们先在离屏页面hdc上通过BitBlt方式贴上单个地形图块(准备图片),2然后把离屏页面上的内容用for循环计算各个地形图块位置后BltFast贴到后备缓存上,3最后翻页显示。
问题是,在整个程序执行中总是要调用第二步进行循环、计算的操作,而对这些地形、物品之类的位置相对固定的东西反复循环、计算是否很没必要?而且耗时?并且在移动地图时很难在循环里计算各个地形图块的偏移量!
我的想法是:由于第一步准备图片的过程只加载一次,所以直接把第二步的操作放到第一步里,在第二步时只要把整个离屏页面BltFast过来,在移动地图时只要改变BltFast的相应参数既可。这不是提高了效率么?
但是这样做有个很重要的问题,就是在离屏页面hdc上无法用DDR的颜色键来透明图片,这样会造成菱形地图块的拼接区被覆盖掉,一个办法就是另外制作单个地形图块的蒙板图,其他的物品图、墙壁图等也一样。然后再利用BitBlt函数的参数特点来做透明图。这样做显然加大了程序资源文件的大小,但是提高了速度,我想游戏应该以速度为优先考虑的。
另外,我的菱形地图的贴图方式没有按常规的斜视角贴图计算方式,而是按照单数、双数行的各自规律:单数行从(0,0)位置正常贴图,双数行的第一个的贴图坐标X轴缩进 (地图块宽)/2 ,Y轴增加 (地图块高)/2 
本人初学DirectxDraw,不知我的想法是否正确,望大家指点!

回复列表 (共4个回复)

沙发

我的做法是3个缓冲区,也就是3层
1:游戏页面缓冲,它比第2层要大一圈,用来平滑拖动和缓冲
2:GUI层,它用来加载道具栏和控制面板之类的,(游戏显示窗口的大小)
3:主页面
当2层超过1层所规定的范围时才会刷新第1层 
而第1层更新的时候会加载所有静态物体,动态物体采用动态采用一个渲染链表(当然你应该做的是如何确定绘制次序咯)
至于每次都需要刷新第2层,其实可以检测每个物体是否需要被重新绘制,如果需要才会被重新绘制,因为不是每时每刻背景都在拖动中,所以这样做不会耗多少时间,相反可能减少绘制的物体数量,提高了速度,好象云风有说过 dirty Rectangle这个技术

其实难点在于 平滑卷轴,就是格子切换时,采用平滑拖动背景来产生移动的效果

板凳

谢谢!你的意思是不是这样的:hdc(贴单个图块) -> 一层页面(拼贴整个地图) -> 二层页面(屏幕大小) -> 三层(贴工具栏等,同二层大小) -> 主页。
你多了一页:第二页。而把第一页作为离屏页面了。可是怎样不让第一页也翻页为主页使其一直处于离屏状态呢?

3 楼

恩,我比较喜欢copy 而不是翻页,
我用MMX优化了blt方法,效果不是很明显
所以只有主页面和一个缓冲页面(和主页面一样大小)在显存中,其它缓冲区在内存中~
每次都是刷新缓冲区的内容,然后缓冲区copy到主页面,完成一贞
如何更新缓冲区:
我的做法是采用2个坐标系统(以斜45度为例子),一个世界坐标系统,一个屏幕坐标系统
也就是2个数组,屏幕数组总是世界数组的一部分(需要你自己分割),然后建立,屏幕数组到屏幕坐标(在屏幕的哪个位子 Sx,Sy)的映射,根据这个就可以刷新了,
而UI层是由于它总是在最上层的(比如道具拦,),它总是覆盖游戏内容,所以单独做一层

4 楼

谢谢,我回去试下.

我来回复

您尚未登录,请登录后再回复。点此登录或注册