需要帮助更改在 didMoveToView 中调用的 SKSpriteNode 的速度、方向和生成时间
Need help changing speed, direction and spawn time of SKSpriteNode called in didMoveToView
抱歉,我的文字太长了,我只是想很好地解释一下我的游戏是如何设置的,这样您就可以更好地理解我的问题。
我有几个关于我目前使用 swift 制作的游戏的问题。
我正在制作一个玩家必须躲避敌人的游戏。播放器是一个 SKSpriteNode 图像,它获取它的物理体并添加到这里的场景中:
override func didMoveToView(view: SKView) {
player.position = CGPoint(x: size.width/2, y: size.height/2)
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
player.physicsBody?.categoryBitMask = PhysicsCategory.Player
player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
player.physicsBody?.collisionBitMask = PhysicsCategory.None
player.physicsBody?.usesPreciseCollisionDetection = true
addChild(player)
}
这个实现似乎很有效,我在玩家和敌人之间进行了碰撞。
敌人也被初始化为 SkSpriteNodes:
func addEnemy() {
let enemy = SKSpriteNode(imageNamed: “enemy”)
enemy.name = “enemy”
enemy.position = CGPoint(x: size.height/2, y: size.width/2)
self.addChild(enemy)
enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.width/2.75)
enemy.physicsBody?.dynamic = true
enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
enemy.physicsBody?.collisionBitMask = PhysicsCategory.None
// code for making the enemies move here (including speed)
}
enemy.runAction(SKAction.sequence([moveAction,removeAction]))
}
并且在 didMoveToView(view: SKView) 中每 0.7 秒不断生成,如下所示:
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addEnemy),
SKAction.waitForDuration(0.7)
])
))
所以我的问题如下。这是实现我想要实现的目标的最合适方法吗?那是;以不同的时间间隔不断产生多种不同类型的敌人?
我正在努力弄清楚如何(例如)让敌人在 10 秒后才开始生成,或者如何通过按下屏幕上的 UIButton 来改变敌人的方向?似乎因为它们都是在视图加载时调用和创建的,所以我不能不断地改变方向、速度等。
执行此操作的更好方法是什么,或者我该如何做我需要的?
谢谢:)
听起来您想做的是使用更新方法而不是使用重复的 SKAction。
在更新中,您使用 currentTime 计算已经过去了多少时间,然后决定是否应该生成敌人。这也让您有机会根据游戏的当前状态以任何您想要的方式生成敌人。
就按钮而言。这实际上取决于您的游戏,但大多数游戏都有某种倒计时或在游戏开始前需要某种用户交互。
编辑
我的 swift 有点生疏,但它会像这样...
var lastUpdateTime = 0.0;
var spawnTimer = 0.0;
var nextSpawnTime = 10.0;
override func update(currentTime: CFTimeInterval) {
if (lastUpdateTime == 0.0)
{
lastUpdateTime = currentTime
return
}
spawnTimer += currentTime-lastUpdateTime
//Do any other update logic here
if (spawnTimer >= nextSpawnTime)
{
spawnTimer = 0.0
spawn()
}
lastUpdateTime = currentTime
}
func spawn ()
{
//spawn and change nextSpawnTime if you wish
println("spawn")
}
希望这对您有所帮助并且有意义。
抱歉,我的文字太长了,我只是想很好地解释一下我的游戏是如何设置的,这样您就可以更好地理解我的问题。 我有几个关于我目前使用 swift 制作的游戏的问题。
我正在制作一个玩家必须躲避敌人的游戏。播放器是一个 SKSpriteNode 图像,它获取它的物理体并添加到这里的场景中:
override func didMoveToView(view: SKView) {
player.position = CGPoint(x: size.width/2, y: size.height/2)
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
player.physicsBody?.categoryBitMask = PhysicsCategory.Player
player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
player.physicsBody?.collisionBitMask = PhysicsCategory.None
player.physicsBody?.usesPreciseCollisionDetection = true
addChild(player)
}
这个实现似乎很有效,我在玩家和敌人之间进行了碰撞。
敌人也被初始化为 SkSpriteNodes:
func addEnemy() {
let enemy = SKSpriteNode(imageNamed: “enemy”)
enemy.name = “enemy”
enemy.position = CGPoint(x: size.height/2, y: size.width/2)
self.addChild(enemy)
enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.width/2.75)
enemy.physicsBody?.dynamic = true
enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
enemy.physicsBody?.collisionBitMask = PhysicsCategory.None
// code for making the enemies move here (including speed)
}
enemy.runAction(SKAction.sequence([moveAction,removeAction]))
}
并且在 didMoveToView(view: SKView) 中每 0.7 秒不断生成,如下所示:
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addEnemy),
SKAction.waitForDuration(0.7)
])
))
所以我的问题如下。这是实现我想要实现的目标的最合适方法吗?那是;以不同的时间间隔不断产生多种不同类型的敌人?
我正在努力弄清楚如何(例如)让敌人在 10 秒后才开始生成,或者如何通过按下屏幕上的 UIButton 来改变敌人的方向?似乎因为它们都是在视图加载时调用和创建的,所以我不能不断地改变方向、速度等。
执行此操作的更好方法是什么,或者我该如何做我需要的?
谢谢:)
听起来您想做的是使用更新方法而不是使用重复的 SKAction。
在更新中,您使用 currentTime 计算已经过去了多少时间,然后决定是否应该生成敌人。这也让您有机会根据游戏的当前状态以任何您想要的方式生成敌人。
就按钮而言。这实际上取决于您的游戏,但大多数游戏都有某种倒计时或在游戏开始前需要某种用户交互。
编辑
我的 swift 有点生疏,但它会像这样...
var lastUpdateTime = 0.0;
var spawnTimer = 0.0;
var nextSpawnTime = 10.0;
override func update(currentTime: CFTimeInterval) {
if (lastUpdateTime == 0.0)
{
lastUpdateTime = currentTime
return
}
spawnTimer += currentTime-lastUpdateTime
//Do any other update logic here
if (spawnTimer >= nextSpawnTime)
{
spawnTimer = 0.0
spawn()
}
lastUpdateTime = currentTime
}
func spawn ()
{
//spawn and change nextSpawnTime if you wish
println("spawn")
}
希望这对您有所帮助并且有意义。