ios - 碰撞类型源错误 - spritekit swift 游戏

标签 ios swift sprite-kit swift2

因此,我将我的游戏球类型从形状调整为图像,这迫使我重做游戏的物理特性。我是 swift 的新手,一直在努力解决我在 swift 游戏中的碰撞问题。

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 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
}

最佳答案

所以现在的问题是你的面具有两个定义:

删除这个:

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

只使用这个:

    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

与:

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

如果您已更正所有内容,则不会出现此错误:

// ball and ceil => ERROR

关于ios - 碰撞类型源错误 - spritekit swift 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289783/

相关文章:

ios - 如何在分配或泄漏工具中找到 Objective-C block

ios - 带正文的 Swift HTTP POST

node.js - 我想使用 Alamofire 在我的 swift 代码上使用登录 API (node.js)

ios - TextField 在按下完成时换行而不是关闭键盘 Xcode 10

ios - 使用 spritekit 和 objective-c 更改英雄的外观

ios - 如何在通用 Sprite 工具包游戏中调整 Sprite 大小

iphone - 在iPhone中使用带有userid参数的base64 haxcode将图像上传到服务器

ios - 模块 'Darwin' : Darwin -> Medialib -> UIKit -> Darwin 中的循环依赖

ios - 如何在每个 View 上添加 UISearchbar

ios - 如何获得以米为单位的场景高度(快速)?