【问题标题】:Using Cocos2d, to detect if a Sprite is tapped on, we need to do all the calculations?使用 Cocos2d,检测一个 Sprite 是否被点击,我们需要做所有的计算吗?
【发布时间】:2012-05-02 16:05:11
【问题描述】:

例如,如果我们有 10 个矩形精灵,我们使用随机的宽度、高度、位置和 z-index 生成它们。现在方法

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

被调用。我们如何知道点击了哪个精灵?我知道一些技术检查点击点是否在精灵矩形的范围内,但在上述情况下,如果矩形 A 在左上角的矩形 B 的顶部,以及当矩形 B 的左上角时怎么办?被点击,它可能是被点击的矩形A——点击点实际上在两个矩形内。

我们是否必须手动完成,甚至考虑 z-index...? (可能循环遍历从最高 z-index 到最低的所有精灵)。

如果精灵是一个三角形并且旋转呢? Cocos2d 中没有内置的方法可以处理吗?

(那是因为我前几天浏览了Core Graphics的示例代码……好像那样的话,会有两个点击事件,一个用于主视图,一个用于子视图,我们可以检查用户点击的是什么视图,不做任何计算)

【问题讨论】:

    标签: ios cocos2d-iphone


    【解决方案1】:

    一个可能的解决方案是 CCSprite 的子类,它声明自己是 CCStandardTouchDelegate 或 CCTargetedTouchDelegate 的委托。然后在这些委托方法中对精灵执行适当的操作。

    【讨论】:

    • 好的,看起来我们可以使用CCTargetedTouchDelegate,但我们仍然需要自己实现代码以确定它是否在我们的ccTouchBegan 代码中被点击。如果是旋转的矩形或三角形,则更复杂。或者如果它是相互重叠的牌——我们需要自己确定点击是在最上面的牌上还是在最下面的牌上。我认为在 Core Graphics 中,它是自动的,但我稍后会验证,也许这就是 Core Graphics 较慢的原因。
    • CCTargetedTouchDelegate的委托方法会在z值最高的CCSprite上被调用。在 CCTouchBegan 方法中,您可以通过响应 YES 来声明触摸,或者通过响应 NO 将其传递到其下方的下一个最高层(或 sprite)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多