拾取物品
本章我们将会让英雄从地上拾取各种物品,例如:水晶、金币、死的蜘蛛、生命药水、弹药……
物品可以有很多种,有的用来增加生命值,有的用来增加弹药。这个例子里面的物品只有一个功能,增加你的point值(显示在下面的那个东西)。创建其他种类的物品就由你自己来完成了。
我们从“芝麻开门”这一章的影片开始,这样我们可以去掉许多复杂的代码,或许这样更容易看明白。
首先要画一个物品的影片剪辑。把各种物品的图片都放在一个剪辑的不同帧。和英雄、敌人一样,这个剪辑的注册点也在中心。在第一帧添加stop()动作。导出as链接,ID是items。和梯子类似,把物品单独做成一个剪辑,放置物品到舞台时,不用重新绘制背景方块。
你捡了多少?
为了显示捡起了多少物品,在舞台上添加一个动态文本。把它放到区块的外面,然后把它的“变量(variale)”设成points:
变量point用来记录拾取的物品数。我们可以先把它添加到game对象中。改一下定义game对象的语句,添加一个points属性,值为0(大部分都是从0开始的):
game = {tileW:30, tileH:30, currentMap:1, points:0};
放置物品
和其他东西一样,首先我们要声明一个物品(items)对象,然后创建数组,用来放置位置信息。
myItems = [ [0], [[1,1,1],[1,1,2],[2,1,3]], [[2,1,3],[2,6,3],[1,5,4]] ]; game.Item1= function () {}; game.Item1.prototype.points=1; game.Item2= function () {}; game.Item2.prototype.points=10;
myItems数组的结构和enemies数组一样(见《愚蠢的敌人》)。它包含了每个地图的物品数组,我们没有用到map0,所以第一个数组为空。在map1中我们设置了3个物品:[1,1,1],[1,1,2],[2,1,3]。每个物品都有3个数字,第一个是物品类型(这里的1或2),也就是物品影片剪辑显示的帧数。第二、第三个数是物品的坐标,我们已经很多次用这种形式了。以[2,1,3]为例,它是第二种类型的物品,坐标是x=1,y=3。
最后部分的代码声明了两种物品类型。目前他们只有一个point属性,用来表示玩家得到后增加的point值。Item1只有1点,Item2却有10点。
现在修改buildMap函数,增加一些创建物品的动作,把下面的代码放在创建英雄部分的前面:
game.items = myItems[game.currentMap]; for (var i = 0; i<game.items.length; ++i) { var name = "item"+game.items[i][2]+"_"+game.items[i][1]; game[name]= new game["Item"+game.items[i][0]]; game[name].position= i; game.clip.attachMovie("items", name, 10001+i); game[name].clip=game.clip[name]; game[name].clip._x = (game.items[i][1]*game.tileW)+game.tileW/2; game[name].clip._y = (game.items[i][2]*game.tileH)+game.tileH/2; game[name].clip.gotoAndStop(game.items[i][0]); } _root.points=game.points;
首先我们复制当前地图用到的物品到game.items对象中,然后循环game.items对象(数组)。
从这行开始:
var name = "item"+game.items[i][2]+"_"+game.items[i][1];
我们给新的物品命名。名字由物品的坐标决定,比如一个物品所在的区块坐标是x=1,y=3,那它的名称是item3_1。
创建了物品对象以后,我们给他添加了一个position属性。这个属性就是物品在game.items数组中的索引值。通过这个属性可以很方便地在game.items数组中找到当前的物品,这样就可以在捡到物品后在数组中删除掉它。
放置物品到正确的位置之后,下一步就是让他显示正确的帧。
最后,我们更新一下points变量,在场景的相应地方显示出来。游戏开始的时候点数可能只有0,但是改变地图的时候,可能英雄已经捡到了几个物品。
拾取
我们已经有了英雄、物品,下一步要做的就是让英雄碰到物品的时候捡起它。把这段代码添加到moveChar函数的末尾:
var itemname=game["item"+ob.ytile+"_"+ob.xtile]; if (itemname and ob == _root.char) { game.points=game.points+itemname.points; _root.points=game.points; removeMovieClip(itemname.clip); game.items[itemname.position]=0; delete game["item"+ob.ytile+"_"+ob.xtile]; }
变量itemname的值由英雄当前的位置决定。比如英雄的坐标是x=4,y=9,那么itemname的值就是"item9_4"。如果这个item9_4确实是存在的,itemname就是物品对象;如果不巧不存在这样的item9_4对象,itemname就是undefined(未定义值)。
如果英雄得到了物品,我们首先把物品的points值加到game.points变量,然后更新_root.points以显示到文本框中。
现在要做的就是把物品从舞台上删除。每一个物品在三个地方都要删除:物品剪辑、物品数组中相应的物品,以及物品对象本身。目前我们不必在数组中删除掉他,仅仅将物品用0替换就行了。另外不要忘了,物品数组仅仅是myItems数组的一部分,如果我们离开地图然后又返回,原先已经拾取的物品又会出现。为了阻止这种现象,我们要更新changeMap函数。
添加下面的代码到changeMap函数的开始:
var tempitems=[]; for (var i = 0; i<game.items.length; ++i) { if(game.items[i]) { var name = "item"+game.items[i][2]+"_"+game.items[i][1]; delete game[name]; tempitems.push(game.items[i]); } } myItems[game.currentMap]=tempitems;
这里我们用到了一个临时的数组:tempitem,用来复制未被拾取的物品,即myItems数组中的非零元素。删除game[name]对象是我们上面提到的三个删除任务中的一个。
点击这里下载本例的源文件
这里我做了侧视图例子:
点击这里下载源文件
出处:蓝色理想
责任编辑:qhwa
上一页 射击 下一页 浮动区块
◎进入论坛Flash专栏 版块参加讨论