cocos2d-x3.2总结(三)TMXTileMap::getContentSize与getMapSize*getTileSize的积的异同

cocos2d-x getContentSize和getContentSizeInPixels区别 NULL 博文链接:https://buerkai.iteye.com/blog/1545142 立即下载

   当你在图层中导入瓦片地图后,要计算触摸点在瓦片中的GID时,要使用公式1,还是公式2?接下来,我将讲解他们的异同和我们最终使用的公式。

    Point  position=convertToNodeSpace(touch->getLocation());

   公式1:x=position.x/map->getContentSize().width * map->getMapSize().width;

                y=map->getMapSize().height  -   position.y/map->getContentSize*map->getMapSize().height;

                bgLayer->getTileGIDAt(Point(x,y));

   公式2:x=position.x / map->getTileSize().width;

                y=(map->getMapSize().height * map->getTileSize().height - position.y) /  map->getTileSize().height;

                bgLayer->getTileGIDAt(Point(x,y));

   我以cocos2d-x官网上的一个原创教程--《Cocos2d-x塔防游戏 -- 贼来了》为讲解的实例,这是因其代码有我讲解所需要的全部影响因素,我集中精力讲解计算公式的异同而不是花更多的时间在写出例子上。 

    下载地址:https://github.com/iTyran/thiefTD/tree/part2

    我们要清楚瓦片地图GID坐标系和cocos2d-x位置的坐标系是不同的。其中瓦片地图GID是以左上角为原点,向下为y轴正方向,向右为x轴正方向,且以你建立地图时的每一块高度和宽度的乘积为一个计算单位。瓦片地图GID坐标系如图1,cocos2d-x位置坐标系如图2。

       图1:

    


    图2:

    

    从图1和图2中可以看出,cocos2d-x坐标中的y轴和瓦片地图中的y轴方向相反,且cocos2d-x中的坐标要转换为GID要分别除以瓦片中块的宽度和高度,得出以块为单位的位置。

    接着,我们来看看TMXTileMap中的函数用法。getTileSize().width/height分别以像素为单位得出一块的宽度和高度。getMapSize().width/height分别得出在x轴方向上总的块数,在y轴方向上总的块数。所以,getTileSize().width/

height * getMapSize().width/height分别得出在x轴上原始地图的总宽度和在y轴上原始地图的总高度。

    接下来我们来看看getContentSize()在cocos2d-x中源代码的注释“Returns the untransformed size of the node",中文意思就是返回没有被转变前的节点大小。但是,我在”贼来了“源码中调试得出getContentSize()意思是转变后的大小。我想是cocos2d-x中的注释是错的,估计是在transformed前面多加了un。这个调试过程在后面有讲解。

    现在,我们在PlayLayer.cpp中的init()函数中添加代码1进行调试,调试结果如图3。

    代码1:

<span style="font-size:18px;">
//得到转换后的宽度大小
float testContentSizeWidth=map->getContentSize().width;

//得到转换后的高度大小
 float testContentSizeHeight=map->getContentSize().height;

//地图在x轴上总块数乘以每块在x轴上的宽度
float primarySizeWidth=map->getMapSize().width * map->getTileSize().width;
/地图在y轴上总块数乘以每块在y轴上的高度
float primarySizeHeight=map->getMapSize().height * map->getTileSize().height;</span>
      图3:

 

  从图3中可以看出,testContentSize.Width/Height与primarySizz.Width/Height的值都不同。这里有两个问题。问题1,我们怎么就知道primarySize.Width/Height的值就是原始地图的宽度和高度?问题2,为什么testContentSize.Width/Height与primarySizz.Width/Height的值都不同。

  对于问题1,我们可以打开Resources\height_864\map.tmx,在这个文件中有一下的信息。

<span style="font-size:18px;"><map version="1.0" orientation="orthogonal" width="16" height="9" tilewidth="96" tileheight="96"></span>
  也就是说这个地图x轴方向上有16块,y轴方向上有9块。每块的宽度为96,高度为96。所以16*96=1536,也就是

primarySizeWidth的值了。9*96=864,也就是primarySizeHeight的值了。

  对于问题2,如果你对cocos2d-x分辨率适配不了解的话,理解起来有点困难。你可以先阅读《Cocos2d-x 多分辨率适配完全解析》。现在我们可以在AppDelegate.cpp中的applicationDidFinishLaunching()看到代码2。

   代码2:

