最近一直在做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)的更多相关文章

  1. cocos2dx使用TiledMap创建斜45度地图场景

    做游戏,场景是一个很重要的部分,如果缺少这一步,很难做出好的游戏,对于cocos2dx来说,有很多2D的地图编辑器可以用,效果都还可以,其中Tiled是支持的比较好的,它支持Tiled编辑出来的几种模 ...

  2. ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案

    原文:ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案 根据实际JPG图片进行配准后,发布的地图,利用ArcGIS API for Silverlight在网页 ...

  3. mir9-lua——《热血沙城》45度ARPG手游-Lua移植版

    mir9——<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quic ...

  4. APP-4-百度地图定位

    APP-3-百度地图应用 需要根据上一步完成百度地图应用的测试,本文介绍Hbuilder通过MUI框架完成百度地图的定位. 1.代码部分 <!DOCTYPE html> <html& ...

  5. HTML5 Canvas 绘制旋转45度佛教万字

    效果如下: 代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Cont ...

  6. 高德地图API中折线polyline不能跨越180度经度线的解决方案

    1.问题 最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数.但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示: 图中有三个 ...

  7. 转:使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案

    起因设计要求视频控制面板显示在视频界面上,如下图红框内所示.但是因为object不在文档流之中,所以不论别的元素设置z-index多高,都只会被object元素遮住而无法看到.object元素代码如下 ...

  8. 【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新

    IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽IOS百度地图开发POISearch搜索附近停车场,附近加油站IOS百度地图视角跳到用户当前位置IOS百度地图开发实时路况IOS开发百 ...

  9. vue-百度地图-maker文字标签显示隐藏

    html: <div id="allmap" class="map"></div>   script:   mounted() { th ...

随机推荐

  1. lintcode:二叉树的中序遍历

    题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 ...

  2. *[hackerrank]Volleyball Match

    https://www.hackerrank.com/contests/w1/challenges/volleyball-match 此题不错,首先可以看出是DP,S(x, y)= S(x - 1, ...

  3. HTML5入门十---Canvas画布实现画图(一)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. Linux磁盘管理命令

    1.磁盘分割: fdisk [root@linux ~]# fdisk [-l] 装置名称 参数: -l :输出后面接的装置所有的partition内容.若仅有fdisk -l时, 则系统将会把整个系 ...

  5. C# 任意类型数据转JSON格式(转)

    HOT SUMMER 每天都是不一样,积极的去感受生活 C# 任意类型数据转JSON格式 /// <summary> /// List转成json /// </summary> ...

  6. 41. First Missing Positive

    题目: Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2 ...

  7. Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  8. 如何用Maven创建一个普通Java项目

    一下内容包括:用Maven创建一个普通Java项目,并把该项目转成IDEA项目,导入到IDEA,最后把这个项目打包成一个jar文件. 有时候运行mvn命令失败,重复运行几次就OK了,无解(可能因为网络 ...

  9. Android使用Fragment程序崩溃

    调用Fragment的Activity要继承并实现Fragment.OnFragmentInteractionListener

  10. Android开发之网络请求HttpURLConnection

    转:http://blog.csdn.net/guolin_blog/article/details/12452307 Android中主要提供了两种方式来进行HTTP操作,HttpURLConnec ...