晚上看COCOS2d-X的瓦片地图集这块,发现有2种地图,普通的和45度视角的。普通的通过位置获取所在行列数比较简单,大概就是具体的位置除以图素的宽高,而45度脚的方法则能够实现2.5D的效果,理解起来也相对困难一点。下面是一张45度的地图示意。

通过图中,我们发现其视觉定位与以往看见的不相同,在坐标的设定上也不一样,当光标放在上面顶点的时候,坐标为(0,0)表示为图素的标号(0,0),向右为第一个分量(可理解为X方向),向左为第二个分量(可理解为y方向)。这个要注意。而在选取位置的时候则需要按照地图的设定,向右为X方向,向上为Y方向,且处于GL的坐标绘制范围。相关的示例程序如下,其中引用了CCTMXTileMap,整体比较简单,但要注意其中的convertto2d函数,控制了相关的转换,使得可以在45度角地图中,获得相关的行列数。

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{CCSetIterator it = pTouches->begin();CCTouch* touch = (CCTouch*)(*it);CCPoint m_tBeginPos = touch->locationInView();  m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos );CCTMXTiledMap* map = (CCTMXTiledMap*) getChildByTag(1);CCPoint mapp = map->getPosition();CCPoint aimmapindex = <span style="background-color: rgb(51, 255, 51);">convertto2d(m_tBeginPos.x - mapp.x,m_tBeginPos.y - mapp.y)</span>;if(aimmapindex.x < 0 || aimmapindex.y < 0 || aimmapindex.x >= map->getMapSize().width || aimmapindex.y >= map->getMapSize().height){return;}CCTMXLayer* layer = map->layerNamed("grass");layer->setTileGID(4,aimmapindex);
}

下面是convertto2d函数的代码

