位置: 编程技术 - 正文

cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象

编辑:rootadmin

推荐整理分享cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

之前已经有一篇更基础的tilemap笔记了,这两天用了下3.3的tilemap发现以前有些东西又套用不了。所以又写了一篇札记,顿时感觉自己萌萌哒。

完全没有玩过的童鞋可以看看基础篇

主要实现目标:

1. 能够3倍缩放tiledMap

2. 能够鼠标滑动 tiledMap

3. 在缩放和滑动的情况下,点击一个tile 能够判断出 实际的&#;子坐标。

4. 永远让角色保持在屏幕中心

缩放和滑动这里就不再详细解释了,有很多的例子,末尾呈上完整代码。主要说一下第三条的实现。

可以从图中看出,我建了一个points对象组,然后建立了两个对象 startPos 和endPos

startPos 大概覆盖了 4个tiled [0,] [1,] [0,] [1,]

并且给startPos设置了一个 自定义属性:id 。我需要的就是点击到 上面4块tiled的时候能够 获取到这个对象的id&#;。

首先写了个函数来读地图对象

很顺利的拿到startPos对象的 pointX 和 pointY , 但是&#;却是 (0,) , 不是期待的(1,) 忽然有点凌乱 -_- !!了。

直到看了一下源码TMXLayer 的getPositionAt才发现,原来这个(0,) 是已经经过 “分辨率转换“了。

看一下宏的定义:

从源码可以看到:

1 . 我们可以确定的是tilemap 上面 pixel : point 的比例是 1 : 1, 而设备上面却并不一定。

mac 设备上面 pixel : point = 1: 1 , iphone Retina 是 2 : 1, 低分辨率就会更大。我们就把这个比&#;像素尺寸因子吧

2. 通过 CC_POINT_PIXELS_TO_POINTS 能够把 tilemap上面的坐标&#;转换成 设备上面的坐标&#;。

3. 这个setScale getScale做的是类&#;的事情,但是要区分开来计算。

cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象

此外,因为我们的tilemap可以滑动点击,所以在从触摸点转换 tilemap绝对坐标的时候需要额外做两点:

1. 把tilemapLayer的坐标作为偏移量

2. 除以缩放系数

注意:在scale的情况下,因为touchPoint 和 mapPoint 经过缩放,已经在scale的作用产生变化了

所以:

Point realPoint = (touchPoint - mapPoint)/_tiledMap->getScale();

接下来再逆推一下从 触摸点 转换到 tilemapPoint 的方法就非常简单了

