SpriteBatchNode 的触摸检测
Touch detection for SpriteBatchNode
我很好奇是否有人知道如何检测 SpriteBatchNode 何时被触摸,因为它的 BoundingBox 始终为空。这就是我检测单个精灵触摸的方式。
Node *parentNode = event->getCurrentTarget();
Vector<Node *> children = parentNode->getChildren();
Point touchPosition = parentNode->convertTouchToNodeSpace(touch);
for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
childObject = *iter;
if (childObject->getBoundingBox().containsPoint(touchPosition)){
//do something
}
但在大多数情况下,我希望我的 sprite 具有动画效果,因此使用 SpriteBatchNode。有任何想法吗?我可以得到孙子的 BoundingBox 吗,因为他们是一系列精灵?
取决于您使用的是哪种方法。
骨架骨骼动画:您是否使用 cocostudio 骨骼动画工具创建动画?如果你使用它,你将得到一个带有正确边界框的节点,它紧紧地包裹着你的精灵,并在骨骼改变位置时进行调整
Sprite sheet animation: 如果你使用的是 sprite sheet 和 .plist 文件你可以检查反射的大小在 .plist 文件中,将你的 batchNode 大小设置为你找到的最大的,或者根据当前显示的精灵动态调整它。我认为 cocos 默认会这样做。
加载 sprite 帧: 如果您使用 spriteFrames 加载单个 sprite,您可以检查 spriteFrame 的 contentSize 并手动设置边界框。
我已经使用了所有 3 个并且总是能够获得 boundingBox 大小。让我知道这是否有帮助。我使用 this 文章来学习 sprite sheet 动画,并且只是玩弄了 cocos 骨骼动画,并在我尝试它时弄明白了。
好吧,我通过获取孙子的 BoundingBox 来解决这个问题,它是一个 sprite。然后我就可以对 spritebatchnode 做任何我想做的事了。
我很好奇是否有人知道如何检测 SpriteBatchNode 何时被触摸,因为它的 BoundingBox 始终为空。这就是我检测单个精灵触摸的方式。
Node *parentNode = event->getCurrentTarget();
Vector<Node *> children = parentNode->getChildren();
Point touchPosition = parentNode->convertTouchToNodeSpace(touch);
for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
childObject = *iter;
if (childObject->getBoundingBox().containsPoint(touchPosition)){
//do something
}
但在大多数情况下,我希望我的 sprite 具有动画效果,因此使用 SpriteBatchNode。有任何想法吗?我可以得到孙子的 BoundingBox 吗,因为他们是一系列精灵?
取决于您使用的是哪种方法。
骨架骨骼动画:您是否使用 cocostudio 骨骼动画工具创建动画?如果你使用它,你将得到一个带有正确边界框的节点,它紧紧地包裹着你的精灵,并在骨骼改变位置时进行调整
Sprite sheet animation: 如果你使用的是 sprite sheet 和 .plist 文件你可以检查反射的大小在 .plist 文件中,将你的 batchNode 大小设置为你找到的最大的,或者根据当前显示的精灵动态调整它。我认为 cocos 默认会这样做。
加载 sprite 帧: 如果您使用 spriteFrames 加载单个 sprite,您可以检查 spriteFrame 的 contentSize 并手动设置边界框。
我已经使用了所有 3 个并且总是能够获得 boundingBox 大小。让我知道这是否有帮助。我使用 this 文章来学习 sprite sheet 动画,并且只是玩弄了 cocos 骨骼动画,并在我尝试它时弄明白了。
好吧,我通过获取孙子的 BoundingBox 来解决这个问题,它是一个 sprite。然后我就可以对 spritebatchnode 做任何我想做的事了。