<span style="font-size:18px;">    
   glview->setDesignResolutionSize(480.0f, 320.0f, ResolutionPolicy::FIXED_HEIGHT);
    std::vector<std::string> searchPath;
    searchPath.push_back("height_864");
    CCFileUtils::getInstance()->setSearchPaths(searchPath);
    director->setContentScaleFactor(864.0f / 320.0f);</span>

   从代码2中可以看出源码设置了设计分辨率为(480.0f,320.0f),且ResolutionPolicy为FIXED_HEIGHT,也就说要保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度。所以就有变化因子为地图高度除以设计分辨率的高度,即864.0 / 320.0=2.7。那我们又怎么样知道是放大还是缩小?由于地图原高度为864.0,而设计分辨率的高度320.0,明显为缩小,也就是说scalefactor大于0则为缩小,小于0则为放大。所以地图的原始宽度和高度都要除以这个比例,1536  /  2.7=568.8888  , 864 / 2.7=320,以上这两个值分别是getContentSize().width/height,所以说getContentSize得到的值是地图原始大小转变后的值,所以我说cocos2d-x的注释是错的。具体的转换过程如图4。

    图4:

  
    在图4中,1137.7778是怎么得出来的?如果你看了《Cocos2d-x 多分辨率适配完全解析》大概就明白了。这里直接给出计算过程1536/ (864/320)  / (320/640) =1137.7778,1137.7778是cocos2d-x最终把地图按比例绘制屏幕上的宽度。而getContentSize.width/height得到的是Design solution下的大小。
    那什么情况下getContentSize会得到地图原始的大小?如果你没有设置设计分辨率和变化因子,getContentSize得到的则是地图原始的大小。我们将代码2中的glview->setDesignResolutionSize(480.0f, 320.0f, ResolutionPolicy ::FIXED_HEIGHT)和director->setContentScaleFactor(864.0f / 320.0f)注释。再次调试,结果如图5。没有设置分辨率效果如图6,设置分辨率效果如7。

   图5:

  

   图6:

   

   图7:

  

   从图5中可以看出,如果没有设置设计分辨率和变化因子,则getContentSize得到的值就是地图原始的大小。coco2d-x在屏幕上显示的地图也是原始的大小即没有按比例放大或缩小绘制。

  从图6和7中可以看出,设置分辨率后,瓦片地图上的图形经过比例上的缩小以保持地图原始高度能完全呈现出来,地图原始宽度则有些超出了屏幕的范围,屏幕上的显示就是图4中screen resolution。转换的过程如图4所示。

   有了以上的讲解后,现在我们回到公式1和公式2的分析来。公式1中,position.x除以getcontentSize.width,得出

的是position.x相对于转换或者转换的比例为1的地图宽度的比例,再乘以x轴方向上的块数就可以得出以块为单位的x坐标。公式2中position.x直接除以每一块的宽度得出以块为单位的x坐标,注意getTileSize().width是地图原始的宽度,而position.x的值是相对于地图按比例缩放后的值。如果没有设置设计分辨率和变化因子,则公式1和公式2得出的x的值都准确且相等的。如果设置了,则公式1得出的值是准确,而公式2得出的值是不准确的。

   对于y轴上的分析如上,不过要注意瓦片坐标的y轴和cocos2d-x坐标的y轴方向相反。

   经过以上的分析,最后得出总结。无论我们有没有设置分辨率,公式1得出的结果都是准确的。公式2在设置分辨率的情况下得出的结果是错误的(排除设置的分辨率就是地图的宽高)。所以,我们最好在计算GID时要使用公式1。

  如需转载,请标明出处:http://blog.youkuaiyun.com/cbbbc/article/details/38408321

宽带阻抗匹配的工程实现-第一步,端口驻波仿真 其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易,想做出来太难了。所以准备写一些文章,记录一下碰到的问题。 阅读详情

相关推荐

Golang实现企业级AI智能体安全合规自动化检测系统

需求:自动化解析欧盟AI法案、中国网络安全法、美国NIST框架等多国法规,提取具体合规要求并映射到企业技术实现。技术挑战法规文本非结构化,语义复杂,存在大量法律术语与技术术语交叉多语言支持(中文、英文、欧盟24种官方语言)法规动态更新(平均每季度更新2-3次)架构创新性:提出了"规则引擎+AI模型+实时监控"的混合架构,兼顾了合规要求的明确性与智能体行为的动态性。性能突破:通过Golang协程、多级缓存、数据库优化等技术,实现了12,800 req/s的高吞吐量和38ms的低延迟。准确性提升。

shao.bing的专栏 722

Cocos2d-x之getVisibleSize,getContentSize,boundingBox,getContentSizeInPixels,convertToGL,convertToUI

CCNode类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标 另一个关键问题就是在cocos2d-x里就是各种对象的大小问题。因为在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d-x里提

以现在的努力程度之低,谈狗屁的未来,屎的梦想!!! 3万+

MATLAB多项式计算

