Flash 游戏制作教程 <二>
作者:jack 日期:2006-03-27
Tile Based Games 2.1
by TONYPY 翻译: jackgun_at_126.com
建立地图(Creating tiles)
看来你看完了 “地图构造” 一章以后,也想做自己的二维数组地图吧。现在我们来根据上一章的二维数组,将它变成真正的游戏地图。让每块砖显示在正确的位置和正确的样式。下面例子中可以看到,我们用黑色砖表示墙,它是不能穿过的。而白色样式的砖则是可以在上面行走的。
现在,我们来声明一些对象和变量:
myMap = [
[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, 1],
[1, 1, 1, 1, 1, 1, 1, 1]
];
game={tileW:30, tileH:30};
game.Tile0= function () {};
game.Tile0.prototype.walkable=true;
game.Tile0.prototype.frame=1;
game.Tile1= function () {};
game.Tile1.prototype.walkable=false;
game.Tile1.prototype.frame=2;
嗯,我们已经有了由数组组成的地图变量 myMap。在地图下面,声明了对象 "game" 。 我们将使用这个对象来支持整个游戏的素材需要,它可以在 _root 或其它任何地方提供素材支持。
注意:我们同样给这个 game 对象两个属性 tileW=30 和 tileH=30. 这两个属性表示我们每块砖的宽和高。如果游戏地图并不是正方形的话,你可以将它改成长方形的。无论什么时候我们都要记住砖块的尺寸。我们可以这样写:
game.tileW;
game.tileH;
当我们改变所有砖的尺寸时候,只需要改变上面这两个属性值就可以了。
下面我们来设置 game 对象内部的砖块的属性:
game.Tile0= function () {};
game.Tile0.prototype.walkable=true;
game.Tile0.prototype.frame=1;
第一行 game.Tile0= function () {} 声明了一个新的对象属性。到时我们在数级地图中取得 0 值时,我们就用这个 Tile0 来作为模板生成新的砖块对象在那个位置放砖。
第二行,我们给 Tile0 对象设置 walkable 属性 walkable=true (代表这种砖是可以穿过和在上面行走的) 。 frame=1 (代表我们将使用frame 1 样式来表示这种砖)。
Tile Based Games 2.2
by TONYPY 翻译: jackgun_at_126.com
显示地图
你准备好生成地图了吗?我们将写一个 buildMap 的 function ,它负责管理铺砖的工作。如果你的游戏有多个关,你可以用同样的 function 不同的数组地图来生成不同关卡地图(“titles”)。 buildMap 这个 function 有以下功能:
+ 从库中复制 movie clip
+ 循环地图数组
+ 创建新的砖块对象
+ 复制整个地图
+ 砖块在地图上的布置
+ 显示每块砖的样式
以下是它的代码:
function buildMap (map) {
_root.attachMovie("empty", "tiles", ++d);
game.clip=_root.tiles;
var mapWidth = map[0].length;
var mapHeight = map.length;
for (var i = 0; i < mapHeight; ++i) {
for (var j = 0; j < mapWidth; ++j) {
var name = "t_"+i+"_"+j;
game[name]= new game["Tile"+map[i][j]];
game.clip.attachMovie("tile", name, i*100+j*2);
game.clip[name]._x = (j*game.tileW);
game.clip[name]._y = (i*game.tileH);
game.clip[name].gotoAndStop(game[name].frame);
}
}
}
第一行是声明这个 function 和这个 function 的局部变量 map。这样,当我们调用这个 function 的时候就可以将我们的二维地图数组通过 map 这个变量来传递给 buildMap 这个 function 了。
下一行就是复制砖块的 movie clip 到舞台上了:
_root.attachMovie("empty", "tiles", ++d);
你要有 empty movie clip (空的 MC) 在组件库里。在组件库(library)右单击这个 movie clip (MC,电影夹) ,选择 “连结”,点选 "导出给action script 使用” 并取识别名为 "empty" 。现在,复制MC 命令 attachMovie 就可以从组件库里复制 "empty" 了. 它将复制 “empty” 到舞台并取名为 "tiles"。 这个空的 MC 将作为一个容器用于装载所有的砖块从面形成一个地图。当游戏进行到下一关或者游戏结束时,我们只需要删除这个 “tiles” MC,而在它里面的所有组成地图的砖块、游戏运行时的 Action Script 都一并被删个干净了。
有了这个 “tiles” MC 后,我们就把它赋值给 game 对象 game.clip = _root.tiles. 现在,我们需要访问 “tiles” MC的时候,我们就可以使用 game.clip 了。 很容易吧,如果我们需要把这个 “tiles” 用到别的地方时,只需要改一下这行代码就可以了。
Tile Based Games 2.3
by TONYPY 翻译: jackgun_at_126.com
现在我们建立两个变量 mapWidth 和mapHeight。我们将用这两个变量来循环地图数组。 mapWidth 代表地图 (“tiles”) 的宽度 (列),就是说我们打算横着铺几块砖,它的值我们只需要取地图数组的第一个元素的长度就行了map[0].length。 如果你忘了地图数组的概念,那就翻回去 "地图的格局" 一章复习一下吧。在地图数组中的第一个元素是另外一个数组 [1, 1, 1, 1, 1, 1, 1, 1] ,所以 mapWidth 的值等于 8 ,现在我们知道横着铺 8 块砖了。
同样的, mapHeight 代表我们的地图要铺几行。 它的值等于 map.length,也就是地图数组的长度值。
我们将用这个的代码来循环地图数组:
for (var i = 0; i < mapHeight; ++i) {
for (var j = 0; j < mapWidth; ++j) {
我们开始以 i 从 0 到地图的高 (行数) ,用 j 从 0 到 地图的宽 (列) 来循环我们的地图。
变量 "name" 的值来自这行 var name = "t_"+i+"_"+j 我们将用这个 “name” 来建立新的 tile 对象。例如当 i=0 、 j=1 时, name = "t_0_1" 。 或 i=34 和 j=78 时name 的值就是 "t_34_78"。
现在我们建立新的 tile 对象:
game[name]= new game["Tile"+map[i][j]]
在等号左边的 game[name] 将在 game 对象中建立一个新的 tile 对象,它将是地图 “tiles” 中的砖块之一。 map[i][j] 的值并不是 i 或者 j 的值,它将从地图数组中返回一个相对应的数字。我们根据早前所声明的砖 (tile) 对象原型,使用 "new" 这个关键词来建立新的 tile 对象。现在我们已经在 game 对象中建立了我们所需要的所有砖对像。
下面一行中,我们复制新的砖块 MC 到舞台上并使用 game.clip[name] 来管理它。每个 MC 将被放置在指定的 x/y 位置上,x/y 的值是由 j 和 i 的值乘以砖块的宽或高得来的。同样的,新的 tile 对象继承了它的原型的 "frame" 属性,我们使用 gotoAndStop 命令让这个 MC 跳到正确的帧以显示它的样式。
现在,我们想创建一个地图,只需要这个调用 buildmap function :
buildMap(myMap);
你可以点击这里下载 fla 源文件。
上一篇
下一篇

文章来自:
Tags: