|
|
一、超大场景平滑切换的实现方法(3D/2D场景都适用)
二、非多重混合纹理实现地表(既用图素方法够成)
三、碰撞检测
四、室内外场景结合
整个场景由64*64=4096个区域构成,每个区域管理4*4=16个屏幕大小场景,合计65535个屏幕场景。理论上可以更加大,目前的这样的场景数据约占用300M的磁盘空间(Zlib标准压缩后约12M空间)。不用多线程场景切换约为<1秒。多线程时候,采用中等优先级别的线程就可以做到平滑切换了。
Class QuadTree{
//用以剪裁判断,哪些区域的块需要渲染
};
Class 区域的块 :public QuadTree{
*m_p区域;//隶属于哪个区域
int32 *m_pDoodadsIndex;//哪些场景物件在这个区域的块中(索引)
};
Class 区域{
int m_nX, m_nY;//该区域的x,y
uint8* m_pPath;//路径障碍关系
uint8* m_pGroundFlag;//贴图图素位置信息
场景物件* m_pDoodads;
区域块[4][4];
QuadTree m_QuadTree;
LoadData(){
--[[
根据m_nX, m_nY ,从磁盘装载该区域的数据
]]
};
SetUpQuadTree(){
//将装载好的数据分成区域块,放到QuadTree的中,每个区域块都是QuadTree的一个叶子
};
};
Class世界{
int m_nX,m_nY;//管理区域的中心,即屏幕中心的块的x,y
区域装载的缓冲[16];
区域指针[3][3];
Enter(x,y);//进入某个区域
};
上面的结构应该不是很难理解, QuadTree部分只是剪裁渲染部分使用的,完全可以跳过。
以下旨在介绍 区域装载缓冲 的运用
*--*--*--*
| | | |
*--*--*--*
| |@| |
*--*--*--*
| | | |
*--*--*--*
@是现在Enter(x,y)进入的区域,我们需要将其周围的那些块都装载到内存来,并进行设备初始化包括网格贴图模型。(注意装载不是说一定要对其进行渲染。是否渲染是由QuadTree或者其他剪裁方法来完成的)
Enter(x,y)
{
m_nX = x; m_nY = y;
For(int i=0;i<3;i++)
{
For(int j=0;j<3;j++)
{
区域指针[j] = _Load(x-1+i,y-1+j);
}
}
}
Load(x, y)
{
//首先判断x,y是否合法(x,y<0,x,y>=64),如果不合法,return NULL.
Int nNULL = 16;//需要找一块没有使用或者不需要使用的缓冲区来装载该区域
for(int i=0; i<16;i++)
{
if(区域缓冲 != NULL)
{
if(区域缓冲.m_x == x && 区域缓冲.m_y == y)
{
//原来已经装载过这个区域了,返回就好
//return 区域缓冲;
}
}
else
{
if(i< nNULL) nNULL=i;
}
}
if(nNULL == 16)
{//所有的缓冲都被使用了
//用离本区域最远的一块缓冲将其来装载
//最远意味着该区域短时间内用不上
int m, n = 0, k = 0;
for (int i=0; i<16; i++)
{
m = abs(区域缓冲.m_nX-m_nX) + abs(区域缓冲.m_nY-m_nY);
if (m>n){n = m;k=i;}
}
//找到了,将这个最远的区域删除掉
delete[] 区域缓冲[k]; 区域缓冲[k]=NULL;
nNULL = k;
}
//好了。现在有空位缓冲装载这个区域了
区域缓冲[nNULL] = new 区域(x, y);
{//用多线程装载
LoadThreadManang(区域缓冲[nNULL]);
}
{//不用多线程
区域缓冲[nNULL].Load();//装载该区域的数据
区域缓冲[nNULL].InitDeviceObject();
}
}
=================================================================
http://war.5u56.com/mebin.tar.gz
可以下载演示程序。不过这个只能运行在X-Window环境下,需要GTK2.0支持以及安装了FMOD4.12的动态库。
后面的贴有windows下运行的程序。
注意:因为windows环境下没有对应linux字体的缘故
打开exe目录下的config.lua,并修改
原来的
--[[ windows
SYSTEM_FONT_FACENAME = "新宋体";
DEFALUT_FONT_FILENAME = "fzbwks_j.ttf";
DEFALUT_FONT_FACENAME = "方正北魏楷书简体";
]]
SYSTEM_FONT_FACENAME = "AR PL SungtiL GB";
DEFALUT_FONT_FACENAME = "ZYSong18030";
修改为这样
SYSTEM_FONT_FACENAME = "新宋体";
DEFALUT_FONT_FILENAME = "fzbwks_j.ttf";
DEFALUT_FONT_FACENAME = "方正北魏楷书简体";
--SYSTEM_FONT_FACENAME = "AR PL SungtiL GB";
--DEFALUT_FONT_FACENAME = "ZYSong18030";
应该就可以了。
另外,windows下面字体显示部分会是乱码。搜索应用程序目录下的所有*.lua文件。
用记事本打开,重新保存为ANSI码模式,就可以了。源模式是UTF-8的。 |
-
|