Flash制作简单塔防游戏(一)

玩过塔防游戏,基本上就是一堆大小怪物沿着固定路径行走,玩家在地图上某些点放置武器歼灭他们。

首先让我们准备一张简陋的地图

黄色的表示怪物行走路径,箭头表示行走的方向,路上的红色圆点坐标用来作为路径的数据,怪物根据这些数据进行行走。
行走的实现原理如下:

物体要从A点移动到B点,速率为speed(每帧移动的长度)

那么用A到B的总长度除以speed,然后取整,得到的结果表示多少帧后,物体已经移动到B点。
计算出A点到B点的方向,然后把Speed分解成水平与竖直方向的两个值vx,vy。
然后在每帧,把物体的坐标加上这两值,从而实现物体的移动。
 
打开flash cs5, 新建一个actionscript 3文档game.fla,设置大小为800*600,帧频36f/s.
 
路径上的点用一个自定义的类来表示,之所以不用现成的Point类是因为我只需要坐标值,不需要运算,用Point重了点
 
下面就是自定义的Dot类
 
package  {
 
 public class Dot {
  //横坐标
  public var x:int;
  
  //纵坐标
  public var y:int;
 
  public function Dot(xPoz:int, yPoz:int) {
   // constructor code
   x = xPoz;
   y = yPoz;
  }
 }
}
 
插入新元件创建小怪物

点“确定”后会弹出一个对话框,点"确定"就可以了。

 回到game.fla,把我们画好的地图导入到舞台,对齐到(0,0),新建一个图层,在上面直接写下以下的代码,


import flash.events.Event;

//路径数据,数组中的每个元素代表一个点,顺序是从起点到终点
var pathArr:Array = [new Dot(850, 27),
      new Dot(800, 27),
      new Dot(627, 20),
      new Dot(444, 22),
      new Dot(391, 30),
      new Dot(150, 31),
      new Dot(90, 50),
      new Dot(73, 133),
      new Dot(71, 193),
      new Dot(80, 220),
      new Dot(110, 260),
      new Dot(162, 302),
      new Dot(228, 324),
      new Dot(282, 320),
      new Dot(540, 233),
      new Dot(590, 227),
      new Dot(630, 250),
      new Dot(646, 293),
      new Dot(651, 543),
      new Dot(643, 600)];

 

//创建小怪物,添加到舞台,并设定初始位置
var monster:Monster = new Monster();
addChild(monster);
monster.x = Dot(pathArr[0]).x;
monster.y = Dot(pathArr[0]).y;

//小怪的运动速率
var speed:int = 6;
//分解到两个方向,水平vx和竖直vy
var vx:Number;
var vy:Number;

//连点之间的距离除以速率的值
var stepNums:int;
//循环用变量
var stepCount:int = 0;

//当前是否经过一个关键点(数组中指定的点 )
var passedDot:Boolean = true;
//当前对应的关键点
var currentIndex:int = 0;

//关键点数量
var num:int = pathArr.length;

this.addEventListener(Event.ENTER_FRAME, onEnterFm);


function onEnterFm(e:Event):void
{
  //如果正好通过一个关键点
  if(passedDot)
  {
   //如果还没有到最后一个关键路径点
   if(currentIndex < num - 1)
   {
    //两相邻关键点Y坐标差值
    var deltaY:Number = Dot(pathArr[currentIndex+1]).y - Dot(pathArr[currentIndex]).y;
    //两相邻关键点X坐标差值
    var deltaX:Number = Dot(pathArr[currentIndex+1]).x - Dot(pathArr[currentIndex]).x;
    //计算出两相邻关键点连线的角度
    var angle:Number = Math.atan2(deltaY, deltaX);
    
    //调整小怪的角度
    monster.rotation = angle * (180/Math.PI);
    
    //计算出在这两个关键点之间每帧在两个方向上的移动距离
    vx = speed*Math.cos(angle);
    vy = speed*Math.sin(angle);
    
    计算出两相邻关键点连线的长度(勾股定理)
    var dis:Number = Math.sqrt(deltaY*deltaY+deltaX*deltaX);
    //距离除以速率,得到的值表示在这个值表示的帧数内不用再计算vx和vy
    stepNums = int(dis/speed);
    
    
   }
   
   //
   passedDot = false;
  }
  
  
  
  if(stepCount < stepNums)
  {
   //只要小于stepNums,怪物移动的方式如下
   monster.x += vx;
   monster.y += vy;
  }

  else
  {
   //没有运动到终点
   if(currentIndex < num - 1)
   {
    //对应关键点移动到下一个
    currentIndex++;
    //循环计数重置
    stepCount = 0;
    //通过了一个点,开始一段新路程
    passedDot = true;
    //将小怪定位到新起点
    monster.x = Dot(pathArr[currentIndex]).x;
    monster.y = Dot(pathArr[currentIndex]).y;
   }
   
  }
  stepCount++;
}

按下cltr+enter运行一下,看到小怪的确是按照指定的路径在运动,而且小怪的自转角度也是合适的。

 

 

 

文章来自http://cdbym.blog.163.com/blog/static/28331498201167104013925/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值