我是Swift和Xcode的新手,正在尝试通过基本的游戏开发来学习。我目前有一个在启动时打开的主菜单,从中可以启动实际的游戏玩法。游戏按预期工作,但是当我进入主菜单然后又回到游戏中时,它的工作方式有所不同。
我尝试更改运动函数的定义方式,在其中运行代码的不同部分。我花了很长时间试图弄清楚这一点,并且由于缺乏对编程语言的了解,我相信我只是缺少了一些东西。
正在播放三个功能:
移动功能创建所有正确的SKAction来移动块。
func movement(){
touchScreen = false
let spawn = SKAction.run(({
() in
self.createBox()
}))
let distance = CGFloat(500)
let time = TimeInterval(0.005 * distance)
let delay = SKAction.wait(forDuration: (time+0.1))
let spawnDelay = SKAction.sequence([spawn, delay])
let spawnDelayForever = SKAction.repeatForever(spawnDelay)
self.run(spawnDelayForever)
let moveLeft = SKAction.moveBy(x: -distance - 100, y: 0, duration: time)
let remove = SKAction.removeFromParent()
moveRemove = SKAction.sequence([moveLeft, remove])
}
createBox函数仅创建具有所有相应属性的框。
func createBox(){
boxNode = SKNode()
boxNode.name = "boxNode"
box.color = SKColor.white
box.size = CGSize(width: 100, height: 100)
//Correct y value: 90
box.position = CGPoint(x: self.frame.width - 100, y: 400)
box.name = "box"
box.physicsBody = SKPhysicsBody(rectangleOf: box.size)
box.physicsBody?.affectedByGravity = false
box.physicsBody?.isDynamic = false
box.physicsBody?.categoryBitMask = PhysicsCatagory.box
box.physicsBody?.collisionBitMask = PhysicsCatagory.char
box.physicsBody?.contactTestBitMask = PhysicsCatagory.char
boxNode.addChild(box)
box.run(moveRemove)
self.addChild(boxNode)
}
还有touchesBegan函数,这是我运行代码的地方。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if gamestarted && touchScreen{
movement()
}
if gamestarted{
for touch in touches{
let location = touch.location(in: self)
if backtommBut.contains(location){
self.childNode(withName: "boxNode")?.removeFromParent()
enumerateChildNodes(withName: "boxNode", using: ({
(node, error) in
node.speed = 0
self.removeAllActions()
}))
createMainMenu()
}
}
}
预期结果是“框”从屏幕的右侧移至左侧。第一次工作正常。返回主菜单并再次点击播放按钮后,该框将显示在屏幕中间,并且不会创建新的框。任何建议或帮助将不胜感激。