2016-07-10 3 views
3

私はゲームボールのタイプを形状からイメージに調整して、ゲームの物理をやり直さなければなりませんでした。私は速くて新しく、私の速いゲームで私の衝突を修正するのに苦労しました。衝突型ソースエラー - スプライトキート素早くゲーム

class GameScene: SKScene, GameDelegate, SKPhysicsContactDelegate { 
    var ball: Ball! 
    let ballSpeedX = CGFloat(500) 
    //ball = Ball(imageNamed:"colorBall.png") 
    enum CollisionTypes: UInt32 { 
     case Floor = 1 
     case Ball = 2 
    } 
    // board 
    let boards = Boards.make(CollideType.BoardStart.rawValue) 
    var lastBoard: SKNode? 
    var boardSpeedY: CGFloat { get { return CGFloat(160) * accelerate }} 
    let boardDistanceY = CGFloat(300) 
    let boardYDistanceHide = CGFloat(30) 

    override func didMoveToView(view: SKView) { 
     self.physicsWorld.gravity = CGVectorMake(0, 0) 
     self.physicsWorld.contactDelegate = self 
     let flooeBody = SKPhysicsBody.init(edgeLoopFromRect: self.frame) 
     self.physicsBody = floorBody 
     self.physicsBody!.affectedByGravity = false 
     self.physicsBody!.usesPreciseCollisionDetection = true 
     self.physicsBody!.dynamic = true 
     self.physicsBody!.mass = 0 
     self.physicsBody!.friction = 0 
     self.physicsBody!.linearDamping = 0 
     self.physicsBody!.angularDamping = 0 
     self.physicsBody!.restitution = 1 
     self.physicsBody!.categoryBitMask = CollisionTypes.Floor.rawValue 
     self.physicsBody!.contactTestBitMask = CollisionTypes.Ball.rawValue 

     // Prepare the ball - physics engine. 
     ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.width/2) 
     ball.physicsBody!.affectedByGravity = true 
     ball.physicsBody!.restitution = 0.8 
     ball.physicsBody!.linearDamping = 0 
     ball.physicsBody!.friction = 0.3 
     ball.physicsBody!.dynamic = true 
     ball.physicsBody!.mass = 0.5 
     ball.physicsBody!.allowsRotation = true 
     ball.physicsBody!.categoryBitMask = CollisionTypes.Ball.rawValue 
     ball.physicsBody!.contactTestBitMask = CollisionTypes.Floor.rawValue 
     ball.physicsBody!.collisionBitMask = CollisionTypes.Floor.rawValue 
     ball.hidden = false 
     self.addChild(ball) 

     // scene 
     self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     self.physicsBody!.categoryBitMask = CollideType.Scene.toMask() 
     self.physicsBody!.dynamic = false 
     self.physicsBody!.friction = 0 

     // ceil 
     let ceil = SKShapeNode(rectOfSize: CGSize(width: self.frame.width, height: 2)) 
     ceil.position.x = CGRectGetMidX(self.frame) 
     ceil.position.y = self.frame.height - CGRectGetMidY(ceil.frame) 
     ceil.physicsBody = SKPhysicsBody(rectangleOfSize: ceil.frame.size) 
     ceil.physicsBody!.categoryBitMask = CollideType.Ceil.toMask() 
     ceil.physicsBody!.dynamic = false 
     ceil.alpha = 0 
     self.addChild(ceil) 

     // floor 
     let floor = SKShapeNode(rectOfSize: CGSize(width: self.frame.width, height: 2)) 
     floor.position.x = CGRectGetMidX(self.frame) 
     floor.position.y = CGRectGetMidY(floor.frame) 
     floor.physicsBody = SKPhysicsBody(rectangleOfSize: floor.frame.size) 
     //floor.physicsBody!.categoryBitMask = CollideType.Floor.toMask() two 
     floor.physicsBody!.dynamic = false 
     floor.alpha = 0 
     self.addChild(floor) 
} 

これは私がセットアップしようとした物理学です。以下は、タッチ時にアプリがクラッシュする原因となる衝突のエラーです。以下のように

