能用flash cs6+as3.0做出html5的效果吗?怎么实现?比如:实现3d迷宫

html-css015

能用flash cs6+as3.0做出html5的效果吗?怎么实现?比如:实现3d迷宫,第1张

现在都在讨论能不能用HTML5来实现Flash 的功能吧,毕竟AS作为一个完整独立的完全面向对象语言,理论上是什么都可以做的;而HTML5又来势汹汹想取代Flash~当然,Flash不支持3D引擎,目前的3D都是在平面上通过数学计算进行缩放来实现一个纵深的效果。3D迷宫Flash很容易做出来,很多AS游戏编程的书里都会有3D迷宫的教程,而且一般都会用一个章节来讲,所以,去搜索一个或者我给你写一个还可以,要在这说清楚怎么实现可能很麻烦。

在书找的,只打了个结构体(太多了),我利用stack做的!希望能对你有所帮助!程序如下:

typedef struct{

int ord//通道块的路径上的序号

PosType seat//通道块在迷宫的坐标位置

int di//从此通道块走向下一个通道块的方向

}SelemType//stack的元素类型

Status MazePath(MazeType maze,PosType start,PosType end){

//若迷宫 maze中存在从入口start到出口end的通道,所以,求得一条存放在stack中

//(从stack底到顶)并返回TRUE,否则返回FALSE

InitStack(S)

curpos=start//设置当前的位置为入口位置

curstep=1//探索第一步

do{

if(Pass(curpos)){//当前位置可以通过,即是未曾走过的通道块

FootPrint(curpos)//留下足迹

e=(curstep,curpos,1)

Push(s,e)//加入路径

if(curpos==end)

return(TRUE)//到达终点

curpos=NextPos(curpos,1)//下一位置是当前位置的东部

curstep++//探索下一步

}

else{//当前位置不能通过

if(!StackEmpty(S)){

Pop(S,e)

while(e.di==4&&!StackEmpty(S)){

MarkPrint(e.seat)//留下不能通过的标记,并退回一步

Pop(S,e)

}

if(e.di<4){

e.di++

Push(s.e)//换下一个方向探索

curpos=NextPos(e.seat e.di)//设定当前位置是该新方向上的相邻块

}//if

}//if

}//else

}while(!StackEmpty(S))

return(FALSE)

}//MazePath

方案一:主路扭曲型

1、首先,按照下图的间隔规则来生成基础的大地图,1为陆地,0为水域。

2、然后,选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向,斜边不算)。找到就把他们联通,即把两个1之间的0变成陆地,这里用红色来表示。

3、把上一步“终”的格子作为新的一个“起”格子,不停循环第二步的过程,直到找不到周围有黄色的1。

4、这时候,原路往回走(即不停去找前一个格子),直到找到一个格子,这个格子周围有黄色的1,那么从这个格子开始重复前两个步骤。

5、接下来就是不停重复上面的步骤,找到就联通,找不到就往回走。

6、填充完整个地图之后,迷宫就算是制作完成了,根据需求加上终点即可。

总结一下,这种方案生成的迷宫会有一条明显的主路,即一条特别长、贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。

方案二:自然分岔型

这个方案的雏形来自于随机prim算法,具体步骤如下:

1、跟方案一一样,生成一个基础地图。格子先用黄色1和灰色0来表示,暂时不区分水陆。

2、随机取一个地图边缘的黄色1,把它标记为红色1,即变成陆地。然后把它旁边的灰色0标记成蓝色0,表示“待定”。(注意的是,大地图四周的灰色0固定不变,作为地图边缘而存在)

3、敲黑板了!!这里是重点!!!

随机选一个蓝色的0(这一步很重要,会使这个方案明显区别于上一个方案),然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1:

如果是,则把对面的黄色1标记成红色1,即变成陆地,然后把蓝色0变成红色的0,即也变成陆地;

如果不是,就把这个蓝色的0变成灰色的0。

最后,把新创建的红色1周围的灰色0,标记成蓝色0。

4、继续重复上面的步骤

5、对比上图和下图,这里取一个蓝色0生成一个红色1之后,新生成的红色1旁边,有两个蓝色0的两边都是红色1了,那么就根据第三步的规则,在稍后取到这些蓝色0时,就会把他们变成灰色0。

6、继续重复上述步骤,直到整个地图没有蓝色0了,地图就生成完毕。

总结一下,对比方案一,这套方案不会出现明显的主路,迷宫相对比较自然,但迷宫的分岔路会比较多,所以迷宫可能会更复杂,即玩家需要做选择的次数可能比较多。

方案三:块状分割型

上述两个方案有个共同的特点,就是道路永远都是1个格子宽,如果游戏需要给地图创造一些小型地块或者更宽的道路,需要在迷宫生成之后再用各种分布的规则来丰富迷宫。

而第三个方案则以小型地块作为出发点来设计迷宫,这套方案的雏形来自于国外大神Bob Nystrom,有兴趣的可以去查看他个人主页。

1、首先,在大地图(还是之前那个大地图)上生成若干小型地形,保证边长是奇数且不重合就好(示意图全部使用了正方形,实际上可以做成长方形让地图更加自然)。注意顶点要在黄色1格子上即可,这里我用橙色1来表示这些小型地块。

2、然后,根据之前方案一的迷宫生成方案,在非小型地块的区域里,用迷宫来填充。这一步完成之后,迷宫和小型地形是分隔开来的。

3、在橙色1的小型地形周围,随机取点以连接黄色1,连接点的数量可以根据需要来确定,建议是不要吝啬连接点的个数,因为这种地图之下,分岔路远比前两种方案要少。

4、接下来是简化地图,目的是去掉一些死胡同,因为这种方案的核心在于小型地块,没有必要让玩家在迷宫的路上绕。方法是把一些3边都是灰色0的黄色1去掉即可,具体数量也根据游戏需求来制定,我这里只去掉了一部分。

5、最后,给地图加上出口和入口,地图就做完啦!

总结一下,这种方案比前两种多了小型地块,这一点比较适合设计玩家的阶段性反馈。同时地图的分岔路明显减少,玩家在这种方案下的选择次数会明显降低。另外,由于这个方案的步骤相对多且独立,所以对于设计者来讲会比较容易控制地图的结构。