gpt4 book ai didi

swift - SKPhysicsContact 未检测到类别位掩码碰撞

转载 作者:可可西里 更新时间:2023-11-01 00:56:09 24 4
gpt4 key购买 nike

所以我下面有我的“Floor.swift”类,它基本上是一堆墙。我有来自屏幕顶部的对象,一旦 Floor 和 SKSpriteNodes 发生碰撞,我希望 SKSpriteNode 被移除。下面是我的 Floor 类。

import Foundation
import SpriteKit

class Floor: SKNode {
override init() {
super.init()

let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
leftWall.position = CGPoint(x: 0, y: 50)
leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
leftWall.physicsBody!.isDynamic = false
self.addChild(leftWall)

let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
rightWall.position = CGPoint(x: 375, y: 50)
rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
rightWall.physicsBody!.isDynamic = false
self.addChild(rightWall)

let bottomWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 500, height: 10))
bottomWall.position = CGPoint(x: 150, y: -5)
bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size)
bottomWall.physicsBody!.isDynamic = false
self.addChild(bottomWall)

// Set the bit mask properties
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = objectCategory | pointCategory | lifeCategory
self.physicsBody?.collisionBitMask = dodgeCategory
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}

然后在“func didBegin(_ contact: SKPhysicsContact)”下我的 GameScene 类中我写道:

 if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
contact.bodyB.node!.removeFromParent()
print("COLLISION")
}

但出于某种原因,我没有得到任何检测。我让我的“Floor”类成为我的 objectCategory、pointCategory、lifeCategory 的每个类上的“contactTestBitMask”。我究竟做错了什么!?检测到我的其他碰撞,但没有检测到这一次。

最佳答案

您的 leftWallrightWallbottomWall 具有默认的 contactTestcollision位掩码,所以会与一切发生冲突并与任何事物产生联系。除了它们都将它们的 isDynamic 属性设置为 false,所以它们不能碰撞或接触任何东西(尽管如果其他东西有 isDynamic 设置为 true)。

但这可能就是您想要的(地板和墙壁通常不是动态的)。我怀疑真正的问题是 Floor 类的对象没有物理体,除非你在其他地方初始化它。你有这些行:

self.physicsBody?.categoryBitMask = ...self.physicsBody?.contactTestBitMask = ...self.physicsBody?.collisionBitMask = ...

但您实际上还没有创建 self.physicsBody。除非你使用了可选链接 (self,phyicsBody?),否则你的代码会崩溃,所以 Swift 会遇到“?”并说“哦 - 它是可选的,而且不存在。那我就到此为止吧”

至少,尝试使用 3 个墙对象的物理体为您的 Floor 对象创建一个物理体:

Self.physicsBody = SKPhysicsBody( body : [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])

(SKPhysicsBody 有一个初始化程序,它采用一组物理实体来创建一个新的物理实体)。

关于swift - SKPhysicsContact 未检测到类别位掩码碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47946410/

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