经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Swift » 查看文章
运用GamePlayKit的GKEntity及GKComponent 的iOS游戏开发实例
来源:cnblogs  作者:布袋  时间:2018/9/25 20:28:49  对本文有异议

GameplayKit是一个面向对象的框架,为构建游戏提供基础工具和技术。 GameplayKit包含用于设计具有功能性,可重用架构的游戏的工具,以及用于构建和增强诸如角色移动和对手行为的游戏玩法特征的技术。

 
GamePlayKit

我们这里主要讲GKEntity和GKComponent这二个类;

GKEntity类(实体): 可以容纳很多组件的容器,根据自己的需求来加入相应的Component组件。

GKComponent类(组件):代表一种功能和行为,不同的组件代表不同的功能。

实用功能
(1)方便通过聚合多种组件,构建复杂的新实体Entity。
(2)不同的实体GKEntity,通过聚合不同种类的组件GKComponent来实现。
(3)不必重复写组件,组件可以复用,也易于扩展。
(4)实体可以实现动态添加组件,以动态获得或者删除某些功能。

直接通过代码来理解这二个类:

 
Flying Penguin

PenguinEntity.swift 是用来管理 Component三个组件的

  1. import SpriteKit
  2. import GameplayKit
  3. class PenguinEntity:GKEntity {
  4. var spriteComponent:SpriteComponent! // 属性 大小 texture
  5. var moveComponent:MoveComponent! // 移动组件功能;
  6. var animationComponent:AnimationComponent! //拍打翅膀的组件;
  7. init(imageName:String) {
  8. super.init()
  9. let texture = SKTexture(imageNamed: imageName)
  10. spriteComponent = SpriteComponent(entity: self, texture: texture, size: texture.size())
  11. addComponent(spriteComponent)
  12. // 加入上下飞动的组件
  13. moveComponent = MoveComponent(entity: self)
  14. addComponent(moveComponent)
  15. // 加入拍打翅膀的动画
  16. let textureAltas = SKTextureAtlas(named: "penguin")
  17. var textures = [SKTexture]()
  18. for i in 1...textureAltas.textureNames.count {
  19. let imageName = "penguin0\(i)"
  20. textures.append(SKTexture(imageNamed: imageName))
  21. }
  22. animationComponent = AnimationComponent(entity: self, textures: textures)
  23. addComponent(animationComponent)
  24. }
  25. // Add Physics
  26. func addPhysics(){
  27. let spriteNode = spriteComponent.node
  28. spriteNode.physicsBody = SKPhysicsBody(texture: spriteNode.texture!, size: spriteNode.frame.size)
  29. spriteNode.physicsBody?.categoryBitMask = PhysicsCategory.Player
  30. spriteNode.physicsBody?.contactTestBitMask = PhysicsCategory.Coin | PhysicsCategory.Obstacle | PhysicsCategory.Floor
  31. }
  32. required init?(coder aDecoder: NSCoder) {
  33. fatalError("init(coder:) has not been implemented")
  34. }
  35. }

SpriteComponent 组件:精灵的皮肤、大小

  1. import SpriteKit
  2. import GameplayKit
  3. class SpriteComponent :GKComponent {
  4. let node:SKSpriteNode
  5. init(entity:GKEntity,texture:SKTexture,size:CGSize) {
  6. node = SKSpriteNode(texture: texture, color: SKColor.clear, size: size)
  7. node.entity = entity
  8. super.init()
  9. }
  10. required init?(coder aDecoder: NSCoder) {
  11. fatalError("init(coder:) has not been implemented")
  12. }
  13. }

MoveComponent 上下飞动

  1. import Foundation
  2. import GameplayKit
  3. import SpriteKit
  4. class MoveComponent:GKComponent {
  5. // The node on which animations should be run for this animation component.
  6. // 引入SpriteComponent 就不用每次都需要像在SpriteComponent里建立精灵的属性了
  7. // node = SKSpriteNode(texture: texture, color: SKColor.clear, size: size)
  8. let spriteComponent: SpriteComponent
  9. init(entity:GKEntity) {
  10. self.spriteComponent = entity.component(ofType: SpriteComponent.self)!
  11. super.init()
  12. }
  13. required init?(coder aDecoder: NSCoder) {
  14. fatalError("init(coder:) has not been implemented")
  15. }
  16. // 组件 上下飞动;
  17. func startWobble(){
  18. let moveUp = SKAction.moveBy(x: 0, y: 50, duration: 0.5)
  19. moveUp.timingMode = .easeInEaseOut
  20. let moveDown = moveUp.reversed()
  21. let sequence = SKAction.sequence([moveUp,moveDown])
  22. let repeatWobble = SKAction.repeatForever(sequence)
  23. spriteComponent.node.run(repeatWobble, withKey: "Wobble")
  24. }
  25. }

AnimationComponent 拍打翅膀

  1. import GameplayKit
  2. import SpriteKit
  3. class AnimationComponent:GKComponent {
  4. let textures:[SKTexture]
  5. let spriteComponent: SpriteComponent
  6. init(entity:GKEntity,textures:[SKTexture]) {
  7. self.spriteComponent = entity.component(ofType: SpriteComponent.self)!
  8. self.textures = textures
  9. super.init()
  10. }
  11. // 翅膀拍动
  12. func startAnimation(){
  13. let flyAction = SKAction.animate(with: textures, timePerFrame: TimeInterval(0.02))
  14. let repeatAction = SKAction.repeatForever(flyAction)
  15. spriteComponent.node.run(repeatAction)
  16. }
  17. required init?(coder aDecoder: NSCoder) {
  18. fatalError("init(coder:) has not been implemented")
  19. }
  20. }

在场景GameScene加入管理器Entity对象

  1. func setupEntityComponent(){
  2. let penguin = PenguinEntity(imageName: "penguin01") // 企鹅属于worldNode的子层级;
  3. let penguinNode = penguin.spriteComponent.node
  4. penguinNode.position = CGPoint(x: 320, y: 500)
  5. penguinNode.zPosition = 5
  6. worldNode.addChild(penguinNode)
  7. // penguin有移动的功能
  8. penguin.moveComponent.startWobble()
  9. // 有拍打翅膀的功能
  10. penguin.animationComponent.startAnimation()
  11. }

以上就是应用GKEntity来管理三个组件GKComponent的运用实例。

源码传送门:https://github.com/apiapia/FlyingPenguinSpriteKitGameTutorial
更多游戏教学:http://www.iFIERO.com

补充:英文够好的话,建议上苹果的官网看看 GameplayKit的案例代码:

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号