45度地图遮挡问题解决方案(cocos2d-x)
最近一直在做45度斜视角游戏,也就是isometric等容地图,俗称2.5D。地图上物体的前后遮挡是我遇到的第一个问题,总结一下处理方法。
遮挡问题(不知道术语),就是比如一个角色站在树后面,那么树要遮挡住角色的一部分,我是用实时修改zorder实现的。
1. 制作地图
用Tiled制作45度地图时,物体如何放在地图上有2种方法:
1.1 标记法:在地图对象层上标记出对象,并且指定该对象的类型。游戏加载地图时,遍历所有的对象,根据其类型,生成不同的精灵:主角、NPC、城墙、建筑等。生成的时候把zorder设置成该精灵所在的瓦块坐标的x分量和y分量之和。比如城墙在(10,20)这个瓦块上,那么其zorder就是10+20=30。
1.2 分层法:直接把物体画在layer上。思路是地图分为多层。假如地图x方向有m格,y方向有n格,那么地图要分成m+n-1层(正对屏幕,距离眼睛最近的一排瓦块是第m+n-1层,最远的时第1层)。这么分的原因是,每层的zorder都不同,第n层的zorder是n,所以就实现了离眼睛近的物体遮挡离眼睛远的物体。这个方法非常麻烦,不过能解决问题。把所有物体都放在同一层上,然后加载时特殊处理,肯定也能解决,以后再研究。
2. 角色移动
角色移动的时候,要在setPosition的同时修改zorder,示例代码如下:
virtual setPosition(const CCPoint& pos) {
// 调用基类的setPosition
CCSprite::setPosition(pos);
// 计算当前位置的瓦块坐标
_tilePos = _map->realPosToTilePos(getPosition());
// 计算新的zorder
int tileZorder = tilePos.x + tilePos.y;
// 修改zorder
setZOrder(tileZorder);
}
这样,角色移动的时候,就能在不同的物体间相互遮挡了。
3. 大型建筑
采用标记法时,如果放置的物体是城墙,刚好占一个瓦块,则很容易处理。如果放置的物体是建筑,要占多个瓦块时,需要特殊处理:
3.1 我们在Tiled中标记出建筑的位置是(x,y),在代码中生成建筑时,其纹理(菱形)的顶点位置就在(x,y),这个是框架自己处理的。
3.2 根据建筑图片的宽,计算出该建筑占几个瓦块,要在导航图把这些瓦块都标记成“障碍”,否则自动寻路时会穿过建筑。
3.3 假如建筑的占的瓦块数是m*m,那么建筑的zorder是x+m/2+y+m/2,即建筑中心瓦块的zorder。
这样角色在建筑附近走动时就可以自然遮挡了。
4. 角色被挡住时显示透明轮廓
当角色走到障碍后面时,会被遮盖掉一部分甚至全部,这样不利于玩家识别角色。我想了一个浪费资源但是简单的方法:
即每个角色都有一个轮廓精灵,这个精灵和角色的大小相同、纹理相同、位置也相同。不同的是轮廓精灵是透明的而且zorder最高。所以当角色没有被遮盖时,轮廓精灵被角色覆盖,是看不见的,当角色被遮盖时,因为轮廓精灵的zorder最高,所以就能显示出一个透明的角色。
这个方法确实浪费资源,本来70M+的内存编程80M+,而且如果角色使用了骨骼动画可能就不行了。肯定有更好的方法,以后再研究。
45度地图遮挡问题解决方案(cocos2d-x)的更多相关文章
- cocos2dx使用TiledMap创建斜45度地图场景
做游戏,场景是一个很重要的部分,如果缺少这一步,很难做出好的游戏,对于cocos2dx来说,有很多2D的地图编辑器可以用,效果都还可以,其中Tiled是支持的比较好的,它支持Tiled编辑出来的几种模 ...
- ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案
原文:ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案 根据实际JPG图片进行配准后,发布的地图,利用ArcGIS API for Silverlight在网页 ...
- mir9-lua——《热血沙城》45度ARPG手游-Lua移植版
mir9——<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quic ...
- APP-4-百度地图定位
APP-3-百度地图应用 需要根据上一步完成百度地图应用的测试,本文介绍Hbuilder通过MUI框架完成百度地图的定位. 1.代码部分 <!DOCTYPE html> <html& ...
- HTML5 Canvas 绘制旋转45度佛教万字
效果如下: 代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Cont ...
- 高德地图API中折线polyline不能跨越180度经度线的解决方案
1.问题 最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数.但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示: 图中有三个 ...
- 转:使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案
起因设计要求视频控制面板显示在视频界面上,如下图红框内所示.但是因为object不在文档流之中,所以不论别的元素设置z-index多高,都只会被object元素遮住而无法看到.object元素代码如下 ...
- 【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽IOS百度地图开发POISearch搜索附近停车场,附近加油站IOS百度地图视角跳到用户当前位置IOS百度地图开发实时路况IOS开发百 ...
- vue-百度地图-maker文字标签显示隐藏
html: <div id="allmap" class="map"></div> script: mounted() { th ...
随机推荐
- 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片
李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片 源码: // // ViewController.m // 08-九宫格扩展 // // Created by 李洪强 ...
- lintcode:Compare Strings 比较字符串
题目: 比较字符串 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 样例 给出 A = "ABCD" B = "ACD" ...
- C#调用Win32 api学习总结
从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...
- java获取当前操作系统的信息
java获取当前操作系统的信息 JavaOS虚拟机UnixEXT 从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...
- 开源调度框架Quartz最佳实践
开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...
- mysql字符串区分大小写的问题
一.1. CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的: SELECT * FROM TABLE NAME WHERE n ...
- linux PATH环境变量
$PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接 shell下输出path值: echo $PATH: w ...
- What's New for Visual C# 6.0
https://msdn.microsoft.com/en-us/library/hh156499.aspx nameof You can get the unqualified string nam ...
- tomcat web.xml配置
关于Tomcat 中 web.xml 文件的配置问题: 1.下面的配置是合法的 <servlet> <servlet-name>test</serv ...
- unique() 去重函数
unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...