快速业务通道

用数组实现flash中的迷宫行走

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-14
ActionScript写在map上面,所以我写成了this.y和this.x。请不要与this._y和this._x搞混。

  迷宫地图的大小是2000*1500,数组的每个元素在映射到map上,每个元素相当于25*25的矩形。player行走的速度speed初始化为5,而数组的元素映射在map上的矩形的中心点与中心点之间距离是25,说明player需要走5步才能到达下一个矩形中心,这时就需要一个步长变量来控制player的位置在数组中的变化。stepy和stepx分别表示纵步长和横步长,初始化stepy=5;stepx=5。

  1、迷宫底图的初始化
  onClipEvent (load) {  //当map载入时
    this.speed = 5;  //初始化速度speed为5
    this.x = 1;  //初始化player在数组中的列x,第1列
    this.y = 60;  //初始化player在数组中的行y,第60行,即定义骷髅最开始的位置在左下角
    this.stepx = 5;  //初始化横的步长stepx
    this.stepy = 5;  //初始化纵的步长stepy
    blk = new Array();  //建立数组blk
    for (var i = 1; i<=60; i++) {
      blk[i] = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    }

  //初始化数组,把数组的元素赋值为0,即设定地图上所有的地方都为可以行走。这里这样写诗为了演示数组的用法和提高运行效率,大家也可以用双重for循环定义blk[i][j]=0;

    blk[9][23] = 1;
    blk[9][24] = 1;
    ......
    blk[60][36] = 1;

    //初始化障碍
  }
  2、键盘控制行走

  这部分我以向左走为例用注释来讲,容易看明白些。   onClipEvent (enterFrame) {
    if (Key.isDown(37)) { 
 //如果left键按下
      if (!(Key.isDown(39) && Key.getCode() == 39)) {
      //如果right键没按下并且最后按下的不是right键,这种情况看上去似乎不存在,实际确是存在的,如先按住right键不放,然后按下left键,这时你希望是向左走,而不是向右走,所以必须判断最后按下的键是否是为right键,这样做有利于控制的流畅性,但在后面的按up键和down键中没加类似这句的语法,是因为同时按下up键和down键的情况一般不存在。

        if (_root.player._x-this.speed>=-38 && (!(blk[y][x-1] == 1 && this.stepx == 5)) && (!((blk[y-1][x-1] == 1 && this.stepy<5 && this.stepx == 5) || (blk[y+1][x-1] == 1 && this.stepy>5 && this.stepx == 5)))) {
        //如果player的x坐标减去速度speed大于等于player的最小x坐标即-38,并且在数组中y行x-1列元素的值不等于1(当前player在数组中的位置是y列x行,这是为了判断player在数组中左边的元素映射到map上的矩形是否为障碍),而且此时stepx的值为5,(这是为了防止边碰撞的时候stepx不为5时player离障碍还有一段距离的情况下就不能前进了好像有一堵空气墙一样。)并且满足以下两个条件之一或者都满足:1、在数组中y-1行x-1列的元素不等于1并且stepy小于5,stepx等于5。2、在数组中y+1行x-1列的元素不等于1并且stepy小于5,stepx等于5。这两个条件是为了防止player从右走向左时向左上或左下等斜方向走时走入角一类的障碍物中去,正确的应该是下图这样的。



          if (this._x+this.speed>1000 || _root.player._x>162) {
          //如果map的x坐标加上速度speed大于map的最小x坐标即1000或player的x坐标大于162(当map的x坐标等于1000的时候,map已经不能再往右移动了,这时就需要移动player的x坐标了。player在这个flash中的x中间坐标是16

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号