Flixel学习笔记002 加载地图(一)

  这篇的参考官方代码示例Cameras,代码在https://github.com/phmongeau/SplitScreen/tree/master/src

  首先用Windows的画图画了几个格,大小是20*20的。

  然后参照官方代码示例,写了一段代码:

 1 package org
 2 {
 3     import org.flixel.FlxState;
 4     import org.flixel.FlxTilemap;
 5
 6     /**
 7      * ...
 8      * @author QuanJP [email protected]
 9      */
10     public class GameState extends FlxState
11     {
12
13         [Embed(source = "../maptile.png")] private var ImgTile:Class;
14
15         protected var map:FlxTilemap;
16
17         public function GameState()
18         {
19             var data:Array = [    2, 2, 2, 1, 1, 1, 2,
20                                 2, 0, 2, 1, 1, 2, 0,
21                                 2, 2, 2, 1, 2, 0, 0];
22             map = new FlxTilemap();
23             map.loadMap(FlxTilemap.arrayToCSV(data, 7), ImgTile, 20, 20);
24             add(map);
25         }
26
27     }
28
29 }

  随便写写的地图数据,编译后变成这样:

  不知道为什么,没有显示出红色部分。

  还是分析一下代码吧。下面是我注释的代码,当然,代码是原作者Adam Atomic写的,我只是加注释。

 1         /**
 2          * 凭借一个字符串数据和瓷砖图像加载一个瓷砖地图。
 3          *
 4          * @param    MapData            一系列以‘,‘和‘\n‘划定指标指示瓷砖应该以什么顺序进去。
 5          * @param    TileGraphic        您想要使用的瓷砖,排成一条在MapData对应数字。
 6          * @param    TileWidth        瓷砖宽度 (e.g. 8) - 不设置默认为瓷砖位图的宽度。
 7          * @param    TileHeight        瓷砖宽度 (e.g. 8) - 不设置默认为瓷砖的宽度。
 8          * @param    AutoTile        是否使用自动瓷砖贴图算法加载地图。  Setting this to either AUTO or ALT will override any values you put for StartingIndex, DrawIndex, or CollideIndex.
 9          * @param    StartingIndex    Used to sort of insert empty tiles in front of the provided graphic.  Default is 0, usually safest ot leave it at that.  Ignored if AutoTile is set.
10          * @param    DrawIndex        Initializes all tile objects equal to and after this index as visible. Default value is 1.  Ignored if AutoTile is set.
11          * @param    CollideIndex    Initializes all tile objects equal to and after this index as allowCollisions = ANY.  Default value is 1.  Ignored if AutoTile is set.  Can override and customize per-tile-type collision behavior using <code>setTileProperties()</code>.
12          *
13          * @return    A pointer this instance of FlxTilemap, for chaining as usual :)
14          */
15         public function loadMap(MapData:String, TileGraphic:Class, TileWidth:uint=0, TileHeight:uint=0, AutoTile:uint=OFF, StartingIndex:uint=0, DrawIndex:uint=1, CollideIndex:uint=1):FlxTilemap
16         {
17             auto = AutoTile;
18             _startingIndex = StartingIndex;
19
20             //基于数据字符串辨别地图维度。
21             var columns:Array;
22             var rows:Array = MapData.split("\n"); //用‘\n’把输入的MapData分成字符串数组
23             heightInTiles = rows.length;//地图高度(以格子数计)就是rows的长度
24             _data = new Array();
25             var row:uint = 0;//处理第几行?
26             var column:uint;
27             while(row < heightInTiles)
28             {
29                 columns = rows[row++].split(",");//用‘,‘划分列的元素
30                 if(columns.length <= 1)
31                 {
32                     heightInTiles = heightInTiles - 1;
33                     continue;//假如发生空行的情况,地图高度减1
34                 }
35                 if(widthInTiles == 0)
36                     widthInTiles = columns.length;
37                 column = 0;
38                 while(column < widthInTiles)
39                     _data.push(uint(columns[column++]));//把整列压进_data
40             }
41
42             //Pre-process the map data if it‘s auto-tiled
43             var i:uint;
44             totalTiles = widthInTiles*heightInTiles;
45             if(auto > OFF)
46             {
47                 _startingIndex = 1;
48                 DrawIndex = 1;
49                 CollideIndex = 1;
50                 i = 0;
51                 while(i < totalTiles)
52                     autoTile(i++);
53             }
54
55             //搞清楚瓷砖的尺寸
56             _tiles = FlxG.addBitmap(TileGraphic);//加载图像
57             _tileWidth = TileWidth;
58             if(_tileWidth == 0)
59                 _tileWidth = _tiles.height;//函数参数起不起作用
60             _tileHeight = TileHeight;
61             if(_tileHeight == 0)
62                 _tileHeight = _tileWidth;//函数参数起不起作用
63
64             //创建一些瓷砖对象,留给以后做重叠检查 (每种一个)
65             i = 0;
66             var l:uint = (_tiles.width/_tileWidth) * (_tiles.height/_tileHeight);
67             if(auto > OFF)
68                 l++;
69             _tileObjects = new Array(l);
70             var ac:uint;
71             while(i < l)
72             {
73                 _tileObjects[i] = new FlxTile(this,i,_tileWidth,_tileHeight,(i >= DrawIndex),(i >= CollideIndex)?allowCollisions:NONE);
74                 i++;
75             }
76
77             //为debug需求创建的对象
78             _debugTileNotSolid = makeDebugTile(FlxG.BLUE);
79             _debugTilePartial = makeDebugTile(FlxG.PINK);
80             _debugTileSolid = makeDebugTile(FlxG.GREEN);
81             _debugRect = new Rectangle(0,0,_tileWidth,_tileHeight);
82
83             //创建地图
84             width = widthInTiles*_tileWidth;
85             height = heightInTiles*_tileHeight;
86             _rects = new Array(totalTiles);
87             i = 0;
88             while(i < totalTiles)
89                 updateTile(i++);//刷新
90
91             return this;
92         }

  好了,知道了MapData究竟是怎样的,其实就是用","和"\n"划分的普通的地图数据而已,基本可以用了。还有其他参数也比较清晰。可以说,知道loadMap()就基本可以使用这个类了,不过它还有很多高级功能,下次再看看吧。

  GameState里的代码改成这样,也就可以显示剩余部分了。

