在我的项目(游戏)中,我有多个被触摸操作的对象,所以我认为将所有可触摸的对象作为"触摸"的子类。抽象类是一个好主意,类似于:
Touchable是CCSprite的子类
Box是Touchable的子类
Motor是Touchable的子类
因此Box和Motor是CCSprites,它们继承了Touchable的常用方法,可以覆盖它们
这是解决这个问题的正确方法,还是有其他方法可以解决这个问题?
答案 0 :(得分:3)
我之前解释过为什么subclassing CCSprite is almost always a bad idea。
“Touchable”顾名思义就是一个物体的能力。可以触摸节点,也可以不触摸节点。而且,这不能仅限于精灵。如果您以后需要可触摸标签,可触摸粒子效果或其他可触摸节点类,该怎么办?
显然你不能将CCNode子类化为可触摸,然后将该可触摸节点类的子类转换为精灵,标签等,因为cocos2d已经建立了一个类层次结构 - 这就是这种分层系统表面的不灵活性,并开始成为一个真正的痛苦。
你可以在任何时候为任何物体添加这种可触摸(或可以摇动,飞行,跳跃,可驾驶,可滑动等)的能力,你也可以随时将它带走。这使它成为plugin class (a component)的候选者。任何能力,尤其是那些可能是临时的能力,都不应该是超类的一部分,而是可以添加到现有对象的其他对象,并根据需要启用/禁用。
解决此问题的一种方法是使用节点的userObject属性。编写一个Abilities容器类,并将其分配给节点的userObject。然后将所需的Ability类添加到节点的容器中。然后,节点通过转发update方法更新userObject容器类,该方法将更新转发给所有能力。或者Ability容器本身向CCScheduler注册以接收更新。容器类和能力类所需要的唯一东西是对拥有节点的(弱)引用。
答案 1 :(得分:2)
取决于“Touchable”是否表示每个类必须明确实现以支持的一组随机行为,或者是否可以存在一个“仅适用于”继承的单个实现(可能还有一些自定义)。 / p>
如果是前者,那么你的思维大多是正确的。如果是后者,那么Jack建议使用@protocol
(这很像Java中的接口)是有意义的。
就个人而言,我会保持简单。从SPAbstractSprite
类开始,该类是CCSprite
的子类。然后,将其子类化为SPBox
和SPMotor
。
在SPBox
和/或SPMotor
开始实施,并且由于常见问题,将它们重构为SPAbstractSprite
。
至于“可触摸”的概念,我不会担心现在尝试将其命名为“可触摸”。以与上述相同的方式处理它;在你的马达或盒子中实现可触摸的支持,然后在以后重构为抽象的父类。
不过,我确实是一个非常设计和代码交错的人,并且完全承认有些人在写作之前真的喜欢坐下来画出一套很好的盒子/线条/层次结构。代码行。在任何情况下,你应该注意到,Apple提供的类和示例中的类层次结构往往非常浅,并且不会进行大量的抽象,尽管抽象仍然被大量使用({{1例如,所有这些子类都需要goop等所有视图的抽象容器。