Так вот у меня есть этот кодКак сделать заявление работы только для выбранного уровня в Sprite Kit
if collision == PhysicsCategory.Cat | PhysicsCategory.Bed {
print("SUCCESS")
win()
if currentLevel < 10 {
currentLevel += 1
}
И в основном это утверждение работает для каждого уровня, что у меня есть. Я хочу, чтобы это сделать, как это только один уровень
if collision == PhysicsCategory.Cat | PhysicsCategory.Bed| PhysicsCategory.Bottle {
print("SUCCESS")
win()
if currentLevel < 10 {
currentLevel += 1
}
Но если я буду использовать его, это будет означать, что столкновение с бутылкой будет необходимо в каждом отдельном уровне, однако я хочу использовать его только в одном уровень
я пользуюсь быстрым
спасибо!
ДЛЯ @Mundi
Вот код в GameScene
import SpriteKit
Game scene
protocol EventListenerNode {
func didMoveToScene()
}
protocol InteractiveNode {
func interact()
}
struct PhysicsCategory {
static let None: UInt32 = 0
static let Cat: UInt32 = 0b1 // 1
static let Block: UInt32 = 0b10 // 2
static let Bed: UInt32 = 0b100 // 4
static let Edge: UInt32 = 0b1000 // 8
static let Label: UInt32 = 0b10000 // 16
static let Spring:UInt32 = 0b100000 //32
static let Hook: UInt32 = 0b1000000 //64
static let Bottle: UInt32 = 0b10000000 //64
}
class GameScene: SKScene, SKPhysicsContactDelegate {
var bedNode: BedNode!
var catNode: CatNode!
var lineNode: LineNode!
var bottleNode: BottleNode!
var desiredCollision = PhysicsCategory.Cat | PhysicsCategory.Bed
var playable = true
override func didMove(to view: SKView) {
// Calculate playable margin
let maxAspectRatio: CGFloat = 16.0/9.0
let maxAspectRatioHeight = size.width/maxAspectRatio
let playableMargin: CGFloat = (size.height - maxAspectRatioHeight)/2
let playableRect = CGRect(x: 0, y: playableMargin,
width: size.width, height: size.height-playableMargin*2)
physicsBody = SKPhysicsBody(edgeLoopFrom: playableRect)
physicsWorld.contactDelegate = self
physicsBody!.categoryBitMask = PhysicsCategory.Edge
enumerateChildNodes(withName: "//*", using: { node, _ in
if let eventListenerNode = node as? EventListenerNode {
eventListenerNode.didMoveToScene()
}
})
bedNode = childNode(withName: "bed") as! BedNode
catNode = childNode(withName: "//cat_body") as! CatNode
bottleNode = childNode(withName: "bottle") as! BottleNode
func didBegin(_ contact: SKPhysicsContact) {
let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
if collision == PhysicsCategory.Label | PhysicsCategory.Edge {
let labelNode = contact.bodyA.categoryBitMask == PhysicsCategory.Label ?
contact.bodyA.node :
contact.bodyB.node
if let message = labelNode as? MessageNode {
message.didBounce()
}
}
if !playable {
return
}
if currentLevel == 20 { // or whatever level you want
desiredCollision |= PhysicsCategory.Bottle
}
if collision == desiredCollision {
print ("Win")
win()
} else if collision == PhysicsCategory.Cat | PhysicsCategory.Edge {
print("FAIL")
lose()
и вот код из моего BottleBode
импорт SpriteKit
class BottleNode: SKSpriteNode, EventListenerNode {
func didMoveToScene() {
print("bottle added to scene")
let bedBodySize = CGSize(width: 40.0, height: 30.0)
physicsBody = SKPhysicsBody(rectangleOf: bedBodySize)
physicsBody!.isDynamic = true
physicsBody!.categoryBitMask = PhysicsCategory.Bottle
physicsBody!.collisionBitMask = PhysicsCategory.Block | PhysicsCategory.Edge | PhysicsCategory.Spring | PhysicsCategory.Spring
parent!.physicsBody!.contactTestBitMask = PhysicsCategory.Bed | PhysicsCategory.Edge
}
}
Я сделал, как вы сказали мне однако он все еще не работает, и когда CatNode касается земли, я теряю con и я получаю сообщение об ошибке.
Вот картина того, как он не работает https://i.stack.imgur.com/0JrMJ.png
и здесь ошибка.
https://i.stack.imgur.com/8VGRd.png
Не могли бы вы сказать мне, что случилось?
Спасибо большое
Гораздо более элегантный, чем мой ответ. Я думал, что есть лучший способ, но не мог думать об одном. – Nik
@Mundi Спасибо! Где было бы лучшее место для его вставки? –
Точно, где находится ваш старый код. – Mundi