我想做盒子,当你用子弹击中盒子时,你击中的盒子就会消失。
我可以通过在一个函数中制作一个盒子来让它工作。但是当我使用 for 循环创建多个框的函数时,应用程序会崩溃。当我在函数内创建 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)
}
}
}
当然,这不是所有的代码。如果您需要更多,请告诉我。
最佳答案
通常,当您遇到如下错误时:
Terminating app due to uncaught exception 'NSInvalidArgumentException'
它后跟:reason.. 所以你能够理解你的项目发生了什么,但在这里我认为问题是您添加了太多次相同的节点:
self.addChild(squareAnimation)
所以编译器会崩溃,因为你刚刚在循环中第一次添加了这个节点。
要解决这个问题,您可以在 FOR 循环之后立即添加一行,告诉编译器“嘿,我有一个新属性,这是我的初始化,每个循环都会发生这种情况”:
let squareAnim = SKSpriteNode(imageNamed: "Squares")
并使用 squareAnim 处理其余的线条
关于swift - Spritekit - 以 NSException 类型的未捕获异常终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40149271/