将代码添加到我的update(_ currentTime: TimeInterval)
函数后,我的应用程序代码继续崩溃。有没有更好的方式表达我的代码,所以它不会崩溃?
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var startScreen = SKSpriteNode()
var Ball = SKSpriteNode()
var playerPaddle = SKSpriteNode()
var computerPaddle = SKSpriteNode()
var playerScore = SKLabelNode()
var comScore = SKLabelNode()
override func didMove(to view: SKView) {
startScreen = childNode(withName: "startScreen") as! SKSpriteNode
Ball = childNode(withName: "Ball") as! SKSpriteNode
playerPaddle = childNode(withName: "playerPaddle") as! SKSpriteNode
computerPaddle = childNode(withName: "computerPaddle") as! SKSpriteNode
playerScore = childNode(withName: "playerScore") as! SKLabelNode
comScore = childNode(withName: "comScore") as! SKLabelNode
let bodyBorder = SKPhysicsBody(edgeLoopFrom: self.frame)
bodyBorder.friction = 0
bodyBorder.restitution = 1
self.physicsBody = bodyBorder
Ball.physicsBody?.applyImpulse(CGVector(dx:20, dy:10))
}
func gameBegin() {
playerScore.text = String(0)
comScore.text = String(0)
}
func playerPoint() {
var comScoreInt: Int = Int(comScore.text!)!
comScoreInt += 1
comScore.text = String(comScoreInt)
Ball.position = (CGPoint(x:0, y:0))
Ball.physicsBody?.applyImpulse(CGVector(dx:-20,dy:-10))
}
func comPoint() {
var playerScoreInt: Int = Int(playerScore.text!)!
playerScoreInt += 1
playerScore.text = String(playerScoreInt)
Ball.physicsBody?.applyImpulse(CGVector(dx:20,dy:10))
Ball.position = (CGPoint(x:0, y:0))
}
func pointCount() {
computerPaddle.run(SKAction.moveTo(y: Ball.position.y, duration: 0.5))
if Ball.position.x <= playerPaddle.position.x - 42 {
playerPoint()
} else if Ball.position.x >= computerPaddle.position.x + 42 {
comPoint()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
playerPaddle.run(SKAction.moveTo(y: location.y, duration: 0.1))
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
playerPaddle.run(SKAction.moveTo(y: location.y, duration: 0))
}
}
override func update(_ currentTime: TimeInterval) {
pointCount()
}
}
我是SpriteKit的新手,所以我不知道如何提高这段代码的效率。非常感谢帮助!
编辑:
速度非常慢,可以通过几分钟来识别得分和球的位置。 playerScore / comScore.text代码没有任何问题,在gamescene.sks中设置为0
答案 0 :(得分:0)
我认为问题是playerScore.text
或comScore.text
可能是nil
,当您尝试强制解包时,应用会崩溃。在代码中,您要为comScore.text
中的playerScore.text
和func gameBegin()
分配值。但它并没有被称为任何地方。尝试调用该函数可能是didMoveto view
函数。
答案 1 :(得分:0)
我认为问题在于铸造这条线
Int(playerScore.text!)! and Int(comScore.text!)!
相反,你必须像这样使用
Int(comScore.text?) ?? 0
Int(playerScore.text?) ?? 0
答案 2 :(得分:0)
关于您的崩溃,您忘记为playerScore
和comScore
提供值(您可以在gameBegin
函数内调用函数didMove
)并且编译器可能会崩溃到线:
var comScoreInt: Int = Int(comScore.text!)!
因为comScore
文字为空。
我认为函数pointCount()
可以通过以下方式更正:
func pointCount() {
if computerPaddle.action(forKey: "moveTo") == nil {
computerPaddle.run(SKAction.moveTo(y: Ball.position.y, duration: 0.5), withKey:"moveTo")
if Ball.position.x <= playerPaddle.position.x - 42 {
playerPoint()
} else if Ball.position.x >= computerPaddle.position.x + 42 {
comPoint()
}
}
}
此更正仅在computerPaddle
没有任何先前的“ moveTo ”执行时才限制此操作的执行..