1         public function GameState()
2         {
3             var data:Array = [    2, 2, 2, 1, 1, 1, 2,
4                                 2, 0, 2, 1, 1, 2, 0,
5                                 2, 2, 2, 1, 2, 0, 0];
6             map = new FlxTilemap();
7             map.loadMap(FlxTilemap.arrayToCSV(data, 7), ImgTile, 20, 20,FlxTilemap.OFF,0,0,1);
8             add(map);
9         }

  代码地址:https://github.com/quanjp/LearningFlixel/tree/master/002loadMap

时间: 2024-12-21 14:40:09

Flixel学习笔记002 加载地图(一)的相关文章

Away3D 学习笔记(一): 加载3DS格式的模型文件

加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 1 private function load3DSFile():Loader3D 2 { 3 loader = new Loader3D(); 4 loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE,onLoadComplete); 5 loader.addEventListener(AssetEvent.ASSET_COMPLETE,onAsset

OGEngine学习笔记---资源加载

声音管理兼容各种音频文件格式,比特率和样本率 OGEngine开源引擎兼容各种音频视频文件格式,并且引用了硬件加速技术,来对音频文件进行io读取,简化了资源的加载和读取写入的过程,大幅度减少应用卡顿.无响应的状况出现. 一个背景音乐 多个音效 OGEngine开源引擎在同一时间只能播放一首背景音乐,但是能同时播放多个音效. 首先自定义一个枚举类ConfigData,用来存放背景音乐key和音效key. public class ConfigData { /** 背景音乐*/ public sta

ArcGis API for JavaScript 开发笔记一 加载地图

1.首先要配置GIS 环境 参考资料:看下这些大神的资料: http://blog.sina.com.cn/s/blog_708bacf90100yddk.html http://blog.csdn.net/wufeishimeng/article/category/522004 也可以查看官方的例子: https://developers.arcgis.com/javascript/jssamples/ 查看GIS 官方API https://developers.arcgis.com/jav

ArcGIS API for JavaScript3.x 学习笔记[5] 加载底图(四)【高德在线地图】

/** * Created by WanderGIS on 2015/7/15. */ define(["dojo/_base/declare", "esri/geometry/Extent", "esri/SpatialReference", "esri/geometry/Point", "esri/layers/TileInfo", "esri/layers/TiledMapServiceLa

ArcGIS API for JavaScript3.x 学习笔记[3] 加载底图(一)【天地图(经纬度版)】

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>天地图底图加载(经纬度版本)</title> 6 <link rel="stylesheet" href="https://js.arcgis.com/3.21/esri/css/esri.css"> 7 <script

学习笔记TF015:加载图像、图像格式、图像操作、颜色

TensorFlow支持JPG.PNG图像格式,RGB.RGBA颜色空间.图像用与图像尺寸相同(height*width*chnanel)张量表示.通道表示为包含每个通道颜色数量标量秩1张量.图像所有像素存在磁盘文件,需要被加载到内存. 图像加载与二进制文件相同.图像需要解码.输入生成器(tf.train.string_input_producer)找到所需文件,加载到队列.tf.WholeFileReader加载完整图像文件到内存,WholeFileReader.read读取图像,tf.ima

OPENCV学习笔记2_Mat 加载, 显示

1.1 Introduction to related functions    1.Imread() function Mat imread( const String& filename, int flags = IMREAD_COLOR ); filename:Name of file to be loaded flags:载入标识,指定一个加载图像的颜色类型(参考enum ImreadModes).自带缺省值1,如果在调用时忽略这个参数,就表示载入三通道的彩色图像. enum Imrea

Hibernate学习笔记-懒加载Lazy-true

1. 懒加载概述以及使用情景 描述:懒加载(lazy),简单说就是延时.延迟加载. 情景:在Hibernate框架应用中,就是当我们要访问的数据量过大时,使用缓存并不太合适,因为内存容量有限 ,为了减少系统资源的消耗,减少并发量,这时需要用懒加载机制来弥补这种缺陷,但是这并不意味用了懒加载总体性能就提高了. 应用: 比如学校school和学生student,学校与学生1对多,如果lazy设置为 false,那么只要加载了一个学校的信息,就会根据一对多配置的关系把所有学生的信息也加载出来.但是实际

[WPF学习笔记]动态加载XAML

好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代码. 在debug文件夹下新建一个文本文件,重命名为:file.xaml 插入界面代码: <DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Button Name=