游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3234|回复: 9

请教关于用D3D做2D地图的好方法

[复制链接]

11

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2008-3-29 22:13:00 | 显示全部楼层 |阅读模式
最近想搞点2D东西,动画偶倒是做完了
但是地图卷动把我难住了

翻了下以前做2D的方式,都是用的Surface来做地图,地图卷动就是更新Surface

但是现在偶用d3d,采用RHW坐标来做

最近几天大概想出点眉目

就是用一个比窗口横宽多一个chunk(自定义的地图格子大小)的大表面来做(多一格的话,才能达到地图的平滑卷动)

然后卷动这个大表面就是

但是发现这样做起来,貌似效率不是很高

p.s:我说的这个大表面不是IDirect3DSurface,是我用一个个chunk拼接出来的一个大表面。
为什么我说效率不高,是这样的,偶实在想不到什么好办法来做这样的更新。
仅仅想到的是,更新地图时候,修改这个大表面上全部chunk的坐标....
而每当卷动过一格的时候,重新设置这些chunk的纹理....

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-3-29 22:29:00 | 显示全部楼层

Re:请教关于用D3D做2D地图的好方法

为啥要用rhw..
把所有chunk全拼好,正交投影+移动摄像机就可以了吧?
再加个4叉树裁减.和3D地形差不多...

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2008-3-30 01:32:00 | 显示全部楼层

Re: 请教关于用D3D做2D地图的好方法

你的方法可能是固定了网格数量。但是每次屏幕滚动时候,需要重新计算纹理UV,这样做的消耗的确会非常大。
楼上说的是正解。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-3-30 03:32:00 | 显示全部楼层

Re:请教关于用D3D做2D地图的好方法

抽象出1个 2D 绘图Interface,

然后用d3d来实现这个接口

11

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-3-30 14:42:00 | 显示全部楼层

Re: 请教关于用D3D做2D地图的好方法

关于正交投影在很早前就想过了,但发现用3D坐标来做的话,很难固定窗口区域的chunk大小
当然在后面的地图管理上,有很大的优势
至于那四叉管理,貌似没必要,那是做LOD的,2D的话,直接根据窗口左上角的坐标来计算出当前所需的quad就行

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2008-3-30 17:12:00 | 显示全部楼层

Re: 请教关于用D3D做2D地图的好方法

2楼所说的4叉就是一种剪裁的管理方法而已。
“直接根据窗口左上角的坐标来计算出当前所需的quad就行”也是一种剪裁的管理方法,就代码算法实现来说,恐怕也是4叉树的模型。

11

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-3-30 17:59:00 | 显示全部楼层

Re:请教关于用D3D做2D地图的好方法

偶知道4叉是一种场景管理方式,是用于加速搜索的(剪裁都是用视锥来判断)
我说的意思是可以根据窗口左上角的坐标来计算出Index,这样可以直接避开不可见物体
在3D中做LOD,是因为你可以通过camera看到远处的物体,所以得绘制远处物体
但2D的话,这样做是没必要的,right?

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2008-3-30 19:00:00 | 显示全部楼层

Re:请教关于用D3D做2D地图的好方法

呵呵!是我们2个对于4叉树的概念理解不太一样。
我理解的octree就是场景管理方法,就是个tree而已。
至于带入进行判断的参数,是camera的视锥或者是其他什么的,它也叫做octree.

我以为这个tree在定位哪些quad需要渲染的时候,可以比较快速,


for(int i=0;i<nWidth;i++)
  for(int j=0;j<nHeight;j++)
    quad[j]->isInScreen();
方法定位会比较慢。

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2008-3-30 19:11:00 | 显示全部楼层

Re: 请教关于用D3D做2D地图的好方法

是我错了。的确可以完全不需要octree等管理方法。
可以用
quad[x/screen][y/screen]直接定位到那些需要渲染的quad中去。

考虑不周,现丑了。

11

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-3-30 19:48:00 | 显示全部楼层

Re:请教关于用D3D做2D地图的好方法

QuadTree和OctTree在数据结构上差不多,但在场景管理的实现上,其实还是有差异滴
QuadTree用于地形管理非常好,而OctTree则用于静态模型管理比较好(实际上,只要高度非常高的情况下,用OctTree都比较好)

我不知道你怎么理解tree这种东西的说,偶认为它们在场景管理中的作用就是根据camera的位置,然后加速搜索,并使用camera的视锥进行判断、剔除

就是使用阁下上面的:
for(int i=0;i<nWidth;i++)
  for(int j=0;j<nHeight;j++)
    quad[j]->isInScreen();(不过通常不是用for循环来做,而是使用递归)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 14:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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