如果要把一个 SpriteFrame 做成可以相应 touch 事件的东西的话,用什么类型的节点容器最合适?

如果要把一个 SpriteFrame 做成可以相应 touch 事件的东西的话,用什么类型的节点容器最合适? Layer 的话能够控制热区吗? Button的话能够载入 SpriteFrame作为 Texture吗?

没太看懂什么意思,我平时做Menu的时候都用的SpriteFrame,因为资源是放到plist文件中得,然后设置menu正常和点击状态的SpriteFrame就好了。

谢谢雷利,我遇到的具体情况是这样的。

有一个如下的现实结构:

  • ScrollView
    • SpriteA
      • sprite(createWithSpriteFrame) and runAction(forever(sequence(moveBy)))
    • SpriteB
      • sprite(createWithSpriteFrame) and runAction(forever(sequence(moveBy)))
    • SpriteC
      • sprite(createWithSpriteFrame) and runAction(forever(sequence(moveBy)))
    • SpriteD
      • sprite(createWithSpriteFrame) and runAction(forever(sequence(moveBy)))
    • SpriteE runAction(forever(sequence(moveBy)))
    • SpriteF runAction(forever(sequence(moveBy)))
    • SpriteG runAction(forever(sequence(moveBy)))
    • SpriteH runAction(forever(sequence(moveBy)))

其中 SpriteA 到 SpriteD 是 纵向移动, SpriteE-SpritH 是水平移动。

现在的需求是 SpriteA 到 SpriteD 是 纵向移动的时候 要是可以点击的。

所以我想把 SpriteA 到 SpriteD 用 Button 封装来响应touch event。但是里面的渲染素材全部是 SpriteFrame。而 ccui.Button 不能 initWithSpriteFrame

然后,我就试这在 SpriteA 到 SpriteD 中增加一个透明的 button 子节点。但是发现一旦这样做了以后, SpriteA 到 SpriteD 中的所有子节点的 ActionInterval 就都不工作了。

现在的实现办法很土,是在 ScrollView 的 content 节点里面用 layer 监听 touch event, 然后更加触发点的 x, y 来计算是否落在 SpriteA 到 SpriteD 热区区间里。

这样做的不好的地方是,容器和自节点耦合了。子节点缺乏可扩展性,比如我想让子节点在点击以后切换别的动画,那么这段逻辑就无法完整封装在子节点内部。

所以在想找更好的实现办法。