我如何在 GameplayKit/SpriteKit 中以有效的方式对实体和组件建模
How can i model Entities and Components in a effective way in GameplayKit/SpriteKit
从这里的 GameplayKit 开始,我正在为一个无尽的奔跑者建模,玩家可以通过点击屏幕在角色之间切换。角色首先可以在近距离内攻击(组件),第二个跳跃(组件),第三个射击(组件)。
我想知道什么是最好的建模方法在这两者之间:
创建一个 class 具有 3 个不同角色实体(数组)的播放器,其中一个具有组件
创建一个具有 3 个不同角色组件的实体 Player
并添加所有运动和动作组件 (shoot/jumping...)
这是一个真正的大项目所以我担心保持代码可维护性的最佳方法并且可以长期阅读.
Ps:.
SpriteComponent 将是所有实体在 .sks 上负责视觉表示的组件。
Ps2:.如果可能,swift 中的示例。
感谢您的宝贵时间。
这取决于你做什么以及每个角色除了使用组件之外还做了什么。
使用 gameplayKit 我可能更愿意创建实体 class 而不仅仅是 classes.
您是否考虑过只使用 1 个玩家实体,而不是在更改角色时只为该角色 remove/add 个组件。
假设你从进攻型变成跳跃型,你可以去掉攻击成分
player.removeComponent....
并添加跳跃组件
let jumpingComponent = ...
player.addComponent(jumpingComponent)
一般来说,您希望确保您的组件尽可能灵活和通用。
例如,您的 spriteComponent 应该在其 init 方法中使用图像 string/texture,这样您就可以将相同的组件添加到每个实体,但使用不同的图像。
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 种大致相同的敌人。我可能会尝试让 1 个敌人实体 class 将所有 10 个敌人使用的所有组件。比我添加相关的组件,使每个组件动态地或基于我将在 init 方法中传递的 enumType。
另一方面,假设我有 3 个主要角色,他们都做着非常独特的事情,这可能比只创建 3 个实体 classes 更容易和更清晰。也不要忘记 subclassing,因此您可以使用所有共享组件创建 1 个实体 class,而不是 subclass 其他 2 个实体。
Apple 在 DemoBot 中这样做,他们有一个 TaskBot 实体,而不是一个 FlyingBoy 实体和一个 GroundBot 实体,它们都是 TaskBot 的子class。
这完全取决于你。
从这里的 GameplayKit 开始,我正在为一个无尽的奔跑者建模,玩家可以通过点击屏幕在角色之间切换。角色首先可以在近距离内攻击(组件),第二个跳跃(组件),第三个射击(组件)。
我想知道什么是最好的建模方法在这两者之间:
创建一个 class 具有 3 个不同角色实体(数组)的播放器,其中一个具有组件
创建一个具有 3 个不同角色组件的实体 Player 并添加所有运动和动作组件 (shoot/jumping...)
这是一个真正的大项目所以我担心保持代码可维护性的最佳方法并且可以长期阅读.
Ps:. SpriteComponent 将是所有实体在 .sks 上负责视觉表示的组件。
Ps2:.如果可能,swift 中的示例。
感谢您的宝贵时间。
这取决于你做什么以及每个角色除了使用组件之外还做了什么。 使用 gameplayKit 我可能更愿意创建实体 class 而不仅仅是 classes.
您是否考虑过只使用 1 个玩家实体,而不是在更改角色时只为该角色 remove/add 个组件。
假设你从进攻型变成跳跃型,你可以去掉攻击成分
player.removeComponent....
并添加跳跃组件
let jumpingComponent = ...
player.addComponent(jumpingComponent)
一般来说,您希望确保您的组件尽可能灵活和通用。 例如,您的 spriteComponent 应该在其 init 方法中使用图像 string/texture,这样您就可以将相同的组件添加到每个实体,但使用不同的图像。
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 种大致相同的敌人。我可能会尝试让 1 个敌人实体 class 将所有 10 个敌人使用的所有组件。比我添加相关的组件,使每个组件动态地或基于我将在 init 方法中传递的 enumType。
另一方面,假设我有 3 个主要角色,他们都做着非常独特的事情,这可能比只创建 3 个实体 classes 更容易和更清晰。也不要忘记 subclassing,因此您可以使用所有共享组件创建 1 个实体 class,而不是 subclass 其他 2 个实体。
Apple 在 DemoBot 中这样做,他们有一个 TaskBot 实体,而不是一个 FlyingBoy 实体和一个 GroundBot 实体,它们都是 TaskBot 的子class。
这完全取决于你。