MATLAB多项式计算 在MATLAB中,n次多项式用一个长度为n+1的行向量表示(因为是n个幂次项系数加上一个常数项),缺少的幂次项系数为0。 例如 n次多项式: P(x)=anxn+an-1xn-1+an-2xn-2+…+a1x+a0 表示为: [an,an-1,an-2,…,a1,a0] 目录MATLAB多项式计算1.多项式的加减运算2.多项式的乘法运算3.多项式的除法运算4.多项式的导函数5.代数多项式求值6.矩阵多项式求值7.多项式求根 1.多项式的加减运算 事实上,多项式的加减运算就是其所对应的

路遥芝麻的博客 1万+

cocos2d-x 中 getContentSize

getContentSize 只有对精灵才能起到作用。尽管经常是 CCNode中包含一个CCSprite但是 CCNode的getContentSize是 0 0 所以需要通过CCSprite中获取出来

cjopengler的专栏 3179

5-DOF机械臂课程设计(一)之正逆运动学

文章目录基本要求基本概念关节坐标系的建立正运动学求解DH参数表的建立逆运动学求解多解下解的选取源码下载后续 基本要求 ​ 开发上位机程序,要求有良好的界面,能提供关节空间下和笛卡尔坐 标下表示的目标位姿点和中间若干经过点的输入功能,进行轨迹规划, 并控制机械臂沿轨迹运动,最终完成目标抓取的任务。 基本概念 连杆长度 :2个相邻关节轴线之间的距离 连杆扭角 :2个相邻关节轴线之间的角度 连杆偏距 :2个关节坐标系的X轴之间的距离 关节角度 :关节变量 计算时需要加初始角度偏移 关节坐标系的建立 ​ 根据《机

Rosen的博客 5857

三菱CNC数据采集实战:从SDK安装到C#代码调试全流程(附完整资源包)

本文为C#开发者提供了三菱CNC数据采集的完整实战指南。详细介绍了从获取并安装核心A2协议SDK、配置Visual Studio开发环境,到理解COM接口文档、封装C#通信类,并构建具备多设备连接与定时采集功能的WinForms应用程序的全流程。文章重点分享了网络调试、异常处理及性能优化等关键实战经验,帮助开发者高效打通工业自动化数据采集链路。

oauth7security的博客 707

getVisibleSize 和 getContentSize 和 getWinSize

getVisibleSize:获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。 getVisibleOrigin:获得可视区域的出发点坐标,在处理相对位置时,确保节点在不同分辨率下的位置一致。 在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在

雨月琉琉的专栏 1万+

从零搭建企业级AI网关:基于LiteLLM的安全防护体系设计

本文详细介绍了如何从零搭建企业级AI网关,基于LiteLLM构建全面的安全防护体系。内容涵盖分层防御架构、敏感数据处理、合规性配置与审计追踪,以及生产环境部署策略,助力企业安全高效地集成LLM技术,确保数据安全和合规性。

qq_27496129的博客 1291

cocos2dx 3.x getVisibleSize 和 getContentSize 和 getWinSize 和 getVisibleOrigin

