目前正在上课的SoloProject并决定自己学习SpriteKit。我决定做一个自上而下的僵尸射击游戏,我有很多问题,但到目前为止,这是我似乎无法解决或找不到解决方案的两个主要问题。
问题1
僵尸越接近目标,速度越慢,如果我提高速度,它们只是从屏幕外加速,而随着它们越来越近,速度仍会变慢(我读过某个地方,该功能在更新中很糟糕,但是我还是做到了...)
我想使其以3的速度生成,并且当玩家靠近或远离时它保持为3。(目前,我使用Youtube上的模拟摇杆代码来移动角色)< / p>
func zombieAttack() {
let location = player.position
for node in enemies {
let followPlayer = SKAction.move(to: player.position, duration: 3)
node.run(followPlayer)
//Aim
let dx = (location.x) - node.position.x
let dy = (location.y) - node.position.y
let angle = atan2(dy, dx)
node.zRotation = angle
//Seek
let velocityX = cos(angle) * 1
let velocityY = sin(angle) * 1
node.position.x += velocityX
node.position.y += velocityY
}
}
override func update(_ currentTime: TimeInterval) {
zombieAttack()
}
问题2
此外,当多个僵尸靠近玩家时(上面的功能),它们开始发出刺耳的光芒,因此我允许它们重叠在一起以停止发出刺眼的光芒。
我想使它们更牢固?如果那是描述它的正确方法。基本上,我希望他们和玩家挤在一起**。
如果我在碰撞中添加敌人,它会发出嘶哑的声音,试图到达相同的位置。
private func spawnZombie() {
let xPos = randomPosition(spriteSize: gameSpace.size)
let zombie = SKSpriteNode(imageNamed: "skeleton-idle_0")
zombie.position = CGPoint(x: -1 * xPos.x, y: -1 * xPos.y)
zombie.name = "Zombie\(zombieCounter)"
zombie.zPosition = NodesZPosition.enemy.rawValue
let presetTexture = SKTexture(imageNamed: "skeleton-idle_0.png")
zombie.physicsBody = SKPhysicsBody(texture: presetTexture, size: presetTexture.size())
zombie.physicsBody?.isDynamic = true
zombie.physicsBody?.affectedByGravity = false
zombie.physicsBody?.categoryBitMask = BodyType.enemy.rawValue
zombie.physicsBody?.contactTestBitMask = BodyType.bullet.rawValue
zombie.physicsBody?.collisionBitMask = BodyType.player.rawValue
zombie.zRotation = 1.5
zombie.setScale(0.2)
enemies.append(zombie)
zombieCounter += 1
run(SKAction.playSoundFileNamed("ZombieSpawn", waitForCompletion: false))
keepEnemiesSeperated() // ADDED FROM UPDATED EDIT*
addChild(zombie)
}
让我知道是否需要发布更多代码或对其进行更好的解释,我在学习Swift方面花了五个月的时间,只有一个星期半的SpriteKit经验,并且第一次在StackOverFlow上发布。预先谢谢大家!
编辑:我正在使用从having a node follow at a constant speed中找到的代码,但是由于它不起作用,我认为我做的不正确。我添加了以下代码:
private func keepEnemiesSeparated() {
// Assign constrain
for enemy in enemies {
enemy.constraints = []
let distanceBetween = CGFloat(60)
let constraint = SKConstraint.distance(SKRange(lowerLimit: distanceBetween), to: enemy)
enemy.constraints!.append(constraint)
}
}