swift - ¿Cómo mover al enemigo hacia un jugador en movimiento?
sprite-kit skaction (1)
zRotation
actualizar la
position
enemigo y la propiedad
zRotation
en cada actualización: llamada al método.
Buscador y un objetivo
Bien, entonces agreguemos algunos nodos a la escena. Necesitamos un buscador y un objetivo. El buscador sería un misil, y el objetivo sería una ubicación táctil. Le dije que debería hacer esto dentro de una actualización: método, pero usaré el método touchesMoved para hacer un mejor ejemplo. Así es como debe configurar la escena:
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
let missile = SKSpriteNode(imageNamed: "seeking_missile")
let missileSpeed:CGFloat = 3.0
override func didMoveToView(view: SKView) {
missile.position = CGPoint(x: frame.midX, y: frame.midY)
addChild(missile)
}
}
Puntería
Para implementar el objetivo, debes calcular cuánto tienes que rotar un sprite en función de su objetivo.
En este ejemplo, usaré un misil y haré que apunte hacia la ubicación táctil.
Para lograr esto, debe usar la función atan2, así (inside
touchesMoved:
method):
if let touch = touches.first {
let location = touch.locationInNode(self)
//Aim
let dx = location.x - missile.position.x
let dy = location.y - missile.position.y
let angle = atan2(dy, dx)
missile.zRotation = angle
}
Tenga en cuenta que atan2 acepta parámetros en orden y, x, en lugar de x, y.
Así que en este momento, tenemos un ángulo en el que debe ir el misil.
Ahora vamos a actualizar su posición en función de ese ángulo (agregue esto dentro de
touchesMoved:
método justo debajo de la parte de puntería):
//Seek
let vx = cos(angle) * missileSpeed
let vy = sin(angle) * missileSpeed
missile.position.x += vx
missile.position.y += vy
y eso seria todo. Aquí está el resultado:
Tenga en cuenta que en Sprite-Kit el ángulo de 0 radianes especifica el eje x positivo. Y el ángulo positivo está en sentido antihorario:
Lee más here .
Esto significa que debes orientar tu misil hacia la derecha en lugar de hacia arriba . También puede usar la imagen orientada hacia arriba, pero tendrá que hacer algo como esto:
missile.zRotation = angle - CGFloat(M_PI_2)
Estoy creando un juego de kit de sprites simple que posicionará a un jugador en el lado izquierdo de la pantalla, mientras que los enemigos se acercan desde la derecha. Dado que el jugador puede moverse hacia arriba y hacia abajo, quiero que los enemigos ajusten "inteligentemente" su camino hacia el jugador.
Intenté eliminar y volver a agregar la secuencia de SKAction cada vez que el jugador se mueve, pero el código a continuación hace que los enemigos no se muestren en absoluto, probablemente porque solo agrega y elimina cada acción en cada actualización de cuadro, por lo que nunca tienen la oportunidad de moverse .
Con la esperanza de obtener un poco de retroalimentación sobre la mejor práctica de crear enemigos "inteligentes" que se moverán hacia la posición de un jugador en cualquier momento.
Aquí está mi código:
func moveEnemy(enemy: Enemy) {
let moveEnemyAction = SKAction.moveTo(CGPoint(x:self.player.position.x, y:self.player.position.y), duration: 1.0)
moveEnemyAction.speed = 0.2
let removeEnemyAction = SKAction.removeFromParent()
enemy.runAction(SKAction.sequence([moveEnemyAction,removeEnemyAction]), withKey: "moveEnemyAction")
}
func updateEnemyPath() {
for enemy in self.enemies {
if let action = enemy.actionForKey("moveEnemyAction") {
enemy.removeAllActions()
self.moveEnemy(enemy)
}
}
}
override func update(currentTime: NSTimeInterval) {
self. updateEnemyPath()
}