func didBeginContact(contact: SKPhysicsContact) { 

    let bitMaskAAndB = contact.bodyA.categoryBitMask == CollisionTypes.Floor.rawValue && contact.bodyB.categoryBitMask == CollisionTypes.Ball.rawValue 

    let ballAndBoardMask = CollideType.Ball.toMask() | boards.usedCollideMasks 


    // ball and board error: CANNOT CONVERT VALUE OF TYPE BOOL TO EXPCTD ARG TYPE UIINT32 

    if bitMaskAAndB | ballAndBoardMask == ballAndBoardMask { 

     let boardNode: SKNode! = contact.bodyA.categoryBitMask == CollideType.Ball.toMask() ? contact.bodyB.node : contact.bodyA.node 
     let board = boardNode.bind as! BoardDelegate 
     board.didBeginContact(boardNode, ball: ball, contact: contact, game: self) 
    } 

    // ball and ceil => ERROR 
    else if bitMaskAAndB == CollideType.toMask([.Ball, .Ceil]) { 
     stopGame() 
    } 

    // ball and floor => stop game 
     else if bitMaskAAndB == CollideType.toMask([.Ball, .Floor]) { 
      stopGame() 
     } 
} 

func didEndContact(contact: SKPhysicsContact) { 

    let ballAndBoardMask = CollideType.Ball.toMask() | boards.usedCollideMasks 

    // ball and board, handle it by board delegate 

    if contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask | ballAndBoardMask == ballAndBoardMask { 

     let boardNode: SKNode! = contact.bodyA.categoryBitMask == CollideType.Ball.toMask() ? contact.bodyB.node : contact.bodyA.node 
     let board = boardNode.bind as! BoardDelegate 
     board.didEndContact(boardNode, ball: ball, contact: contact, game: self) 
    } 
} 

CollideType定義:

enum CollisionTypes: UInt32 { 
     case Floor = 1 
     case Ball = 2 
    } 

のみを使用:

はこの1つを削除します。

enum CollideType: Int { 

case Scene = 0 
case Ceil = 1 
case Floor = 2 
case Ball = 3 
case BoardStart = 4 

func toMask()-> UInt32 { 
    return UInt32(1 << self.rawValue) 
} 
static func toMask(masks: [CollideType])-> UInt32 { 
    var toMask = UInt32(0) 
    for type in masks { 
     toMask |= type.toMask() 
    } 
    return toMask 
} 
+0

はい、私は:

let bitMaskAAndB = contact.bodyA.categoryBitMask == CollideType.Floor.toMask() ? contact.bodyB.categoryBitMask : CollideType.Ball.toMask() 

あなたはまだ、このエラーを持っていないだろう、すべての正しいを持っている場合申し訳ありませんが、 –

+0

問題はありません。現在、CollideType定義もあります。 –

答えて

1

だから問題は、今、あなたのマスクのための2つの定義を持っているということですこの1つ:

enum CollideType: Int { 

     case Scene = 0 
     case Ceil = 1 
     case Floor = 2 
     case Ball = 3 
     case BoardStart = 4 

     func toMask()-> UInt32 { 
      return UInt32(1 << self.rawValue) 
     } 
     static func toMask(masks: [CollideType])-> UInt32 { 
      var toMask = UInt32(0) 
      for type in masks { 
       toMask |= type.toMask() 
      } 
      return toMask 
     } 

CollideTypeの定義に一致するすべてのコードを修正します。

didBeginContactで、この行を修正:

let bitMaskAAndB = contact.bodyA.categoryBitMask == CollisionTypes.Floor.rawValue && contact.bodyB.categoryBitMask == CollisionTypes.Ball.rawValue 

で:

// ball and ceil => ERROR 
+0

ありがとう、私はこれらの提案をして、起動時にアプリケーションが起動時にクラッシュするエラーはありません。「オプション値をアンラッピングしている間に予期せぬことにnilが見つかりました」..それはどういう意味かわかりません。 CollideTypeの定義.'ありがとう! –

+0

NO初期化オブジェクトにプロパティを使用/割り当てしようとすると、このエラーが発生します。つまり、「すべてのCollisionTypesをCollideTypeで置き換える(CollideType。 .toMask())」という意味です。 –

関連する問題