中文社区 发表于 2019-4-1 11:50:32

对SpriteKit和GameplayKit的理解

现在99%的人都在用cocos2d在做游戏,我没有研究过cocos2d。前段时间发现,苹果也提供了做游戏的库SpriteKit 和 GameplayKit 这两个库,苹果还是强大。

所以我就想写一款游戏,万丈高楼平地起,一步步来吧~~

两者肯定是有区别的,我这主要是对苹果的描述一下。

这两个库的好处就是:没有图,依然可以写代码,后期加入图就行。




1.SpriteKit 主要的就是对场景、精灵节点的操作

附件中有关于这个库的详细介绍 我就不多说了


2.GameplayKit 主要组件和实体

实体和组件我绕了好几天才绕出来,它是把每部分都拆分出来。

比如说一个人有左手、右手、左脚、右脚,这个人就是一个实体,他的左手、右手、左脚、右脚就是组件。我在左手的这个组件中可以获得右手组件的属性。

好了话不多说用代码解释一切,可参照github中的demo。


1)我创建一个TSCharacterEntity继承自GKEntity。

先初步设想,角色这个实体肯定有方向组件、动画组件。


2)创建TSOrientationComponent和TSAnimationComponent两个类。

方向组件我需要一个枚举来确定方向,所以我还需要TSCompassDirection这个类。

在TSCompassDirection这个类中代码如下:


    enum TSCompassDirection: Int {    case Up = 1,RightUp
    case Right , RightDown
    case Down , LeftDown
    case Left , LeftUp
    static let allDirections: = [.Up, .RightUp , .Right , .RightDown , .Down , .LeftDown , .Left , .LeftUp]

    // 方向 度数
    var zRotation: CGFloat {
      let directionChangedAngle = CGFloat(M_PI * 2) / CGFloat(TSCompassDirection.allDirections.count)
      return directionChangedAngle * CGFloat(self.rawValue)
    }

    init(zRotation: CGFloat) {
      // 360°
      let twoPi = M_PI * 2

      let rotation = (Double(zRotation) + twoPi) % twoPi

      let orientation = rotation / twoPi

      let rawFacingValue = round(orientation * 16.0) % 16.0

      self = TSCompassDirection(rawValue: Int(rawFacingValue))!

    }
    init(string: String) {
      switch string {
      case "Up":
            self = .Up
      case "RightUp":
            self = .RightUp
      case "Right":
            self = .Right
      case "RightDown":
            self = .RightDown
      case "Down":
            self = .Down
      case "LeftDown":
            self = .LeftDown
      case "Left":
            self = .Left
      case "LeftUp":
            self = .LeftUp
      default:
            fatalError("Unknown or unsupported string ---- (string)")
      }
    }
   }


在TSOrientationComponent这个类中代码如下:


       class TSOrientationComponent: GKComponent {    // MARK: Properties

    var zRotation: CGFloat = 0.0 {
      didSet {
            let twoPi = CGFloat(M_PI * 2)
            zRotation = (zRotation + twoPi) % twoPi
      }
    }
    var compassDirection: TSCompassDirection {
      get {
            return TSCompassDirection(zRotation: zRotation)
      }
      set {
            zRotation = newValue.zRotation
      }
    }
   }


动画组件的太多 就不复制粘贴了。

在TSCharacterEntity这个类中我需要把组件添加进实体中去:


       let oritentationComponent = TSOrientationComponent()

      addComponent(oritentationComponent)
      let animationComponent = TSAnimationComponent(textureSize: CGSize(width: 100, height: 100), animations: animations)

      addComponent(animationComponent)


我通过这样一段代码在TSAnimationComponent这个类中获取在TSOrientationComponent这个组件的引用


guard let orientationComponent = entity?.componentForClass(TSOrientationComponent.self) else { fatalError("An AnimationComponent's entity must have an OrientationComponent.") }


这样我就把两者串联起来。

具体看代码,链接是 https://github.com/StoneStoneStoneWang/TSGame_Swift,感觉不错可以给我点个星:lol

下载:



页: [1]
查看完整版本: 对SpriteKit和GameplayKit的理解