Я хочу сделать коробки, и когда вы нажмете на ящики с пулей, коробка, в которую вы попали, исчезнет.Spritekit - завершение с неперехваченным исключением типа NSException
Я могу заставить его работать, создав единую ячейку в функции. Но когда Im создает функцию с циклом для создания нескольких ящиков, приложение будет разбиваться. Когда я делаю переменную SpriteKitNode внутри функции, поля будут отображаться правильно, но не исчезнут, когда вы нажмете их на пулю. Теперь я создаю переменную вне функции, и приложение будет сбой при запуске проекта.
import SpriteKit
struct PhysicsCategory {
static let Enemy : UInt32 = 1
static let Bullet : UInt32 = 2
}
class GameScene: SKScene, SKPhysicsContactDelegate {
var mainAnimation = SKSpriteNode(imageNamed: "Spaceship")
var squareAnimation = SKSpriteNode(imageNamed: "Squares")
override func didMove(to view: SKView) {
physicsWorld.contactDelegate = self
makeBanners()
spaceshipPosition()
makeSquares(numberOfSquaresInRow: 5, numberOfRows: 4, squareRadius: 5, rowSpacing: 40, yStart: 120)
}
И функция, где я предполагаю, что ошибка является
func makeSquares (numberOfSquaresInRow: Int, numberOfRows: Int, squareRadius: CGFloat, rowSpacing: CGFloat, yStart: CGFloat) {
for rowNumber in 0...(numberOfRows - 1) {
let squareSpacing = (self.frame.size.width - (CGFloat(numberOfSquaresInRow) * squareRadius * 2))/CGFloat(numberOfSquaresInRow + 1)
var extraSpacing = CGFloat(0)
if rowNumber % 2 == 1 {
extraSpacing = squareSpacing/2
}
for squareNumber in 0...(numberOfSquaresInRow - 1) {
squareAnimation.size = CGSize(width: 30, height: 30)
let xPosition : CGFloat = extraSpacing + squareSpacing + squareRadius + (squareRadius * 2 * CGFloat(squareNumber)) + (squareSpacing * CGFloat(squareNumber))
let yPosition : CGFloat = yStart + (CGFloat(rowNumber) * squareSpacing)
squareAnimation.position = CGPoint(x: xPosition, y: yPosition)
squareAnimation.physicsBody = SKPhysicsBody(circleOfRadius: squareRadius)
squareAnimation.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
squareAnimation.physicsBody?.contactTestBitMask = PhysicsCategory.Bullet
squareAnimation.physicsBody?.affectedByGravity = false
squareAnimation.physicsBody?.isDynamic = false
self.addChild(squareAnimation)
}
}
}
Конечно, это не все коды. Дайте мне знать, если вам нужно больше.
Когда я положил self.addChild (squareAnimation) сразу после цикла for, будет 4 поля. Лучше - но должно быть 12 – jonask
. Вы должны реорганизовать свой код, чтобы получить больше полей. –
@jonask. Вы не должны были перемещать addChild вне цикла for, вы предполагали создать новый квадрат спрайта в качестве первой строки для петля. Кажется, сейчас squareAnimation является глобальным, это очень опасно, как вы можете видеть по вашим ошибкам. – Knight0fDragon