최근에 내 게임에서 충돌 감지를 설정했는데 작동하지 않는 것 같습니다. Spritekit을 처음 접했을 때 나는 무엇이 일어나고 있는지 알고 싶습니다. 아래에서 나는 gamscene 클래스 인 didMoveToView, 뷰에서 볼을 생성하는 함수, My did begin contact 함수를 제공 할 것입니다. 내가 빨간 공과 빨간색 블록으로 작업 중이므로 충돌하는 것은 두 가지뿐입니다. 프로젝트에서보아야 할 사항이 있는지, 아래에 나와 있지 않은지 알려주십시오. 내가 블록에 물리 몸을 적용하고있는 categoryBitMaskSpriteKit, Swift에서 적절한 충돌 감지를 설정하는 방법 3
let redBallCategory: UInt32 = 0x1 << 0
let greenBallCategory: UInt32 = 0x1 << 1
let blueBallCategory: UInt32 = 0x1 << 2
let yellowBallCategory: UInt32 = 0x1 << 3
let redBlockCategory: UInt32 = 0x1 << 4
let yellowBlockCategory: UInt32 = 0x1 << 5
let greenBlockCategory: UInt32 = 0x1 << 6
let blueBlockCategory: UInt32 = 0x1 << 7
override func didMove(to view: SKView) {
physicsWorld.contactDelegate = self
의 번호를 정의하는 경우
import SpriteKit
import GameplayKit
class GameScene: SKScene, SKPhysicsContactDelegate {
var greenBlock = SKSpriteNode()
var redBlock = SKSpriteNode()
var yellowBlock = SKSpriteNode()
var blueBlock = SKSpriteNode()
var greenBall = SKSpriteNode()
var redBall = SKSpriteNode()
var yellowBall = SKSpriteNode()
var blueBall = SKSpriteNode()
var ball = SKSpriteNode()
var ballSpeedTop = CGVector(dx: 0, dy: 5)
var ballSpeedBottom = CGVector(dx: 0, dy: -5)
이입니다.
redBlock = self.childNode(withName: "redBlock") as! SKSpriteNode
redBlock.physicsBody?.categoryBitMask = redBlockCategory
redBlock.physicsBody?.collisionBitMask = redBallCategory
redBlock.physicsBody?.contactTestBitMask = redBallCategory
yellowBlock = self.childNode(withName: "yellowBlock") as! SKSpriteNode
greenBlock = self.childNode(withName: "greenBlock") as! SKSpriteNode
blueBlock = self.childNode(withName: "blueBlock") as! SKSpriteNode
redBlock.physicsBody?.affectedByGravity = false
redBlock.physicsBody?.isDynamic = true
greenBlock.physicsBody?.affectedByGravity = false
greenBlock.physicsBody?.isDynamic = true
blueBlock.physicsBody?.affectedByGravity = false
blueBlock.physicsBody?.isDynamic = false
yellowBlock.physicsBody?.affectedByGravity = false
yellowBlock.physicsBody?.isDynamic = false
initializeGame()
print("hello")
}
func initializeGame(){
Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(topBall), userInfo: nil, repeats: true)
Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(bottomBall), userInfo: nil, repeats: true)
}
// 위에 볼 Spawner를
func topBall() -> SKSpriteNode {
let ball: SKSpriteNode?;
if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 {
ball = SKSpriteNode(imageNamed: "redBall")
ball?.name = "redBall"
ball!.physicsBody?.categoryBitMask = redBallCategory
ball!.physicsBody?.collisionBitMask = redBlockCategory
ball!.physicsBody?.contactTestBitMask = redBlockCategory
} else {
ball = SKSpriteNode(imageNamed: "greenBall")
ball?.name = "greenBall"
}
ball!.size = CGSize(width: 30, height: 30)
ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5)
ball!.position = CGPoint(x: 0, y: 0)
ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2)
ball!.physicsBody?.affectedByGravity = false
ball!.physicsBody?.isDynamic = true
ball!.zPosition = 2
self.addChild(ball!)
ball!.physicsBody?.applyImpulse(ballSpeedTop)
return ball!
}
접촉 기능
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == redBallCategory && contact.bodyB.categoryBitMask == redBlockCategory){
print("touched red block")
} else if (contact.bodyB.categoryBitMask == redBallCategory && contact.bodyA.categoryBitMask == redBlockCategory){
print("touched a red block")
}
}
UPDATE ::: 내가 잘못하지만 내 문제는 기술적으로 아직 해결되지는 어디에서 발견했다. RedBall 카테고리 비트 마스크 등이 두 볼에 모두 적용된다는 것을 의미하는 if 문 외부에 redBall의 속성을 적용 했으므로 redBall 카테고리 비트 마스크가 생성 될 때 redBall 범주 비트 마스크를 적용하고 다른 categorybitmask 녹색 공이 생겨 났을 때. 내가 일을 가지고 있지만, 문제는 내가 그것을 녹색 또는 적색 어떠했는지에 따라 공을 개별 categorybitmasks을 적용 할 것을 얼마나
func topBall() -> SKSpriteNode {
let ball: SKSpriteNode?;
if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 {
ball = SKSpriteNode(imageNamed: "redBall")
ball?.name = "redBall"
} else {
ball = SKSpriteNode(imageNamed: "greenBall")
ball?.name = "greenBall"
}
ball!.size = CGSize(width: 30, height: 30)
ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5)
ball!.position = CGPoint(x: 0, y: 0)
ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2)
ball!.physicsBody?.affectedByGravity = false
ball!.physicsBody?.isDynamic = true
ball!.physicsBody?.categoryBitMask = redBallCategory
ball!.physicsBody?.collisionBitMask = redBlockCategory
ball!.physicsBody?.contactTestBitMask = redBlockCategory
ball!.zPosition = 2
self.addChild(ball!)
ball!.physicsBody?.applyImpulse(ballSpeedTop)
return ball!
}
이다. 당신이 양산 볼의 이미지와 이름을 설정 동일한 코드 블록에서 해당 category
, collision
및 contactTest
비트 마스크를 저장 한 다음 physicsbody에 실제 값을 설정하는 이러한 임시 변수를 사용하는
코드/문제를 정확하게 질문에 답하는 것이 도움이 될 가능성이 큽니다. – nathan