我想做盒子,当你用子弹击中盒子时,你击中的盒子就会消失。
我可以通过在函数中制作一个单独的框来实现它。但当我用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'
后面跟着:原因。。所以你可以理解你的项目发生了什么,但我认为问题是你在同一个节点上添加了太多次:
self.addChild(squareAnimation)
所以编译器会崩溃,因为您刚刚在循环中第一次添加了这个节点。
要解决这个问题,可以在FOR循环之后立即添加一行代码,对编译器说“嘿,我有一个新属性,这是我的初始化,每个循环都会发生这种情况”:
let squareAnim = SKSpriteNode(imageNamed: "Squares")
用squareAnim处理其余的线条
关于swift - Spritekit-以NSException类型的未捕获异常终止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40149271/