coco2dx 没有Util可以把一个对象摆放到另一个对象指定位置, 于是我只好自己创造一个:
/*
* LayoutUtil.cpp
*
* Created on: 2012-8-28
* Author: jie
*/
/**
* 固定 target 对象不动, 使 from node 的 fromx, fromy 的点同 target, destx, desty 的点重合
* 其中 fromx, fromy 是从node的外面按照 node的尺寸计算的一个点, 同 node 本身的 anchor 不同
*/
void layout(cocos2d::CCNode* from, float fromx, float fromy, cocos2d::CCNode* dest, float destx, float desty, float offsetx, float offsety) {
float x, y;
dest->getPosition(&x, &y);
const cocos2d::CCSize size = dest->getContentSize();
const cocos2d::CCPoint anchor = dest->getAnchorPoint();
// target position
x += dest->getScaleX() * (destx - anchor.x) * size.width;
y += dest->getScaleY() * (desty - anchor.y) * size.height;
// source position relative to source's anchor
const cocos2d::CCSize ssize = from->getContentSize();
const cocos2d::CCPoint sanchor = from->getAnchorPoint();
float rx = from->getScaleX() * (fromx - sanchor.x) * ssize.width;
float ry = from->getScaleY() * (fromy - sanchor.y) * ssize.height;
from->setPosition(x - rx + offsetx, y - ry + offsety);
}
void layout(cocos2d::CCNode* from, float fromx, float fromy, cocos2d::CCNode* dest, float destx, float desty) {
layout(from, fromx, fromy, dest, destx, desty, 0, 0);
}
/**
* 同 layout 类似, 不过 from 是 target 对象的子元素, 也就是说 target 对象自身的缩放和anchor point将不会影响子元素的对齐
*/
void layoutIn(cocos2d::CCNode* from, float fromx, float fromy, cocos2d::CCNode* dest, float destx, float desty, float offsetx, float offsety) {
const cocos2d::CCSize size = dest->getContentSize();
// target position in target node
float x = destx * size.width;
float y = desty * size.height;
// source position relative to source's anchor
const cocos2d::CCSize ssize = from->getContentSize();
const cocos2d::CCPoint sanchor = from->getAnchorPoint();
float rx = from->getScaleX() * (fromx - sanchor.x) * ssize.width;
float ry = from->getScaleY() * (fromy - sanchor.y) * ssize.height;
from->setPosition(x - rx + offsetx, y - ry + offsety);
}
void layoutIn(cocos2d::CCNode* from, float fromx, float fromy, cocos2d::CCNode* dest, float destx, float desty) {
layoutIn(from, fromx, fromy, dest, destx, desty, 0, 0);
}
其中 fromx, fromy 和 destx, desty 的意思再解释一下, 这些点都是比例, 取值 [0,1] 就可以代表物体的左边和右边. 它们的位置计算的起点是从 node 内部坐标系的 0, 0 开始的, 调用的时候不要受 node 自身 anchorpoint 的影响.
例如, 以下为伪代码, 不要纠结语法错误:
CCNode container = new CCNode();
container.setSize(800, 480);
container.setAnchorPoint(0, 0)
CCNode n1 = new CCNode();
n1.setSize(200, 100);
n1.setAnchorPoint(0, 0)
layout(n1, 0, 0, container, 0, 0);
// 调用结束后物体的 position = {0, 0}
CCNode n2 = new CCNode();
n2.setSize(200, 100);
n2.setAnchorPoint(0.5, 0.5)
layout(n2, 0, 0, container, 0, 0);
// 调用结束后物体的 position = {100, 50}, 但对于观察者来说, 如果你并不知道 n2 的anchorpoint = 0.5, 0.5 那么你自然的会认为 0, 0 就是代表 n2 所表示矩形区域的左下角.
layout 方法调用后被操作的对象唯一改变的只是物体本身的 x,y, anchorpoint 等都不会改变. offsetx, offsety 是在完成 layout 操作之后物体在当前的位置上再叠加一个偏移量, 单位是绝对值, 不是比例.
分享到:
相关推荐
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
cocos2d-android游戏引擎是著名游戏引擎cocos2d游戏引擎的Android版。cocos2d-android游戏引擎性能优越、易学、可以进行纯java编程、具有极高的研 究价值、大大的降低了开发者的学习成本。您只需要一台普通配置的...
《cocos2d-x 3.8:经典游戏引擎源码解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这...
《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...
《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...
《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...
《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...
"cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...
Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...
Cocos2d是一款开源的游戏开发框架,被广泛用于创建2D游戏、演示程序和其他互动内容。在Android平台上,Cocos2d-x是一个基于C++的版本,提供了原生的编程接口,同时也支持Java API,方便Android开发者使用。"cocos2d-...
该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...
cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...
标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...
《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...
《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...
《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...
Cocos2d-x是一款流行的开源游戏开发框架,它基于C++,并利用OpenGL进行图形渲染。在游戏开发中,特效的实现是至关重要的,能够极大地提升游戏的视觉体验和玩家的沉浸感。"Cocos2d-x 闪电特效"正是这样一个专题,它...
Cocos2d-x是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...
### cocos2d-iphone至cocos2d-html5移植之旅:深入解析与实践指南 #### 引言 在数字化时代,跨平台游戏开发成为了一种趋势,尤其在移动设备和网页端之间的转换变得日益频繁。《cocos2d-iphone至cocos2d-html5移植...
《cocos2d-x 动画工具 Flash2Cocos2d-x 1.3:将Flash创意带入移动游戏开发》 在移动游戏开发领域,cocos2d-x是一款广泛使用的开源游戏引擎,以其高效、跨平台的特性深受开发者喜爱。而Flash2Cocos2d-x则是一个专为...