swift sprite-kit skaction

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() }