- 浏览: 137021 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
Ken艹小哲:
太赞了 哥们 加扣
猜数字问题的最少步数算法. -
chenyuan122912:
...
解决AS3 Socket编程中最令人头疼的问题 -
hyx0914:
有源代码打包下载的吗?
Flex地图分块加载的实现 -
tianhai110:
非常有价值的 测试总结
时间效率,Timer和EnterFrame在FP 10.1之后测试和建议 -
763675117:
你好,fengxiangpiao,看了你的文档,我的需求和你差 ...
解决MovieClip打印问题 转
首先我们确定几个关键点:
窗口大小:windowW:Number,windowH:Number; 指的是可视区域的大小 我们可以把他想成客户端的分别率
单位地图大小: uintPicW:Number,uintPicH:Number; 指的是你切割的地图图片的单元大小。
当前地图坐标:position:point;这里大家就可以想成是你人物的当前所处坐标
清楚了上面的几个关键点,我们再来看下面的这个图:
阴影区域就是可视区域 A、B、C、D就是切割的单元地图
我们可以很容易的求出窗口的4个点,所占的地图的索引:
x0 = position.x - windowW/2;
x1 = position.x + windowW/2;
y0 = position.y - windowH/2;
y1 = position.y + windowH/2;
mapIndexX0 = uint(x0/256);
mapIndexX1 = uint(x1/256);
mapIndexY0 = uint(y0/256);
mapIndexY1 = uint(y1/256);
明白了上面的这些 下面这个类 相信大家都能看明白
- package com.heptaFish.common.game.map.layers
- {
- import com.heptaFish.common.config.Config;
- import com.heptaFish.common.core.BaseDisplayObject;
- import com.heptaFish.common.game.map.impl.GameMap;
- import com.heptaFish.common.hack.HeptaFishGC;
- import com.heptaFish.common.loader.impl.ImageLoader;
- import com.heptaFish.common.map.impl.HashMap;
- import flash.display.Bitmap;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.events.ProgressEvent;
- import flash.geom.Point;
- //地图层 图片
- public class MapLayer extends BaseDisplayObject
- {
- //图片读取器
- private var _imageLoader:ImageLoader;
- //地图图片 用于整块加载模式
- private var _image:Bitmap;
- //地图图片数组 用于栅格式加载地图模式
- private var _imageMap:HashMap;
- //小地图图片
- private var _simage:Bitmap;
- //
- private var _map:GameMap;
- private var _loadType:int;//加载类型 0:整块加载 1:栅格加载
- private var _visualWidth:Number;//地图可视宽度
- private var _visualHeight:Number;//地图可视高度
- private var _sliceWidth:Number;//地图切割单元宽度
- private var _sliceHeight:Number;//地图切割单元高度
- private var _preloadX:Number;//横向预加载屏数
- private var _preloadY:Number;//纵向预加载屏数
- private var _loadingMap:HashMap;//正在加载的屏map
- private var _waitLoadingArr:Array;//等待加载的loadermap
-
- private var _loadingNo:int = Config.getInt("concurrencyImageLoader");
-
- private var _screenImageRow:int;//一屏需要加载的横向图片数
- private var _screenImageCol:int;//一屏需要加载的纵向图片数
- private var _row:int;//总横向节点数
- private var _col:int;//总纵向节点数
-
- private var _nowPlayerPointoint;//当前人物所处的屏
-
- public function MapLayer(map:GameMap)
- {
- _map = map;
- _loadType = parseInt(_map.mapXML.@loadType);
- }
- //读取地图图片
- public function load():void{
- //加载小地图
- var imageLoader:ImageLoader = new ImageLoader();
- var fileName:String =Config.getValue("mapLib") + _map.name + "/map_s.jpg";
- imageLoader.load(fileName);
- imageLoader.addEventListener(Event.COMPLETE,loadSmallSuccess);
- imageLoader.addEventListener(ProgressEvent.PROGRESS,loadingHandler);
- imageLoader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
-
- }
- //读取大地图成功
- private function loadBigSuccess(evet:Event):void{
- var imageLoader:ImageLoader = ImageLoader(evet.target);
- var image:Bitmap = new Bitmap(imageLoader._data);
- addChild(image);
- if(_simage != null && _simage.parent == this){
- removeChild(_simage);
- _simage = null;
- }
- this.width = image.width;
- this.height = image.height;
- imageLoader.removeEventListener(Event.COMPLETE,loadBigSuccess);
- imageLoader.removeEventListener(ProgressEvent.PROGRESS,loadingHandler);
- imageLoader.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- imageLoader = null;
- dispatchEvent(evet);
- HeptaFishGC.gc();
- }
- //读取小地图成功
- private function loadSmallSuccess(evet:Event):void{
- var imageLoader:ImageLoader = ImageLoader(evet.target);
- var image:Bitmap = new Bitmap(imageLoader._data);
- image.width = _map.mapWidth;
- image.height = _map.mapHeight;
- addChild(image);
- this.width = image.width;
- this.height = image.height;
- imageLoader.removeEventListener(Event.COMPLETE,loadSmallSuccess);
- imageLoader.removeEventListener(ProgressEvent.PROGRESS,loadingHandler);
- imageLoader.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- imageLoader = null;
- dispatchEvent(evet);
- HeptaFishGC.gc();
- switch(_loadType){
- case 0://整块加载
- //加载大地图
- var bfileName:String =Config.getValue("mapLib") + _map.name + "/map.jpg";
- var bLoader:ImageLoader = new ImageLoader();
- bLoader.load(bfileName);
- bLoader.addEventListener(Event.COMPLETE,loadBigSuccess);
- bLoader.addEventListener(ProgressEvent.PROGRESS,loadingHandler);
- bLoader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- break;
- case 1:
- _loadingMap = new HashMap();
- _imageMap = new HashMap();
- _waitLoadingArr = new Array();
- _visualWidth = _map.app.screen.size.x;
- _visualHeight = _map.app.screen.size.y;
- _sliceWidth = parseFloat(_map.mapXML.@sliceWidth);
- _sliceHeight = parseFloat(_map.mapXML.@sliceHeight);
- _preloadX = parseFloat(_map.mapXML.@preloadX);
- _preloadY = parseFloat(_map.mapXML.@preloadY);
- _screenImageRow = Math.round(_visualWidth/_sliceWidth);
- _screenImageCol = Math.round(_visualHeight/_sliceHeight);
- _row = Math.ceil(_map.mapWidth/_sliceWidth);
- _col = Math.ceil(_map.mapHeight/_sliceHeight);
- loadSliceImage(_map.initPlayerPoint);
- break;
- default:
- break;
-
- }
- }
-
- //根据player坐标读取周边指定屏数地图
- private function loadSliceImage(playerPointoint):void{
- var nowX:int = Math.floor(playerPoint.x/_sliceWidth);//现在所处的索引X
- var nowY:int = Math.floor(playerPoint.y/_sliceHeight);//现在所处的索引Y
- var nowScreenX:int = Math.floor(nowX/_screenImageRow);//现在所处的屏索引X
- var nowScreenY:int = Math.floor(nowY/_screenImageCol);//现在所处的屏索引Y
- // trace("nowScreenX:" + nowScreenX);
- // trace("nowScreenY:" + nowScreenY);
- _nowPlayerPoint = new Point(nowScreenX,nowScreenY);
- loadScreenImage(nowScreenX,nowScreenY);
- // removeScreenImage(nowScreenX,nowScreenY);
- var startX:int = (nowScreenX - _preloadX < 0 ? 0 : nowScreenX - _preloadX);
- var startY:int = (nowScreenY - _preloadY < 0 ? 0 : nowScreenY - _preloadY);
-
- var endX:int = (nowScreenX + _preloadX > _row ? _row : nowScreenX + _preloadX);
- var endY:int = (nowScreenY + _preloadY > _col ? _col : nowScreenY + _preloadY);
-
- for(var xx:int = startX; xx < endX;xx++){
- for(var yy:int = startY; yy < endY;yy++){
- if(xx == nowScreenX && yy == nowScreenY){
- continue;
- }else{
- loadScreenImage(xx,yy);
- }
- }
- }
- }
- //加载指定屏的地图图片
- private function loadScreenImage(screenX:int,screenY:int):void{
- var starX:int = _screenImageRow*screenX < 0 ? 0 : _screenImageRow*screenX;
- var starY:int = _screenImageCol*screenY < 0 ? 0 : _screenImageCol*screenY;
- var endX:int = _screenImageRow*(screenX+1) > _row - 1 ? _row -1 : _screenImageRow*(screenX+1);
- var endY:int = _screenImageCol*(screenY+1) > _col-1 ? _col-1 : _screenImageCol*(screenY+1);
- for(var yy:int=starY;yy
- for(var xx:int = starX;xx
- var tempKey:String = yy+"_"+xx;
- if(!_loadingMap.containsValue(tempKey) && !_imageMap.containsKey(tempKey)){
- _waitLoadingArr.push(tempKey);
- }
- }
- _waitLoadingArr.reverse();
- loadImage();
- }
- }
-
- private function loadImage():void{
- if(_waitLoadingArr.length > 0){
- for(var i:int = 0;i<_loadingNo - _loadingMap.size();i++){
- var key:String = _waitLoadingArr.pop();
- var imageLoader:ImageLoader = new ImageLoader();
- var fileName:String = Config.getValue("mapLib") + _map.name +"/" + key + ".jpg";
- // trace("fileName:" + fileName);
- _loadingMap.put(imageLoader,key);
- imageLoader.addEventListener(Event.COMPLETE,loadScreenImageSuccess);
- imageLoader.addEventListener(ProgressEvent.PROGRESS,loadingHandler);
- imageLoader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- imageLoader.load(fileName);
- }
- }
- }
-
- //成功加载某屏的图片
- private function loadScreenImageSuccess(evet:Event):void{
- var imageLoader:ImageLoader = ImageLoader(evet.target);
- var tempStr:String = String(_loadingMap.getValue(imageLoader));
- var tempStrArr:Array = tempStr.split("_");
- var yy:int = tempStrArr[0];
- var xx:int = tempStrArr[1];
- _loadingMap.remove(imageLoader);
- var image:Bitmap = new Bitmap(imageLoader._data);
- image.x = _sliceWidth*xx;
- image.y = _sliceHeight*yy;
- this.addChild(image);
- _imageMap.put(yy+"_"+xx,image);
- imageLoader.removeEventListener(Event.COMPLETE,loadScreenImageSuccess);
- imageLoader.removeEventListener(ProgressEvent.PROGRESS,loadingHandler);
- imageLoader.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- imageLoader = null;
- loadImage();
- }
- //卸载指定屏的地图图片
- private function removeScreenImage(screenX:int,screenY:int):void{
- var startX:int = (screenX - _preloadX < 0 ? 0 : screenX - _preloadX);
- var startY:int = (screenY - _preloadY < 0 ? 0 : screenY - _preloadY);
-
- var endX:int = (screenX + _preloadX > _row ? _row : screenX + _preloadX);
- var endY:int = (screenY + _preloadY > _col ? _col : screenY + _preloadY);
- var keyArr:Array = _imageMap.keys();
- for(var i:int = 0;i < keyArr.length;i++){
- var key:String = keyArr;
- var tempStrArr:Array = key.split("_");
- var yy:int = tempStrArr[0];
- var xx:int = tempStrArr[1];
- if(xx < startX*_screenImageRow || xx > endX * _screenImageRow || yy < startY*_screenImageCol || yy > endY*_screenImageCol){
- var image:Bitmap = Bitmap(_imageMap.getValue(key));
- this.removeChild(image);
- image = null;
- _imageMap.remove(key);
- }
- }
- HeptaFishGC.gc();
- }
-
- //检查是否需要加载
- public function checkLoad(pointoint):void{
- var nowX:int = Math.floor(point.x/_sliceWidth);//现在所处的索引X
- var nowY:int = Math.floor(point.y/_sliceHeight);//现在所处的索引Y
- var nowScreenX:int = Math.floor(nowX/_screenImageRow);//现在所处的屏索引X
- var nowScreenY:int = Math.floor(nowY/_screenImageCol);//现在所处的屏索引Y
- if(nowScreenX != _nowPlayerPoint.x || nowScreenY != _nowPlayerPoint.y){
- loadSliceImage(point);
- }
-
- }
- }
- }
发表评论
-
Flex 自动获取焦点 监听全局键盘事件
2010-11-27 16:51 981这是《Flex第一步》里面一个朋友问我的问题,特此拿出分享一下 ... -
在接口中定义属性引起的An internal Builder Error错误
2010-11-12 21:24 753今天调试程序时,出现An internal Builder ... -
Label鼠标移上显示手形
2010-11-10 21:03 848软件编程牛人网 要想鼠标在Label上显示为手型, ... -
解决MovieClip打印问题 转
2010-11-08 17:57 1649困扰我多天的MovieClip打印问题终于解决了,这就实现了P ... -
flex 3 从页面url中取参数取值的完美解决方案
2010-11-04 16:04 603在家上网赚钱更容易 1:当用http://xxxxx/xx ... -
汉字转为16进制的unicode
2010-11-04 12:28 1292在家上网赚钱更容易 Flex引入外部字体时使用unicode ... -
Flex内存监测及优化技巧
2010-11-04 12:27 829在家上网赚钱更容易 ... -
FlashPlayer垃圾回收机制
2010-11-04 12:26 863在家上网赚钱更容易 ... -
Flex 数据易犯错误: 常见误用和错误
2010-11-03 21:51 684在家上网赚钱更容易 忘记解除和承担内查泄漏风险 ... -
Flex ComboBox中的Tree itemRender ClassFactory 实现
2010-11-01 20:36 1016想要实现ComboBox下来出来一颗树,用itemR ... -
ComboBox与itemRenderer
2010-11-01 20:34 767转自:http://hi.baidu.com/half_c ... -
修改ScrollBar的ScrollTrack高度
2010-11-01 18:18 1026<?xml version="1.0" ... -
去掉ScrollBar的两个箭头
2010-10-29 18:33 790在样式中加入下面两行upArrowSkin: ClassRef ... -
VerifyError: Error #1033: Cpool 项 246 类型错误
2010-10-28 12:24 2544在家上网赚钱更容易 最近,由于项目需要,安装了flash b ... -
用jsfl 扩展你的 flash
2010-10-27 15:19 780为什么要学习jsfl? 作为一个有些经验的FLASH开发 ... -
Flash编辑下使用的语言--JSFL
2010-10-27 15:19 1213JSFL概述 JSFL是在Flash编辑环境下使用 ... -
JSFL与Flash的完美结合
2010-10-27 15:18 1196作为一个有些经验的Flas ... -
flash as3 GUID UUID 生成类
2010-10-26 10:24 846package { import flash.dis ... -
flex里创建uuid的方法
2010-10-26 10:23 885import mx.utils.UIDUtil;var ... -
应用DataGrid项双击事件
2010-10-26 09:15 950软件编程牛人 默认Flex不使用双击事件 如需使用可 ...
相关推荐
Flex地图编辑技术主要涉及到使用Adobe Flex这一开源框架与Esri的ArcGIS Server相结合,实现对地理信息系统的交互式编辑功能。在GIS应用中,地图编辑是核心部分,它允许用户创建、修改和管理地理空间数据。下面将详细...
8. **性能优化**:在大规模数据展示或复杂交互时,需要注意性能优化,如延迟加载、分块加载地图数据,以及合理设计数据结构和算法。 9. **响应式设计**:考虑不同设备和屏幕尺寸,确保应用在手机、平板和桌面等不同...
7. **优化性能**:在处理大量数据或复杂操作时,合理利用缓存、分块加载和异步处理等技术可以提高应用的性能。 在实际开发过程中,可能还需要关注一些问题,比如地图的版权显示、兼容性测试、错误处理等。通过不断...
在这种场景下,"flex 中图片做地图"通常指的是利用Flex技术进行地图分块加载,以提高应用性能和用户体验。地图分块加载是一种优化策略,通过只加载用户可视区域内的地图部分,降低内存占用并加快加载速度。 首先,...
此外,你还可以学习到如何优化性能,如延迟加载、分块加载大图层,以及如何利用缓存提高用户体验。 总的来说,"flex地图应用开发教程及项目源代码"提供了一个学习Flex地图开发的宝贵资源。通过实践这些示例和代码,...
在Flex中,可以使用Loader类加载地图图像,并通过BitmapData对象处理图像的切片和拼接,以实现地图分块加载。 2. **地图分块加载**:地图分块加载是一种优化技术,尤其适用于大型地图。它只加载当前可视区域的地图...
这可以通过分块加载地图数据、使用瓦片地图服务、以及合理设置地图的可见范围来实现。 8. **自定义样式和皮肤**:Flex允许开发者通过CSS或MXML来定制`Map`组件的外观,包括地图控件的样式、颜色、字体等,以匹配...
7. **优化性能**:在处理大量数据时,考虑使用分块加载(Clustering)技术,以提高地图的性能和用户体验。这通常涉及到对地图覆盖物(Overlays)进行管理和分组。 8. **部署与测试**:最后,将你的Flex应用打包成...
天地图的切片服务是一种将地图分块存储的方式,每个小块称为一个切片,通常为JPEG或PNG格式。这种分块方式有利于提高地图加载速度和优化网络传输。在ArcGIS for Flex中,我们可以通过扩展类来定制对这些切片的读取和...
4. **数据加载与异步通信**:E都市地图的图像通常是分块加载的,这需要用到HTTPService或WebService组件进行异步数据请求。开发者可能使用URLLoader类加载图片,并通过BitmapData对象将图片加载到舞台上。 5. **...
我们将讨论如何合理缓存地图数据,使用分块加载技术,以及优化地图渲染策略,提高应用的响应速度和用户体验。 在学习过程中,你可能需要用到像Flex Builder这样的开发环境,以及ArcGIS Desktop和ArcGIS Server来...
7. **缓存和性能优化**:对于大规模数据和高并发场景,ArcGIS for Flex支持离线缓存和分块加载策略,以提高应用的性能和响应速度。 8. **地图渲染和样式控制**:通过设置Symbology,开发者可以自定义地图的颜色、...
8. **性能优化**:通过缓存机制和分块加载策略,提高了大范围地图和大量数据的加载速度。 9. **扩展和自定义**:ArcGIS Flex API 1.2允许开发者根据需求自定义控件和样式,扩展功能以满足特定应用的需求。 10. **...
6. **异步处理和性能优化**:处理大量点数据可能影响应用性能,因此需要考虑异步加载和分块加载策略。同时,通过缓存和批处理技术,可以减少网络通信和计算负载。 7. **数据可视化**:为了使聚合效果更直观,可以...
7. **性能优化**:源代码还包含了性能优化的策略,例如缓存机制、异步加载和分块加载等,这可以帮助开发者在处理大量数据或高并发访问时提升应用性能。 通过对"arcgis-viewer-flex-3.7-src"源码的深入学习,开发者...
1. 分块加载:为了提高大地图的加载速度,API支持分块加载,只加载可视区域内的数据。 2. 图层缓存:预加载常用图层或数据,减少网络延迟。 3. 图层透明度控制:优化内存使用,通过调整图层透明度减少同时加载的图层...
可以采用分块加载或懒加载策略,只加载当前可视区域的图片部分,提高应用的响应速度。 7. **用户体验**:为了提供良好的用户体验,还需要考虑图片加载的动画效果、缩放平滑性、边界检测等细节,确保用户在操作过程...
以GeoFlex为例,这个库提供了读取和解析Shapefile的功能,并能将其数据映射到Flex地图控件上的图形对象。 1. **集成GeoFlex库**:首先,你需要将GeoFlex库导入到你的Flex项目中,可以通过添加库的SWC文件到类路径,...
地图通常以分块的形式存储,玩家移动到新区域时,只加载相应区块的地图数据,从而实现平滑的用户体验。 “MapDemo”作为压缩包内的一个文件,很可能是演示地图动态加载功能的示例代码。开发者可以通过分析MapDemo的...
- **动态图层的分块加载**:减少初始加载时间,提高用户体验。 - **LOD(级别细节)管理**:根据地图缩放级别自动调整图层的细节水平。 8. **地图服务的扩展**: - **WMS与WFS兼容**:ArcGIS API还可以与其他...