Ich möchte Boxen erstellen, und wenn Sie die Boxen mit der Kugel treffen, verschwindet die Box, die Sie getroffen haben.Spritekit - Beenden mit nicht abgefangener Ausnahme vom Typ NSException
Ich kann es machen, indem Sie eine einzelne Box in einer Funktion machen. Aber wenn ich eine Funktion mit einer For-Schleife mache, um mehrere Boxen zu erstellen, stürzt die App ab. Wenn ich die Variable SpriteKitNode innerhalb der Funktion mache, werden die Kästchen korrekt angezeigt, verschwinden jedoch nicht, wenn Sie sie mit der Kugel treffen. Jetzt mache ich die Variable außerhalb der Funktion, und die App wird abstürzen, wenn ich das Projekt ausführen.
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)
}
Und die Funktion, wo ich den Fehler übernehmen ist
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)
}
}
}
Natürlich ist dies nicht alle Codes. Lass es mich wissen, wenn du mehr brauchst.
Wenn ich das self.addChild (squareAnimation) direkt nach der for-Schleife setze, wird es 4 Boxen geben. Besser - aber es sollte 12 sein – jonask
Sie müssen Ihren Code umgestalten, um mehr Felder zu erhalten –
@jonask Sie sollten das addChild nicht außerhalb der for-Schleife verschieben, Sie sollten ein neues quadratisches Sprite als erste Zeile Ihres for erstellen Schleife. Es scheint gerade jetzt quadratischAnimation ist global, das ist sehr gefährlich, wie Sie durch Ihre Fehler sehen können. – Knight0fDragon