Flash 游戏制作教程 <二>

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 将作为一个容器用于装载所有的砖块从面形成一个地图。当游戏进行到下一关或者游戏结束时,我们只需要删除这个 tilesMC,而在它里面的所有组成地图的砖块、游戏运行时的 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 源文件。

 

 




[本日志由 jack 于 2006-06-29 03:53 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Flash 游戏 制作 教程
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.