代码之家  ›  专栏  ›  技术社区  ›  Layon Tavares

如何在GameplayKit/SpriteKit中以有效的方式建模实体和组件

  •  5
  • Layon Tavares  · 技术社区  · 10 年前

    从这里的GameplayKit开始,我正在为一名无尽的跑步者建模 玩家可以在角色之间交换 点击屏幕。角色 第一个可以攻击 在短距离(组件)中 第二次跳跃 (组件),以及 第三次射击 (组件)。

    我想 知道什么是最好的 建模方法 在这两者之间 :

    1. 创建一个具有3个不同字符实体(数组)的类Player,其中一个包含它的组件

    2. 创建具有3个不同角色组件的实体播放器 并添加所有动作和动作组件(射击/跳跃…)

    这是一个 真正的大项目 所以我很担心 最佳方法 保留代码 可长期维护和可读 .

    Ps:。 SpriteComponent将是所有实体在.sks上负责可视化表示的组件。

    Ps2:。如果可能,用swift举例。

    感谢您抽出时间。

    1 回复  |  直到 10 年前
        1
  •  5
  •   crashoverride777    10 年前

    这取决于你做什么以及每个角色除了使用组件之外做什么。 使用gameplayKit,我可能更喜欢创建实体类,而不仅仅是类。

    你是否考虑只使用一个玩家实体,而当你改变角色时,你只是删除/添加该角色的组件。

    假设你从攻击型变为跳跃型,你可以去掉攻击组件

     player.removeComponent....
    

    并添加跳跃组件

     let jumpingComponent = ...
     player.addComponent(jumpingComponent)
    

    通常,您希望确保您的组件尽可能灵活和通用。 例如,您的spriteComponent应该在其init方法中获取一个图像字符串/纹理,这样您可以向每个实体添加相同的组件,但使用不同的图像。

     class SpriteComponent: GKComponent {
    
         let node: SKSpriteNode
    
         init(texture: SKTexture) {
              node = SKSpriteNode(texture: texture, color: SKColor.clearColor(), size: texture.size())
         }
    }
    

    现在,您可以在使用不同图像的同时为每个角色添加相同的组件

        let character1Texture = SKTexture(imageNamed: "Character 1 image"
        let spriteComponent = SpriteComponent(texture: character1Texture)
        addComponent(spriteComponent)
    

    动画和其他组件也是如此。

    我对待它的方式是这样的。

    假设我有一个游戏,我有10种类型的敌人,它们或多或少是相同的。我可能会尝试只拥有一个敌人实体类,将所有10个敌人使用的所有组件。然后,我将添加相关组件,使每个组件动态地或基于我将在init方法中传递的enumType唯一。

    另一方面,假设我有3个主要角色,他们都做了非常独特的事情,可能比只创建3个实体类更简单更干净。同样不要忘记子类化,这样您可以创建一个包含所有共享组件的实体类,而不是子类化其他2个实体。

    苹果在DemoBots中做到了这一点,在DemoBots中,他们有一个TaskBot实体,而不是FlyingBoy实体和GroundBot实体。这两个实体都是TaskBot的子类。

    这真的取决于你。