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 ...
随机推荐
- (转)Spring的编程式事务例子
纯JDBC操作, 对某些项目来说, 也许更好, Spring JDBC Framework让你不用关心Connection, Statement, ResultSet. 定义数据源 spring事务编 ...
- ios开发之 MPMoviePlayerController 视频播放器
MPMoviePlayerController 与AVAudioPlayer有点类似,前者播放视频,后者播放音频,不过也有很大不同,MPMoviePlayerController 可以直接通过远程UR ...
- ActiveMQ之消息指针
消息指针(Message cursor)是activeMQ里一个非常重要的核心类,它是提供某种优化消息存储的方法.消息中间件的实现一般都是当消费者准备好消费消息的时候,它会从持久化存储中一批一批的读取 ...
- Android新版本SDK打开旧版本项目报错解决
1.Description Resource Path Location Type Unable to resolve target 'android-19 解决:打开project.properti ...
- Html,Css,Javascript及其他的注释方法详解
一.HTML的注释方法<!-- html注释:START -->内容<!-- html注释:END --> 包含在“<!--”与“-->”之间的内容将会被浏览器忽略 ...
- 抽象工厂在ADO.Net中的应用
https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...
- Android开发之通过反射获取到Android隐藏的方法
在PackageManger中,有些方法被隐藏了,无法直接调用,需要使用反射来获取到该方法. 比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,Co ...
- MyBatis学习总结(5)——实现关联表查询
一对一关联 提出需求 根据班级id查询班级信息(带老师的信息) 创建表和数据 创建一张教师表和班级表,假设一个老师负责教一个班,那么老师和班级之间的关系就是一对一的关系. create table t ...
- 打开一个已经写好的Android studio工程的方法
- 【笨嘴拙舌WINDOWS】编码历史
在介绍历史之前,有必要将一个经常使用的词语"标准"解释一下: " 标准是"为了在一定的范围内获得最佳秩序,经协商一致制定并由公认机构批准,共同使用的和重复使用的 ...