Point HelloWorld::covertTiledPointToCenterPoint(Point p){ float scale = _tiledMap->getScale(); float factor = CC_CONTENT_SCALE_FACTOR(); CCLOG("HelloWorld::covertTiledPointToCenterPoint scale:%f factor:%f",scale,factor); int offsetX = _tiledMap->getTileSize().width / (2 * factor); int offsetY = _tiledMap->getTileSize().height / (2 * factor); TMXLayer* layer = _tiledMap->layerNamed("background"); Point point = layer->getPositionAt(p); point = Point(point.x &#; offsetX,point.y - offsetY); point = Point(point.x * scale, point.y * scale); return point;}

测试发现,上述方法还是计算有偏差,补上一个正确的计算方法

注意:在进行了scale缩放的情况下, positionForTileCoord 得出来的坐标是在 tilemap上面的相对坐标 relativePoint;

如果用来设置 tileMap 上面的子对象的坐标,那么不需要额外加工了,因为计算子结点相对坐标是不需要考虑scale的。

最后说一下关注角色居中的问题:

先上代码

假设图中的黑框就是设备,那么我们现在要做的就是移动地图,让小猫处在设备中心,也就是蓝圈的位置。

1.中心位置,在屏幕坐标系上恒定不变,永远是 Point centerOfView(winSize.width / 2, winSize.height / 2);

2. 地图的坐标是相对屏幕坐标系的坐标(受到scale影响),这样 (centerOfView - tileMapPoint ) / scale就得到了蓝圈在 地图坐标系的坐标centerPoint

3. 角色坐标(RolePoint) &#; 偏移量(offsetVec) = centerPoint

4. tileMap的新位置 = tileMapPoint &#; 偏移量

代码下载

cocos2dx 制作特效文本 原理:1.先在RenderTexture上渲染文字2.通过RenderTexture:newImage来获取到Image并依此得到对应的Texture3通过Texture构造Sprite,将生成的Sprite作为ClippingNode的模板(st

cocos2dx2.x杂记之CCSpriteBatchNode 什么是CCSpriteBatchNode作用:按自己的理解就是,将所有具有相同纹理的精灵当成一个节点,区别是:这个节点有多份需要渲染的纹理。在递归渲染遍历到

Bullet(Cocos2dx)之增加调试绘制PhysicsDraw3D 由于刚开始学的时候不知道Bullet的单位1.0代表多大,所以制作出的模型的大小也无法判断。不用担心,Bullet提供了一个类btIDebugDraw,这个泪已经实现了很

标签: cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象

本文链接地址:https://www.jiuchutong.com/biancheng/372626.html 转载请保留说明!

上一篇:Cocos2dx的内存优化总结(cocos2dx运行原理)

下一篇:cocos2dx 制作特效文本(cocos2d-x教程)

  • 向个人提供居住证明
  • 混合销售行为的基本特征不包括
  • 个税申报错误已过申报期怎么修改
  • 资金收益率计应收账款吗
  • 个人出租住房要交个税吗
  • 小规模纳税人季度不超45万免增值税
  • 出纳取备用金需要交税吗
  • 公司期货收入怎么交税
  • 审计报告印花标
  • 中小企业现金流量表
  • 新公司成立后需要办理导航业务吗
  • 以前年度损益调整结转到未分配利润
  • 外币借款汇兑差额资本化额怎么计算
  • 事业单位破产清算程序规定
  • 盘盈入库做什么分录
  • 处置固定资产取得的收益属于利得吗
  • 法人的投资款如何拿出来
  • 合作社土地入股协议
  • 航天金税盘费用怎么做账
  • 计算本月生产成本怎么算
  • 企业向境外支付货款填写
  • 进项税额抵扣不完怎么办
  • 未分配利润转增股本要交税吗
  • 使用时间长但金币不见了
  • 一般纳税人和小规模纳税人的区别
  • 预提费用年底如何结转
  • 土地使用税计税依据及计算方式
  • 预缴企业所得税怎么做账务处理
  • 财务报表利润表怎么填
  • 特殊工种人身安全保险费可以扣除吗
  • 不征税收入有哪些条件
  • PHP:session_save_path()的用法_Session函数
  • PHP:stream_filter_remove()的用法_Stream函数
  • PHP:imagetruecolortopalette()的用法_GD库图像处理函数
  • 工业企业应付账款周转率多少合适
  • php curl cookie
  • 废品损失属于产品成本项目吗
  • laravel 分页 api
  • 员工食堂买菜
  • python 远程控制
  • 退社保基金怎么办理
  • 帝国cms导航站模板
  • 股本和库存股有什么区别
  • mongodb 查询条件
  • 原材料折价销售怎么算
  • 服务费的发票税率是多少
  • mustn't be allowed
  • 党费会计核算科目有哪些
  • 跨年发生退货税务处理
  • 废料如何做分录
  • 商业折扣怎么扣
  • 股东出资做什么科目
  • 为什么银行结息不加入账户
  • 房屋租赁协议印花税怎么计算
  • 工程结算材料款抵扣增值税
  • 公司向个人借款利息可以税前扣除吗
  • 小规模纳税人怎么申报个人所得税
  • 收到税务局退还的个税手续费怎么入账
  • 分公司做账报税
  • 收到没有填税号的信息
  • 往来会计岗位职责怎么写
  • 大数据可以在等方面发挥作用
  • phpmyadmin配置文件
  • Win10预览版镜像
  • fedora最新版
  • linux挂载cd
  • win7开机黑屏只有一个鼠标箭头
  • win7如何清理c盘空间不影响系统
  • rhel6提供5种基本的安装方式
  • win10系统如何设置锁屏壁纸图片
  • android打包v1v2
  • 用jquery
  • shell脚本-lt
  • python3.8.3怎么用
  • python中的变量和常量ppt
  • 云南省电子税务局怎么改号码
  • 哈尔滨二手房交易流程
  • 在本地买车怎么上外地牌照
  • 怎么删除天眼查信息
  • 福建地税网上办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设