Mueve la caja en la dirección del tacto, y ha envuelto al alcanzar el borde de la pantalla -- game campo con swift campo con ios campo con sprite-kit camp codereview Relacionados El problema

Moves box in direction of touch, and has wraparound when reaching edge of screen


5
vote

problema

Español

Parte de mí piensa que sería más sencillo de zambullir la API Move Move y simplemente la posición actualizada con un temporizador. Sé que eso es lo que hice con un juego de serpiente de lienzo de JS. Hace un tiempo. Pero también estoy tratando de aprender la API de iOS, así que, a menos que esa sea claramente la mejor opción, preferiría la forma más idiomática.

Además, estoy bastante seguro de que técnicamente esto podría desbordarse, pero parece casi improbable es improbable a menos que esa sea la meta de alguien.

  override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {     /* Called when a touch begins */     snakeHead.removeAllActions()     var actionMove = SKAction()     if notYetTouched {         introLabel.removeFromParent()         notYetTouched = false         actionMove = SKAction.moveByX(CGFloat(self.size.width / 2), y: 0, duration: 1)     } else {         for touch: AnyObject in touches {             let location = touch.locationInNode(self)             actionMove = SKAction.moveBy(CGVector(dx: location.x - snakeHead.position.x , dy: location.y - snakeHead.position.y), duration: 1)                         }     } snakeHead.runAction(   SKAction.repeatActionForever(     SKAction.sequence( [ SKAction.runBlock({ self.wraparound(actionMove) }), actionMove]) ) ) }  func wraparound(defaultAction: SKAction) -> SKAction? {      if snakeHead.position.y > size.height  {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToY(1, duration:0)          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.y < 1 {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToY(size.height - 1, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.x > size.width  {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToX(1, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.x < 1 {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToX(size.width, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else {         return defaultAction     }     return nil }   
Original en ingles

Part of me thinks that it would be simpler to ditch Apple's move API and just updated position with a timer. I know that's what I did with a JS canvas snake game I built a while ago. But I'm also trying to learn the iOS API so unless that's clearly the best choice I'd prefer the most idiomatic way.

Also, I'm pretty sure that technically this could overflow but it seems almost impossibly unlikely unless that were someone's goal.

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {     /* Called when a touch begins */     snakeHead.removeAllActions()     var actionMove = SKAction()     if notYetTouched {         introLabel.removeFromParent()         notYetTouched = false         actionMove = SKAction.moveByX(CGFloat(self.size.width / 2), y: 0, duration: 1)     } else {         for touch: AnyObject in touches {             let location = touch.locationInNode(self)             actionMove = SKAction.moveBy(CGVector(dx: location.x - snakeHead.position.x , dy: location.y - snakeHead.position.y), duration: 1)                         }     } snakeHead.runAction(   SKAction.repeatActionForever(     SKAction.sequence( [ SKAction.runBlock({ self.wraparound(actionMove) }), actionMove]) ) ) }  func wraparound(defaultAction: SKAction) -> SKAction? {      if snakeHead.position.y > size.height  {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToY(1, duration:0)          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.y < 1 {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToY(size.height - 1, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.x > size.width  {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToX(1, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else if snakeHead.position.x < 1 {         snakeHead.removeAllActions()         let repositionSnakeHeadAction = SKAction.moveToX(size.width, duration: NSTimeInterval(0))          snakeHead.runAction( SKAction.sequence( [ repositionSnakeHeadAction, SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock({ wraparound(defaultAction) }), defaultAction]))] ) )     } else {         return defaultAction     }     return nil } 
           
 
 

Lista de respuestas


Relacionados problema

47  Ruedas giratorias rápidas: el desafío comunitario de mayo de 2017  ( Swiftly turning wheels the may 2017 community challenge ) 
Este es mi intento de mayo 2017 Desafío comunitario En Swift, con una cadena que consiste en Enlaces rígidos. Tomé esto como una oportunidad para aprender...

1  Visualización de Sprites que causan retraso (juego de plataformas 2D)  ( Displaying sprites causing lag 2d platformer game ) 
He hecho un juego de plataformas 2D. El mapa es una matriz y también tengo una matriz separada para entidades como monedas giratorias y enemigos en movimiento...

1  Array booleana, NAND de [SKSPRITENODES]  ( Boolean array nand of skspritenodes ) 
Estoy usando SpriteKit, usando en contacto para detectar lo que los usuarios han golpeado, es decir, no hay colisiones, etc. Tengo una matriz de nodos de sp...

4  Cantidades de puntuación animada para el juego  ( Animated score amounts for game ) 
Esta es una clase simple para una etiqueta con una puntuación que anima contando o hacia abajo. Cuando alguien en el juego puntúa puntos, los números cuentan ...

11  Bedazzling mis animaciones bejeweled  ( Bedazzling my bejeweled animations ) 
He pasado unos días trabajando en las animaciones para mi Bejeweled Clone y estoy bastante contento con Los resultados, por lo que estoy publicando el códig...

2  Subclase SKSPRITENODENODE  ( Subclass skspritenode ) 
Decidí Subclase SKSpriteNode Para una prueba de juego en Swift hoy y pronto se dio cuenta de que no era tan simple como lo sugerido mi antecedentes de Objec...

5  Juego Sprite / Juego Swift  ( Sprite kit swift game ) 
Estaba escribiendo un juego en Swift y Sprite Kit y es muy simple. Funciona perfectamente que no sea el hecho de que se vuelve un poco lento a veces. Me gusta...

6  Interfaz de usuario para juego de estrategia  ( User interface for strategy game ) 
He estado trabajando un juego de estrategia para iOS por un rato por un rato, y cada vez que agrego funcionalidad al modelo del juego, me encuentro construyen...

3  Creando una clase que tiene un método que ejecuta cada cuadro  ( Creating a class which has a method running every frame ) 
Estoy trabajando en Objective-C , SKSpriteKit y estoy tratando de crear una clase que funcione tanto en OS X como en iOS de flexibilidad. Recientemente, ...

1  Skaction en Sklabel con matriz de cuerdas  ( Skaction on sklabel with array of strings ) 
Tengo un Sklabel adjunto a un sknode padre y una matriz de cuerdas: class OrderForm include ActiveModel::Model def persisted? false end attr_...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos