아래는 기본적으로 벽이 많은 내 "Floor.swift"클래스입니다. 내가 화면의 상단에서 오는 개체를 가지고 일단 층과 SKSpriteNodes 충돌, 나는 SKSpriteNode을 제거하고 싶습니다. 아래는 내 플로어 클래스입니다. "FUNC의 didBegin (_ 연락처 : SKPhysicsContact)"에서SKPhysicsBody 충돌이 작동하지 않습니다.
import Foundation
import SpriteKit
class Floor: SKNode {
override init() {
super.init()
let leftWall = SKSpriteNode(color: UIColor.clear, 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.clear, 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.clear, 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)
self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!])
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
GameScene 클래스 내가 쓴 : 당신이 볼 수 있듯이
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) {
// contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
}
, 내 바닥 클래스에서 나는 self.physicsBody = SKPhysicsBody "로 객체를 설정 (본문 :) "내 모든 SKSpriteNode. 하지만 웬일인지 나는 무엇이 그렇게 탐지되는지 알지 못한다. 내 "Floor"클래스를 내 objectCategory, pointCategory, lifeCategory의 각 클래스에서 "contactTestBitMask"로 만들었습니다. 이 문제는 제가 잠시 동안 갇혀 있었던 아이디어였습니다.
업데이트 : 그래서 지금 아래에이 코드를 사용하고 있는데이 작동하고
! 유일한 문제는 내 "balloonCategory"도 제거하는 기본 사례이며이를 수행하고 싶지 않습니다. 그 카테고리 만 무시하고 풍선의 벽처럼 행동하게하려면 어떻게해야합니까?
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case balloonCategory | nailDropCategory:
print("nailDrop and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false))
lifeLost -= 1
case balloonCategory | pointCategory:
print("point and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
totalPoints += 2
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
case balloonCategory | lifeCategory:
print("life and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
lifeLost += 1
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
default:
contact.bodyB.node!.removeFromParent()
print("Removed \(String(describing: contact.bodyB.node!.name))")
}
}
nailDropCategory? pointCategory? lifeCategory? 아무도 당신이 비트 마스크를 정의하는 방법을 알지 못합니다. –
글쎄, 나는 다른 모든 클래스에 정의했고 다른 모든 충돌은 작동하기 때문에 나는 단지 잃어버린다. – Dewan
physics가 이미 프로젝트에서 작동하고 있다면 이것이 작동해야하는 것처럼 보인다. Github의 샘플 프로젝트 및 공유에서이 문제를 재현 할 수 있습니까? 솔루션이 디버깅에서 온 것처럼 보입니다. – peacetype