芝麻开门-地图切换
你能在一个房子里面呆多久?一张图片能看多久?是的,我们需要提供更多的空间给英雄。那意味着要改变地图、创建新的房间、把英雄放置到合适的位置。
为了创建两个房间,我们声明了两个地图数组: myMap1 = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 2], [1, 1, 1, 1, 1, 1, 1, 1] ];
myMap2 = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [2, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1] ];
在game对象中设置当前的地图序号: game={tileW:30, tileH:30, currentMap:1}
然后,我们开始扫描地图myMap1,通过buildMap函数把它实现到屏幕上。我们可以把myMap1作为一个参数传递给buildMap函数,这样buildMap函数就具备更好的通用性。
buildMap(_root[“myMap”+game.currentMap]);
接下来,我们还需要一个描绘”门”的对象:
game.Doors = function (newmap, newcharx, newchary) { this.newmap = newmap; this.newcharx = newcharx; this.newchary = newchary; };
game.Doors.prototype.walkable = true; game.Doors.prototype.frame = 3; game.Doors.prototype.door = true; game.Tile2 = function () { }; game.Tile2.prototype = new game.Doors(2, 1, 4); game.Tile3 = function () { }; game.Tile3.prototype = new game.Doors(1, 6, 4);
你可能已经猜到了,Doors对象是可以通行的,它是mc的第3帧,它还有一个属性door,而且值是true.我们后面将会利用这个属性来判断英雄是不是走到了门口.
这里用到一个东西,叫做”继承”,听起来有些恐怖?呵呵,其实很简单也很有用.所有的门对象创建的时候都用了Doors模板,Doors对象拥有的所有的所有属性都传递给了他们.比如他们都是可通行的,而且都是第3帧.
我们创建一个门的时候,必须指定几个必要的信息: 它是通往哪个房间(map)的,还有,英雄的新坐标是多少?
你可能要问,为什么要给英雄指定新坐标呢?因为创建新的房间以后,如果英雄还在原来的坐标,就有可能看起来不正确.还有,要避免英雄的新坐标所在的方块是不可通行的障碍物,或者是另外一个门.最糟糕的结果是英雄不停地被传送于两个房间,天哪~ 最合理的应该是把英雄放在新地图中门的旁边。
在创建门方块的时候,我们传递了3个参数:newMap、newCharX、newCharY。 他们分别是新的地图序号,新的X坐标和新的Y坐标。当地图数组中出现数字2的时候,buildMap函数会在相应的地方创建一个Tile2方块。英雄穿过Tile2方块后,他将到达myMap2,他的新坐标是(1,4)。你可以在多个地图中都用2,他们都可以让英雄回到myMap2。
更多的代码
在moveChar函数中插入下面这段代码,放在return语句之前: if (game["t_" + ob.ytile + "_" + ob.xtile].door and ob == _root.char) { changeMap(ob); }
他的作用是,我们在移动了对象之后判断是不是站到了门口,而且对象要是英雄才行,如果都满足要求,那么就换个地图。我们利用changMap函数实现更换地图的功能:
function changeMap(ob) { var name = "t_" + ob.ytile + "_" + ob.xtile; game.currentMap = game[name].newMap; ob.ytile = game[name].newchary; ob.xtile = game[name].newcharx; ob.frame = ob.clip._currentframe; buildMap(_root["myMap" + game.currentMap]); }
这个函数很好理解,我们从门对象(game[name])中得到newMap、newCharX、newCharY参数,然后调用buildMap函数创建新地图。
这里用到了一个新的属性:frame,它是用来记录英雄当前的方向的,如果没有记录,在新地图里面,英雄总是停在第一帧。我们同时还要加这句as到buildMap函数中(设置了英雄的坐标以后): char.clip.gotoAndStop(char.frame);
这就是关于门的全部了,好了,多串串门吧~
下载源文件
出处:蓝色理想
责任编辑:qhwa
上一页 碰撞检测 下一页 跳跃
◎进入论坛Flash专栏版块参加讨论
|