`
hereson
  • 浏览: 1460533 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

AS3.0中的区块设计

阅读更多

这篇文章主要是讲解如何基于AS3来制作一个区块游戏,但仍然保持OOP的结构。
这篇文章的代码能够被诸如FlexBuilder,FlashDevilop这里的编译器解释,当然Flash IDE也可以,但是要在主场景上指明main类。
该应用程序需要一个XML文件存储地图数据,它将会被转换为实际地图显示在屏幕上。这里面是没有什么交互的,不过是区块的放置位置和管理。
程序需要X类,每个来都负责不同的功能。
1、main类:管理所有的类和所创建的实例。
2、XmlLoader:载入一个xml文件并保存他的数据。
3、Parser:解析xml到一个二维的数组当中。
4、Screen:接收parser所创建的数字来构造一个区块的矩阵。
5、Tile:单个区块,保存类型x位置和y位置。
在最后我将会给出main文件:
第一个类:XmlLoader

package tools
{
  import flash.events.EventDispatcher;
  import flash.net.URLRequest;
  import flash.net.URLLoader;
  import flash.events.Event;
  
  public class XmlLoader extends EventDispatcher{
    
    private var _loader:URLLoader;
    
    private var _xml:XML;
    
    public function XmlLoader(path:String){
      _loader = new URLLoader();
      try{
        _loader.load(new URLRequest(path));
      }catch(e:Error){
        trace("error in loading the XML file")
      }
      _loader.addEventListener(Event.COMPLETE,onLoadXml);
    }
    
    private function onLoadXml(event:Event):void{
      //trace("xml loaded")
      _xml = XML(URLLoader(event.target).data)
      dispatchEvent(new Event(Event.COMPLETE));
    }  
    
    public function get xml():XML{
      return _xml;
    }
  }
}


这个类接收XML文件的路径,尝试载入它。xml被载入以后,类将会dispatch一个事件,以便创建XmlLoader实例的类能够知道载入已经完成了,我们可以继续了。(这是一个非即时的操作,所有我们需要一个事件机制)。
请注意:有一个事件监听来监听载入的操作,还有一个事件的派遣-main 来接收该事件。第一个市内置的,第二个是同其他的类来连接。载入了xml数据以后,XmlLoader 的实例会保存该数据然后通过其他的类中的一个指定的getter函数来获得它。另一个应该注意到的是try & catch
来处理一些特定的错误事件,这样可以防止一个错误信息在运行中发送给用户。

第二个类:parser
解析的工作是非常的简单的,-获得一个xml对象,然后分割成行,每一行对应一个数字。在完成了划分以后,这个类的一个实例会保存数组中的行以便其他的类能够读取它。这也是由一个getter函数来完成的。_rows数组是一个二维数组。根据xml文件,其中的每一个单元都被描述成一行,每行都有若干的数字。
接收xml文件的类的结构如下所示:

package tools
{
  public class Parser{
    
    private var _xml:XML;
    private var _rows:Array;
    
    
    public function Parser(xml:XML){
      _xml = xml;
      _rows = new Array();
      getRows();
    }
    
    private function getRows():void{
      // get all rows
      var rows:XMLList = _xml.screen.children();
      var singleRow:Array;
      var rowString:String = rows[i];
      for(var i:uint=0;i<rows.length();i++){
        rowString= rows[i];
        // split numbers in string to cells in singleRow array
        singleRow = rowString.split("");
        //save singleRow in _rows array;        
        _rows.push(singleRow);
      }  
    }
    
    //return an arra of all rows (every row is an array of numbers
    public function get rows():Array{
      return _rows;
    }
    
  }
}



为了能让该工作完成,xml文件的结构应该是这样的:

<?xml version='1.0' encoding='UTF8'?>
<data>
  <screen id="" title="">
    <row>111111111111111111111111111111</row>
    <row>100000000000000000000000000001</row>
    <row>101000000000000000003300000001</row>
    <row>101000000000000000000000000001</row>
    <row>101111110000001111000000000001</row>
    <row>100000000000004400000000000001</row>
    <row>100000000000000000000111510001</row>
    <row>100000000000000000000000000001</row>
    <row>111111111111111111111111111111</row>
  </screen>
</data>


如果你是其他的结构需要改变一下parser。
Parser和XmlLoader都在一个名为tools的包中。
第三个类:一个视觉上的Screen

Screen类的实例接收到数组中的数据(Parser类中所解析成的样子)然后根据数组构建一个区块的矩阵。它需要一个两层的for循环。第一层循环遍历所有的行。内部的循环来遍历行里面的所有的数字。内部的for循环每执行一次都创建一个区块,然后将他放到一个数组中(这样做可以让我们以后访问到所有的区块)。
这个类和Tile类都在一个名为"visual"的包中:

package visual
{
  import visual.Tile;
  import flash.display.Sprite;
  
  public class Screen extends Sprite{
    
    private var _screenArray:Array;
    private var _tiles:Array;
    
    public function Screen(screenArray:Array){
      _screenArray = screenArray;
      _tiles = new Array();
      var tile:Tile;
      var row:Array;
      
      // create matrix
      for(var i:uint=0;i<_screenArray.length;i++){
        row = _screenArray[i] as Array;
        for(var j:uint=0;j<row.length;j++){
          // create a new tile and push it to _tiles
          tile = new Tile(Number(row[j]),j,i)
          addChild(tile)
          _tiles.push(tile);
        }  
      }    
    }
    
    //let other classes get the tiles array.
    public function get allTiles():Array{
      return _tiles;
    }
  }
}


第四个类:Tile

最后的visual类是Tile类,它提供单个的区块,具有3个属性:
Type:(代码在XML来描述这一区块)
locationX-描述他在矩阵中的水平位置-数字的位置而不是像素的。
locationY-描述他在矩阵中的垂直的位置。
三个属性都是getter函数。外部的对象可以"ask"每一个区块的属性。我决定使用颜色来区分区块类型的不同。
以下是Tile类的代码:

package visual{
  import flash.display.Sprite;
  
  public class Tile extends Sprite{
    
    private var _type:uint;
    private var _locationX:uint;
    private var _locationY:uint;
    
    // colors of tiles
    static private var TILE_TYPES:Array = [0xDDDDDD,
0xFF00AA,
0xCC00CC,
0xCCCC00,
0x3300FF];
    private const TILE_SIZE:uint = 10;
      
    public function Tile(type:uint,locationX:uint,locationY:uint){
      // get parameters
      _type = type;
      _locationX = locationX;
      _locationY = locationY;
      //draw a square
      graphics.lineStyle(1,0x000000,0.2);
      // different color by type parameter
      graphics.beginFill(  TILE_TYPES[_type],1);
      graphics.drawRect(0,0,TILE_SIZE,TILE_SIZE);
      graphics.endFill();
      x=TILE_SIZE*_locationX;
      y=TILE_SIZE*_locationY;
    }
    
    public function get type():uint{
      return _type;
    }
    public function get locationX():uint{
      return _locationX;
    }
    public function get locationY():uint{
      return _locationY;
    }
  }
}


main 类
最后,我们让所有的东西都运行起来:

package {
  import flash.display.Sprite;
  import tools.XmlLoader;
  import flash.events.Event;
  import tools.Parser;
  import visual.Screen

  public class TileGame extends Sprite{
    
    private var _xmlLoader:XmlLoader;
    private var _xmlData:XML;
    private var _screenParser:Parser;
    private var _screenArray:Array;
    private var _screen:Screen;
    
    
    public function TileGame(){
  var url:String = "http://www.avgil.com/as3/tilegame/screen1.xml";
      try{
      _xmlLoader = new XmlLoader(url);
      } catch(e:Error){
        trace("couldn't load XML file")
      }
      // wait till the XmlLoader will finish loading the data
      _xmlLoader.addEventListener(Event.COMPLETE,onXmlReady);      
    }
    
    private function onXmlReady(event:Event):void{
      //recieve the XML data from the event
      _xmlData = XmlLoader(event.target).xml as XML;
      //parse and build a screen from parsed data
      _screenParser = new Parser(_xmlData);
      _screenArray = _screenParser.rows;
      _screen = new Screen(_screenArray);
      _screen.x = 50;
      _screen.y = 50;
      addChild(_screen);
    }
  }
}


需要注意的是在创建了XmlLoader以后,需要等到XmlLoader说"OK-done"才能做起他的事情。

分享到:
评论

相关推荐

    城市设计-22-方案文本.慈溪新潮塘区块城市设计2011.rar

    在慈溪新潮塘区块的城市设计中,数据扮演着至关重要的角色。数据不仅是分析的基础,也是决策的依据。设计师可能会运用GIS(地理信息系统)技术,收集和分析地形、人口密度、交通流量等大数据,以支持科学的规划决策...

    04.AxureUX中后台管理信息系统通用原型设计方案 v2(区块组合).rp

    04.AxureUX中后台管理信息系统通用原型设计方案 v2(区块组合).rp 04.AxureUX中后台管理信息系统通用原型设计方案 v2(区块组合).rp 04.AxureUX中后台管理信息系统通用原型设计方案 v2(区块组合).rp 04.AxureUX中后台...

    2021年vue3.0 面试题分析.pdf

    在 Vue3.0 中,使用 Proxy API 并不能监听到对象内部深层次的属性变化,因此它的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部属性才会变成响应式,简单的可以说是按需实现响应式,减少性能...

    杰奇CMS中区块与模块的配置详解

    ### 杰奇CMS中区块与模块的配置详解 #### 区块配置 杰奇CMS(Jieqi Content Management System)是一款强大的内容管理系统,它能够帮助网站管理员高效地管理和发布网站内容。区块配置作为其核心功能之一,对于优化...

    蝉知企业门户系统3.0版

    3.0版本更实现了区块的跨列布局功能,进一步增强了布局的灵活性,可以使用这个功能实现对网页布局的各种布局组合。 页面样式方面: 页面样式方面蝉知系统实现了模板 + 风格的体系。模板决定了页面的代码结构,风格...

    KB-1B V3.0原理图

    KB-1B V3.0是一款电子设备的电路板设计,其原理图是理解该电路板功能、结构和工作原理的关键文档。这份"KB-1B V3.0原理图"详细描绘了电路板上各个元器件的布局、连接方式以及信号流程,是工程师进行设计分析、故障...

    蝉知企业门户系统3.0版源码安装包

    蝉知企业门户系统是由...蝉知3.0版本实现了区块的跨列布局和模板风格样式的自定义功能,进一步增强了蝉知系统的定制性。加上之前实现的区块布局、模板风格等功能,蝉知系统可以说是目前可定制性最强的企业门户系统。

    区块狗区块鱼.zip

    网上下载的区块狗源代码,分享给大家!以前叫区块狗,其实里面写的区块鱼,我想了想应该是一套。叫啥都无所谓,就是区块动物,区块+动物就行了呗。要不试试区块外星人?

    【皮特猪运营版】华登区块狗+摩根区块猪+区块神兽世界+区块猫+区块兔+区块十二生肖.zip

    华登区块狗、摩根区块猪、区块神兽世界、区块猫、吉祥猪、区块猪、区块兔、区块十二生肖等等,都是玩法非常相似的区块链DAPP。 区块链APP每只宠物的生成由系统程序智能生成,任何人无法篡改,同时也增加游戏的趣味...

    ckeditor_3.0.zip

    这个压缩包“ckeditor_3.0.zip”包含了该编辑器的完整版本,允许用户在网页上创建和编辑内容,就像在桌面应用程序中一样。CKEditor 3.0 提供了丰富的文本格式化选项,支持图片插入和文件上传,极大地提升了用户在...

    华登区块宠物养殖系统莱特区块狗区块猫源码 完美运营版本.zip

    华登区块宠物养殖系统莱特区块狗区块猫源码 完美运营版本.zip

    华登区块狗源码/区块宠物养成系统/区块猫/派特宠物街模式12生肖源码

    没错,就是目前很火的区块狗系统源码,此系统本人花一万多买的。现在淘宝上互钻上卖的都是这个源码。现在完全分享给大家。如果有能力的做二开更完美。

    Bootstrap3.0预定义样式

    6. **组件**:Bootstrap3.0包含诸如`.jumbotron`大块内容展示区,`.thumbnail`缩略图,`.well`阴影效果区块,`.alert`提示信息,`.badge`徽章,`.label`标签等丰富组件。 7. **响应式工具**:`.visible-*-*`和`....

    最新版华登区块狗源码/区块宠物养成系统/区块猫/派特宠物街模式12生肖源码

    目前很火的区块狗系统源码。本人在CSDN下载的该源码,解决了按照文档搭建出现的各种问题(如:Failed opening required ),该源码可正常运行。为了帮助大家能正常的运行,我把构建中需要注意的地方追加到文档后面。

    2020运营版华登区块狗区块彼特猪区块系统源码.rar

    2020运营版华登区块狗区块彼特猪区块系统源码

    华登区块鱼区块宠物养殖系统源码

    华登区块鱼区块宠物养殖系统源码 完美修复版,派特宠物街模式区块链源码,程序配套有安卓APP,APP在\\\\public\\\\app目录,内附安装教程

    区块json解析数据区块数据

    区块数据

    华登区块狗区块鱼区块宠物养成系区块猫

    华登区块狗区块鱼区块宠物养成系区块猫

    Xoops区块的相关设置

    ### XOOPS区块的相关设置知识点详解 #### 区块概述 XOOPS是一个强大的内容管理系统,其区块(Blocks)是构成网站界面...通过以上步骤,可以有效地管理和定制XOOPS中的区块,从而实现更加个性化和功能丰富的网站设计。

Global site tag (gtag.js) - Google Analytics