CCPoint HelloWorld::convertto2d(float x,float y){CCTMXTiledMap* map = (CCTMXTiledMap*) getChildByTag(1);int mapWidth = map->getMapSize().width * map->getTileSize().width;int mapHeight = map->getMapSize().height * map->getTileSize().height;double distanse,sin1,sin11,sin22,cos11,cos1;int d2x,d2y;double mystatic5 = sqrt(5.0);double mystatic = 16 * mystatic5;if(<span style="background-color: rgb(51, 255, 51);">x > mapWidth/2</span>){distanse = sqrt((x - mapWidth/2) * (x - mapWidth/2) + (mapHeight - y) * (mapHeight - y));sin1 = (mapHeight - y)/distanse;cos1 = (x - mapWidth/2)/distanse;sin11 = (sin1 * 2 - cos1) / mystatic5;cos11 = (sin1 + cos1 * 2) / mystatic5;d2y = distanse * 5 / 4 * sin11 / mystatic;sin22 = (2 * sin1 + cos1) / mystatic5;d2x = distanse * 5 / 4 * sin22 / mystatic;return ccp(d2x,d2y);}else{distanse = sqrt((mapWidth/2 - x) * (mapWidth/2 - x) + (mapHeight - y) * (mapHeight - y));sin1 = (mapHeight - y)/distanse;cos1 = (mapWidth/2 - x)/distanse;sin11 = (sin1 * 2 - cos1) / mystatic5;cos11 = (sin1 + cos1 * 2) / mystatic5;d2x = distanse * 5 / 4 * sin11 / mystatic;//sin22 = 4.0 * cos11 / 5 + 3.0 * sin11 / 5;sin22 = (2 * sin1 + cos1) / mystatic5;d2y = distanse * 5 / 4 * sin22 / mystatic;return ccp(d2x,d2y);}
}

前面的计算部分都比较简单, 要说明的是45角地图采用的是菱形,整个地图的对角线比例为2:1,因此斜边的比例为sqrt(5.0)。中间涉及到三角函数的转换和计算,具体的说明,我在纸上画了图形和说明。

发现通过对X的位置的划分,进行了左右的不同情况的计算,利用和差化积公司,倍角公式,正玄定理等等三角函数,利用已知的AC的长度,和可以计算出来的点C与水平线的夹角角1(见图中所示),继而计算出角11(图中所示),接着利用角度关系计算出来角CDA,最后得到相关结果,最后除以相关方向的图素大小即可得到相关的行列数。

开始找了很多资料,都没有找到仔细的介绍,还是自己下点功夫,好好专研下解决了是王道。加油!! 希望能帮到看到这里困惑的朋友。。

COCOS2D-X中45度地图通过位置获得对应行列数中的三角变换理解相关推荐

  1. 45度地图之整体旋转

    假设有如下一幅地图(左边为数组地图,右边为对应的位图地图),这幅地图对应的是一个一维数组int map[16],且我们知道总共有4行,4列,对于数组中的元素我们可以通过下面的公式求出它所在的行列, 第 ...

  2. 45度地图遮挡问题解决方案(cocos2d-x)

    最近一直在做45度斜视角游戏,也就是isometric等容地图,俗称2.5D.地图上物体的前后遮挡是我遇到的第一个问题,总结一下处理方法. 遮挡问题(不知道术语),就是比如一个角色站在树后面,那么树要 ...

  3. 编写简易斜45度地图编辑器

    最近在研究cocos2dx的地图,最开始使用的是Tiled,这个编辑器做比较小的地图还是比较强大的,不过做大地图的时候,有一些功能不太方便并且有缺陷(包括刷图繁琐以及坐标体系过于复杂,导致寻路比较看起 ...

  4. (java)输入一个正整数n(1≤n≤6)和n阶方阵A,交换方阵A中的最大值与最小值位置。假定方阵A中的最大值与最小值都唯一。

    package com.qinyang.array;import java.util.Scanner;public class Demo02 {/*输入一个正整数n(1≤n≤6)和n阶方阵A,交换方阵 ...

  5. Query实现将div中滚动条滚动到指定位置的方法,html中offsetTop、clientTop、scrollTop、offsetTop各属性的解释

    TML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth  scrollHeight: 获取对象的滚动高度.  scrollLeft:设置或获取位于 ...

  6. JAVA中怎么设置文本域位置_java – 如何在JTextArea中更改文本的位置

    通常,在JTextArea中,文本从左上角开始.我希望它在左下角.你怎么能这样做? (如果我的笔迹不可读,请道歉) 解决方法: 您可以将JTextArea锚定到容器的BorderLayout.PAGE ...

  7. 45度斜角地图菱形坐标转换

    !!! 此文章内容为转载,没有真实实践,只给需要的朋友提供思路,具体详细算法需要自己根据项目需求变动 !!! 我们要做一个45度游戏地图中,那么如何判断鼠标点中了哪一个碎片呢??如图:   也许你想到 ...

  8. 让Tiled成为一个强有力的45度菱形Staggered打点器(地图编辑器)

    让Tiled成为一个强有力的45度菱形Staggered打点器(地图编辑器) 分类: cocos2dx2013-08-05 23:09 1601人阅读 评论(1) 收藏 举报 Tiled的确强大,处理 ...

  9. power bi 创建空表_如何使用R在Power BI中创建地理地图

    power bi 创建空表 介绍 (Introduction) This is the fifth article of a series dedicated to discovering geogr ...

最新文章

  1. 这所211高校通知不放寒假!校园将实行封闭管理!
  2. 操作系统课设--NACHOS试验环境准备、安装与MAKEFILE分析
  3. 微信小程序PHP文件建在哪里,微信小程序解析H5文件方法
  4. MATLAB中cif用于清除什么,cifti-matlab-master 能够对MRI数据进行功能成像 - 下载 - 搜珍网...
  5. java hasfocus_Java KeyEvent.hasNoModifiers方法代碼示例
  6. Jupyter Notebook: 解决build docker-stacks时conda太慢的问题
  7. error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void)”中被引用
  8. java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据
  9. 95-10-140-启动-权限
  10. 四、物理优化(4)分区视图
  11. 史上最大规模机器人“面相”调查:157张脸背后的人类感受
  12. 关于SVN版本控制工具的冲突解决方案
  13. 1.Getting Started
  14. flutter推荐路由器插件:go_router
  15. [USACO18DEC]Cowpatibility(容斥 or bitset优化暴力)
  16. 详解SQL2005中的AWE
  17. ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
  18. gridview中手工排序
  19. labview如何安装modbus离线模块_Chrome73如何下载和安装扩展离线文件crx
  20. Python POST登陆linkedin分析(完),完整实现过程

热门文章

  1. doc es 中type_Elasticsearch基础——概念和基本API操作
  2. 什么样的功能可以提升加密货币的币值 ?
  3. excel合并同类项去重求和功能
  4. 感慨啊,我国的电子竞技!
  5. 【干货】从零实现 react-redux
  6. Java 基础篇(二)
  7. python re零宽断言踩坑 re.error: look-behind requires fixed-width pattern
  8. PyKivy入门教程:Kivy Python库的介绍、安装及使用方法详解
  9. 郭光灿院士--奇妙的量子世界笔记1(量子世界和经典世界区联系)
  10. 保姆级-红米AC2100之breed不死后台刷写openwrt官方版第三方改良版