从零开始重写KOK1(万王之王1) —— (2)优化地图加载

原创 2011年01月20日 14:48:00

本来想在第2篇说明物体遮挡与寻路的开发过程,但是因为我把这问题想简单了,现在已经完成了遮挡与寻路,但是中间的过程非常多,第一篇文章的系统结构需要做一些修改才可以,这里先说一下地图加载的相关问题。

 

首先是效果图:

KOK1 DEMO寻路

 

可直接运行版本下载:>>点击进入下载页<<

 

在第一篇文章《从零开始重写KOK1(万王之王1) —— (1)让人物可在地图上使用鼠标跑动》中,地图是这样的过程加载的:

1. 在Map对象初始化时将每个小图个加载到一个整体的大地图中,如图:

老地图管理器原理

2. 在玩家位置作出修改后,也修改屏幕矩形左上角的位置,因为玩家是在中间,所以要维持屏幕的x,玩家的x - 1/2屏幕宽,纵向同理。

以下是Player类的Move()中的代码,用来调整屏幕矩形的位置:

3. 要限制住玩家的位置,不能够使得屏幕矩形超出世界地图。在老的地图管理器是这样做的,限制玩家的目的坐标,不可以小于屏幕宽的一半,不可以大于世界地图宽度 - 屏幕宽的一半,纵向同理。这样就不会出现屏幕画地图外的情况了。但这样做就使得实际地图的内容小于了现在世界地图的大小,因为要在世界地图四周补上一圈黑色的贴图,这样玩家才知道到达了地图的边界。文字上可能不好理解,请看下图:

老地图管理器边界

这个图假定玩家走到了地图的右下角,因为屏幕矩形(蓝色框)不能超过世界地图,所以要在世界地图里面加这么一圈灰色的作为边界的纹理,所以也就说,实际的地图就比这个地图Data存放的要小了,这显然不是我们想要的。而且最重要的问题是,当地图非常之大时,这个超大的地图表面将占用巨大的显存或内存。

 

那么我们想要的地图管理器的目标就是:

——整个地图Data就是实际的地图,不包括边界纹理,当因为玩家的移动而导致屏幕矩形超出了地图范围时,自动补黑色。

 

要实现这种效果可以想到这种方法:地图表面大小= 屏幕大小,每一帧重画应当出现的地图块。但问题也随之而来,我们要在每1帧都去画一遍视窗内的地图,效率不高。那不如我们每次画一个区域的地图,当屏幕在这个区域内就不重画,而是裁剪适当的位置,当超出这个区域时,重新生成新区域,并且剪裁适当的地图,如下图:

新地图管理器

总结一下:

1. 首先确定屏幕矩形在当前地图表面内,在则不重画,直接剪裁适当位置,如果不在,进入2。

2. 重新绘制地图表面,根据屏幕矩形,计算地图表面中的每个小块:

    2.1 如果不在世界地图中,不处理,因为默认就是黑色。

    2.2 如果在,则计算是哪块世界地图,将适当的地图块话在这里。

3. 重新绘制后,剪裁适当的位置,画在离屏表面上。

 

下面贴出代码:

Map.h

 

Map.cpp

 

下面给出整个项目源码,因为最近的研究是一系列的,所以这个版本的源码已经有了遮挡、寻路等功能,但是后面的功能不影响Map的代码。

下载地址:>>点击进入下载页<< 资源分是1,有兴趣的朋友下吧:)

百度地图优化方法

优化百度地图本地商户排名的方法汇总:   第一:停留时间   百度地图浏览量高,但是停留时间短也会使排名变下降,如果停留时间长,那么百度地图排名就会越好。   第二:标签   ...
  • qq_18539137
  • qq_18539137
  • 2014年08月01日 14:27
  • 859

SuperMap iObject常见问题解答集锦(九)

SuperMap iObject常见问题解答集锦
  • supermapsupport
  • supermapsupport
  • 2016年08月17日 11:49
  • 2099

Git 学习进阶篇-重写历史记录

Git 重写历史记录涉及命令:#git commit -amend #git rebase #git reset git commit –ament如果刚进行提交操作,发现提交信息写错了,或者还需要...
  • Louislip
  • Louislip
  • 2016年11月20日 22:45
  • 971

Openlayers之加载谷歌地图

1、谷歌地图瓦片构成 我们用浏览器打开谷歌地图,然后按下F12键,查看网络资源中的地图瓦片,可以发现瓦片URL中变化的部分为1i、2i和3i后面的数字,经过分析可以知道1i后面的应该是瓦片的级别,2i...
  • SmileCoffin
  • SmileCoffin
  • 2017年06月05日 09:23
  • 1426

Oracle的子查询优化之二

续:Oracle的子查询优化之一 三 EXISTS子查询的支持 SELECT * FROM t1 WHERE t1.a1 =(SELECT floor(avg(t2.a2)) FROM t2 WH...
  • fly2nn
  • fly2nn
  • 2017年03月13日 19:07
  • 153

ArcGIS地图设计性能优化

制作一幅较高性能的地图检查如下方面是否注意到了 ?1 内容组织:· 空间参考/Spatial Reference在ArcMap中配置地图文档,要尽可能将所有数据与数据框使用相同的空间参考,特别是编辑或...
  • kikitaMoon
  • kikitaMoon
  • 2015年06月26日 11:53
  • 3343

家园2简易地图编辑器

鉴于网上
  • ziggo26
  • ziggo26
  • 2014年07月15日 16:09
  • 2401

扫雷——1.第一步不炸死2.坐标周围没雷,可以实现展开

game.h#ifndef __GAME_H__ #define __GAME_H__ #include #include #include #define ROW 9 #define COL ...
  • Moralin_
  • Moralin_
  • 2017年12月13日 22:39
  • 45

内存优化---Bitmap优化

如何加载一个Bitmap     Bitmap在Android中指的是一张图片,可以使PNG格式也可以是JPG等常见的其他图片的格式。Android提供了四类方法加载Bitmap:decodeFile...
  • u012810020
  • u012810020
  • 2016年06月21日 18:39
  • 1685

Lucene底层原理和优化经验分享(2)-Lucene优化经验总结

系统优化遵从木桶原理:一只木桶能盛多少水,并不取决于最高的木板,而取决于最短的那块木板。Lucene优化也一样,找到性能瓶颈,找对解决方法,才能事半功倍,本文将从三方面阐述我们的Lucene优化经验:...
  • njpjsoftdev
  • njpjsoftdev
  • 2017年01月06日 09:21
  • 3915
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从零开始重写KOK1(万王之王1) —— (2)优化地图加载
举报原因:
原因补充:

(最多只允许输入30个字)