gpt4 book ai didi

ios - Swift 3 Sprite 节点接触/碰撞行为不正常

转载 作者:行者123 更新时间:2023-11-30 12:47:39 26 4
gpt4 key购买 nike

我现在拥有的:我当前的大多数 Sprite Node 碰撞都按其应有的方式工作,除了与 FloorNode 接触的 boxNode 之外。我有 3 个 Sprite 节点:floorNode、playerNode 和 boxNode。当用户点击屏幕时,playerNode 在空中弹起,boxNode 从天花板上生成并掉落,直到接触到 FloorNode。

问题:我遇到麻烦的碰撞是 boxNode 与 FloorNode 碰撞时的情况。目前,当boxNode与floorNode接触时,游戏就结束了,而应该发生的只是boxNode在与floorNode碰撞时消失。

playerNode 与 FloorNode 碰撞 = 游戏结束

boxNode 与playerNode 碰撞=游戏结束

boxNode与floorNode发生碰撞=(发生碰撞时游戏结束)不应导致游戏结束。

这是我当前的代码:

import UIKit
import SpriteKit
import SceneKit
import Foundation
import CoreData
import GameplayKitstruct

ColliderType {

static let blueBallCategory: UInt32 = 0x1 << 0
static let floorNode: UInt32 = 0x1 << 1
static let firstBody: UInt32 = 0x1 << 2
static let secondBody: UInt32 = 0x1 << 3
static let boxNodeCategory: UInt32 = 0x1 << 4

}

class GameScene: SKScene, SKPhysicsContactDelegate {

floorNode.contactTestBitMask = 0
floorNode.categoryBitMask = ColliderType.floorNodeCategory
floorNode.collisionBitMask = ColliderType.playerNodeCategory | ColliderType.boxNodeCategory
self.physicsBody = floorNode
self.physicsBody?.friction = 0

playerNode.physicsBody?.categoryBitMask = ColliderType.playerNodeCategory
playerNode.physicsBody?.contactTestBitMask = 0
playerNode.physicsBody?.collisionBitMask = ColliderType.floorNodeCategory

boxNode.physicsBody?.categoryBitMask = ColliderType.boxNodeCategory
boxNode.physicsBody?.contactTestBitMask = ColliderType.playerNodeCategory | ColliderType.floorNodeCategory
boxNode.physicsBody?.collisionBitMask = 0



func didBegin(_ contact:SKPhysicsContact) {

let firstBody = contact.bodyA
let secondBody = contact.bodyB


if firstBody.categoryBitMask == ColliderType.playerNodeCategory || secondBody.categoryBitMask == ColliderType.boxNodeCategory{

self.boxNode.removeFromParent()

gameOver = true
self.speed = 0
timer.invalidate()


}else if firstBody.categoryBitMask == ColliderType.floorNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory {

gameOver = true
self.speed = 0
timer.invalidate()

}else if firstBody.categoryBitMask == ColliderType.boxNodeCategory || secondBody.categoryBitMask == ColliderType.floorNodeCategory{


self.boxNode.removeFromParent()



}else if contact.bodyA.categoryBitMask == ColliderType.boxNodeCategory{

contact.bodyA.node!.removeFromParent()

}else if contact.bodyB.categoryBitMask == ColliderType.boxNodeCategory{

contact.bodyB.node!.removeFromParent()

gameOver = true
self.speed = 0
timer.invalidate()


}

}

}

最佳答案

问题似乎是您没有正确考虑方法 didBegin(contact:) bodyA 和 bodyB 可以采用任一顺序这一事实。例如,如果物理体 X 与物理体 Y 发生碰撞,则可以使用 bodyA=X 和 bodyB=Y bodyA=Y 和 bodyB=X 调用方法 didBegun(contact:)。您的代码需要考虑到这一点,但目前还没有。

具体来说,bodyA 是地板,bodyB 是盒子的情况:这将失败,除了最后一个条件 - 结束游戏。

关于ios - Swift 3 Sprite 节点接触/碰撞行为不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com