我想制作盒子,当你用子弹击中盒子时,你击中的盒子就会消失。
我可以通过在函数中创建一个单独的框来使其工作。但是当我使用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)
}
}
}
当然,这不是所有的代码。如果您需要更多,请告诉我。
答案 0 :(得分:1)
通常,遇到如下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException'
后面跟着:原因 ..所以你能够理解你的项目发生了什么但是在这里我认为问题是你添加了太多次相同的节点用:
self.addChild(squareAnimation)
所以编译器会崩溃,因为你刚刚第一次在循环中添加了这个节点。
要解决这个问题,你可以在FOR循环后立即添加一行来告诉编译器"嘿,我是一个新属性,这是我的初始化,这发生在每个周期" :
let squareAnim = SKSpriteNode(imageNamed: "Squares")
使用squareAnim
处理其余行