getVisibleSize:获得视口(可视区域)的大小 getVisibleOrigin:逻辑区域的大小,比如为了适应屏幕时会等比例缩小或者放大,这个时候就可能在屏幕上出现 部分区域是空的(黑的),而此时的游戏画面的大小就是这个getVisibleOrigin。 getVisibleOrigin:逻辑区域大小的(0,0)点在屏幕上的位置,即getVisibleOrigin里面的(...

weixin_30834783的博客 352

Simulink仿真模块 - Data Type Conversion

Data Type Conversion将输入信号转换为指定的数据类型 在仿真库中的位置为: Simulink / 常用模块 Simulink / Signal Attributes 模型为: 说明 DataTypeConversion模块可将任何 Simulink®数据类型的输入信号转换为您指定的数据类型。 注意 要通过指定模块参数来控制输出数据类型,或者要从下游模块继承数据类型,使用DataTypeConversion模块。要...

jk_101的博客 2519

cesium单向流动线效果

在学材质的路上一去不复返了属实是,难也难在这。还请各位大佬多多指教~

就zhei? 689

Cocos2d-x 3.2总结(三) TMXTileMap::getContentSize与getMapSize*getTileSize的积的异同

 当你在图层中导入瓦片地图后,要计算触摸点在瓦片中的GID时,要使用公式1,还是公式2?接下来,我将讲解他们的异同和我们最终使用的公式。 1 Point  position=convertToNodeSpace(touch->getLocation()); 公式1: 1 2 3

jintingbo的专栏 929

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

cocos2d-x getVisibleSize、getContentSize、getWinSize函数

在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。 cocos2d::Size size1 = cocos2d::CCDirector::getInstance()-&gt;getWinSize(); float scaleX=size1.width/768; float ...

南风古 2730

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

cocos2dx 的基本概念 ContentSize/AnchorPoint/Bounds/Frame

转自:https://www.jianshu.com/p/c15c915d2e57 下图展示了bounds和frame的区别:

haima1998的专栏 400

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

cocos2dx[3.4](25)——瓦片地图TiledMap

【唠叨】还记得我们小时候玩的小霸王里面的游戏吗?大部分都是基于Tile地图的游戏,如坦克大战、冒险岛、魂斗罗、吞食天地等。而在手游中,基于瓦片地图的游戏也很常见。如:《保卫萝卜》。瓦片地图有专门的地图编辑器:Tiled Map Editor 。先给大家看个酷炫的图吧。此图来自:http://blog.csdn.net/aa4790139/article...

weixin_33936401的博客 3035

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

cocos2dx_实例分析getBoundingBox和getContentSize

1:分析BoundingBox. 首先来看这样一段代码,其中HelloWorld的图片大小为195*270 Node* pNode = Node::create(); addChild(pNode); Sprite* pSprite1 = Sprite::create(&amp;quot;HelloWorld.png&amp;quot;); pNode-&amp;amp;gt;addChild(pSprite1); Rect rt1 = pSpr...

qq_31480839的博客 4366

cocos 屏幕适配

1、适配模式     (1)ResolutionPolicy::EXACT_FIT    :拉伸变形,使铺满屏幕。     (2)ResolutionPolicy::NO_BORDER    :按比例放缩,全屏展示不留黑边。                                              (长宽中小的铺满屏幕,大的超出屏幕)     (3)ResolutionPo

zsl65326的专栏 1247

关于Cocosjs的TileMap动态添加障碍物的问题

最近利用工作之余在研究了下CocosJs,今天刚好看到TileMap,发现了一个问题,我在代码中无法随意添加图片到固定的Cell中,这里指的随意图片是在TileMap的图集之外的图片文件。 但如果要添加在图片集中的文件,那非常好做,用setTileGID即可, 如果不是图片集中的文件呢,而...

chundui7399的博客 773

Cocos2d-x 3.x getContentSize、getBoundingBox区别,灵活运用于碰撞检测

在很多碰撞检测中经常可以看到它,getContentSize,还有它getBoundingBox的影子。为了具体搞清楚这些细节的东西,写了点代码,测试下。如下图   给一个精灵(100*100),放到它的大小,然后输出值。     getContentSize很容易理解,就是获取到当前物体的大小,但是要注意是本身大小,无论是是缩放还是缩小了,其获取的还是它原来的本身大小。所以放到后还是...

ylwdi的专栏 1572

cocos2d-x里面的getContentSize这个函数到底什么意思啊

谁可以形象的描述一下,被这个量搅浑了,十分感谢啊!

yaojuanmu2785的博客 1154

cocos2dx getContentSize

假如使用一张图创建了一个精灵,图片的大小120*120,缩放先后通过getContentSize获取的大小不变,所以如果 使用相对位置,需要考虑到缩放。 before scale getContentSize: width = 120 before scale getContentSize: height = 120 after scale getContentSize:

思考的智慧,知识源于思考 3302

cocos2d-x getBoundingBox getContentSize getTextureRect 解释

这是cocos2d-x代码看注释的解释 翻译的 不到之处谅解 后面在总结 getBoundingBox  // 返回一个AABB(axis-aligned bounding-box)在其父母的坐标系统。Returns an AABB (axis-aligned bounding-box) in its parent's coordinate system. getContentSize  

思考的智慧,知识源于思考 6599

游戏开发cocos2d-x实战(11) -- Tile地图

1、Tile地图编辑器 cocos2d-x的Tile地图是用Tile地图编辑器做的,编辑器软件(https://www.mapeditor.org/)开源,免费, Tile地图是由块层和对象组成的,块层的作用是显示和一些重叠的时候覆盖角色的作用,而对象是可以进行一些事件的触发和处理的。 第一层块层是背景层,第二层块层是事物层或对像层。 一般情况下,主角(精灵)的移动时,移动地图。当地图在到边界时,不能移动时,才移动主角(精灵)(设置主角的位置)。 2、地图的分类 瓦片地图可以有三种分类:直角地图、斜角地图和

x879014419的博客 783

Cocos2d-x3.2总结(五)Eclipse下生成Android APK提示"Description Resource Path Location Type"的解决方法集锦

由于Cocos2d-x支持

cbbbc 3万+
上一篇: Cocos2d-x 多分辨率适配完全解析
下一篇: 浅析schedule和回调函数
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值