Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi; Parte 2

October 22|5 Vistas|

Resumen: Si eres nuevo aquí, tal vez quieras suscribirte a mi feed RSS o seguirme en Twitter. ¡Gracias por su visita! Aprende a hacer un juego como Super Mario! Actualizar 02/02/14: He actualizado este tutorial para el kit de Sprite para celebrar el lanzamien

Advertisement

Si eres nuevo aquí, tal vez quieras suscribirte a mi feed RSS o seguirme en Twitter. ¡Gracias por su visita!

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


Aprende a hacer un juego como Super Mario!

Actualizar 02/02/14: He actualizado este tutorial para el kit de Sprite para celebrar el lanzamiento de la segunda edición del juego de plataformas Starter Kit, que está completamente actualizado para el kit de Sprite. Disfruta!

Bienvenido nuevamente a nuestra serie de tutoriales de 2 partes de Sprite Kit para hacer un juego como Super Mario!

En la primera parte de la serie, aprendiste a crear un motor de física simple, basado en azulejos, que controla cómo el héroe de tu juego, Koalio, se mueve alrededor de su mundo.

En esta segunda y última parte de la serie, aprenderás a hacer correr y saltar Koalio - la parte divertida del juego!

También añadir colisiones con los pisos de espiar miedo, manejar ganar y perder, y por supuesto añadir algunos efectos de sonido gratuitos y música.

Esta segunda parte es más simple (y más corto) que el primer tutorial, una recompensa por el trabajo duro que puso en la última vez. Así que a su vez mojo codificación, y disfrutar!

Moviendo Koalio Alrededor

Los controles que vas a implementar son muy simples. Sólo habrá controles de avance y salto, como en Ninja de 1 bit. Si tocas la mitad izquierda de la pantalla, Koalio correrá hacia adelante. Al tocar la mitad derecha de la pantalla, saltará Koalio.

Usted me oyó bien - Koalio no puede moverse hacia atrás! Los koalas verdaderos no retroceden del peligro.

Desde Koalio se moverá hacia adelante por el usuario, en lugar de por el GameLevelScene , necesita algunos valores que se puede comprobar en la clase de jugador que actualice su velocidad de avance. Agregue las siguientes propiedades a la clase Player:

En Player.h:

  @property (no atómico, asignar) BOOL forwardMarch;  @property (no atómico, asignar) BOOL mayAsWellJump; 

Ahora agregue los siguientes métodos de manipulación táctil al GameLevelScene.m:

  - (void) touchBegan: (NSSet *) toca conEvent: (UIEvent *) event {for (UITouch * toque en toques) {CGPoint touchLocation = [touch locationInNode: self];  If (touchLocation.x> self.size.width / 2.0) {self.player.mightAsWellJump = YES;  } Else {self.player.forwardMarch = YES;  }} - (void) touchesMoved: (NSSet *) toca withEvent: (UIEvent *) event {for (UITouch * toque en toques) {float halfWidth = self.size.width / 2.0;  CGPoint touchLocation = [touch locationInNode: self];  // obtener el tacto anterior y convertirlo al espacio del nodo CGPoint previousTouchLocation = [touch previousLocationInNode: self];  If (touchLocation.x> halfWidth && previousTouchLocation.x <= halfWidth) {self.player.forwardMarch = NO;  Self.player.mightAsWellJump = SI;  } Else if (previousTouchLocation.x> halfWidth && touchLocation.x <= halfWidth) {self.player.forwardMarch = YES;  Self.player.mightAsWellJump = NO;  }}} - (void) touchesEnded: (NSSet *) toca conEvent: (UIEvent *) event {for (UITouch * toque en toques) {CGPoint touchLocation = [touch locationInNode: self];  If (touchLocation.x <self.size.width / 2.0) {self.player.forwardMarch = NO;  } Else {self.player.mightAsWellJump = NO;  }}} 

Estos cambios deben ser bastante sencillos. Si el usuario crea un evento táctil que tiene una coordenada X de menos de la mitad del ancho de la pantalla, se enciende el forwardMarch booleano para el jugador. En caso contrario (si la ubicación del evento contacto es mayor que), simplemente encienda el mightAsWellJump booleano.

touchesMoved es un poco más complicado, ya que sólo desea cambiar los valores booleanos anterior si el toque cruza mediados pantalla, así que hay que calcular el previousTouch ubicación también. Aparte de eso, sólo está revisando para ver qué dirección cruza el toque y activar o desactivar el booleano apropiado. Finalmente, si el usuario deja de tocar un lado de la pantalla u otro, desea desactivar el valor booleano apropiado.

Hay algunos cambios que deben hacerse para detectar toques. En primer lugar, añadir esta línea a initWithSize :

  Self.userInteractionEnabled = SI; 

Ahora que está pasando los toques a los booleanos de su clase de jugador, puede agregar algún código al método de actualización para que Koalio pueda moverse. Comience con el movimiento hacia delante. Cambiar el método de actualización en Player.m a lo siguiente:

  - (void) actualización: (NSTimeInterval) delta {CGPoint gravity = CGPointMake (0.0, -450.0);  CGPoint gravityStep = CGPointMultiplyScalar (gravedad, delta);  // 1 CGPoint forwardMove = CGPointMake (800,0, 0,0);  CGPoint forwardMoveStep = CGPointMultiplyScalar (forwardMove, delta);  Self.velocity = CGPointAdd (self.velocity, gravityStep);  // 2 self.velocity = CGPointMake (self.velocity.x * 0.9, self.velocity.y);  // 3 // El código saltar va aquí si (self.forwardMarch) {self.velocity = CGPointAdd (self.velocity, forwardMoveStep);  } // 4 CGPoint minMovement = CGPointMake (0.0, -450);  CGPoint maxMovement = CGPointMake (120,0, 250,0);  Self.velocity = CGPointMake (Clamp (auto.velocity.x, minMovement.x, maxMovement.x), Clamp (auto.velocity.y, minMovement.y, maxMovement.y));  CGPoint velocityStep = CGPointMultiplyScalar (self.velocity, delta);  Self.desiredPosition = CGPointAdd (self.position, velocityStep);  } 

Vamos a dividir estas nuevas líneas sección por sección:

  1. Añade una fuerza forwardMove que entrará en juego mientras el usuario está tocando la pantalla. A modo de recordatorio, se aumenta de escala y que la fuerza (800 puntos por segundo) a la cantidad apropiada de paso de tiempo de la trama actual ( delta ) con el fin de tener una aceleración constante.
  2. Aquí se aplica una fuerza de amortiguación a la velocidad horizontal para simular la fricción. Estás aplicando la física aquí como lo hiciste con la gravedad. En cada marco, se aplicará fuerza de movimiento adicional.

    Cuando se quita la fuerza, usted quiere que el jugador se detenga, pero no inmediatamente. Aquí se aplica un amortiguamiento de 0,90; En otras palabras, reducir la fuerza horizontal total en un diez por ciento cada trama.

  3. En la sección tres, comprueba el valor booleano (lo que significa que se está tocando la pantalla) y agrega la fuerza forwardMove si es apropiado.
  4. En la sección cuatro, se aplica la sujeción. Esto limita la velocidad máxima de movimiento del jugador tanto en la dirección horizontal (velocidad máxima en marcha), en dirección ascendente (velocidad de salto) y en dirección descendente (descendente).
    Estos valores de amortiguación y sujeción ponen límites a la rapidez con que suceden las cosas en el juego. También evita la acumulación de problemas de velocidad que experimentó en la primera parte del tutorial.

    Desea que el jugador tenga una velocidad máxima y alcance esa velocidad dentro de un segundo o menos. De esta manera, los movimientos de tu jugador siguen siendo naturales y proporcionan un nivel de control. La fuerza máxima que usted permitirá es un valor positivo de 120, que sería un cuarto de la anchura de pantalla por segundo.

    Si se desea aumentar la tasa de aceleración de su reproductor, aumentar la forwardMove variable y el valor de atenuación 0.90 respectivamente. Si desea aumentar la velocidad máxima de su reproductor, simplemente aumente el valor de 120. También está tapando la velocidad de salto a 250 y la velocidad de caída a 450.

Construir y ejecutar. Usted debe ser capaz de hacer Koalio correr hacia adelante presionando la mitad izquierda de la pantalla. Ver que Koala ir!

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


Su Mac lo hará ... Saltar, Saltar!

El salto es la característica distintiva del juego de plataformas, y el elemento que conduce a la mayor parte de la diversión. Usted quiere asegurarse de que el movimiento de salto es fluido y se siente bien. En este tutorial, implementará el algoritmo de salto utilizado en Sonic the Hedgehog, como se describe aquí.

Añadir lo siguiente al método de actualización en la línea marcada (// código de salto va aquí):

  CGPoint jumpForce = CGPointMake (0,0, 310,0);  If (self.mightAsWellJump && self.onGround) {self.velocity = CGPointAdd (self.velocity, jumpForce);  } 

Si se detiene aquí (seguir adelante y construir y correr si lo desea), obtendrá Atari de la vieja escuela saltando. Cada salto será la misma altura. Se aplica una fuerza al jugador, y esperar hasta que la gravedad lo tire de nuevo hacia abajo.

En los juegos de plataformas modernos, los usuarios tienen mucho más control sobre el salto. ¿Quieres controlable, completamente irrealista (pero divertido como el infierno) Mario Bros / Sonic habilidades de saltos donde se puede cambiar el aire mid de las direcciones e incluso detener un salto corto.

Para lograr esto, deberá agregar el componente de variable. Hay un par de maneras de hacerlo, pero lo harás de la manera Sonic. Establezca el algoritmo de salto para reducir la fuerza del empuje hacia arriba si el usuario deja de presionar la pantalla. Reemplace el código anterior por lo siguiente:

  CGPoint jumpForce = CGPointMake (0,0, 310,0);  Float jumpCutoff = 150.0;  If (self.mightAsWellJump && self.onGround) {self.velocity = CGPointAdd (self.velocity, jumpForce);  } Else if (! Self.mightAsWellJump && self.velocity.y> jumpCutoff) {self.velocity = CGPointMake (self.velocity.x, jumpCutoff);  } 

Este código realiza un paso adicional. En el caso de que el usuario deja de presionar la pantalla ( self.mightAsWellJump se convertirá en NO ), se comprueba la velocidad ascendente del jugador. Si ese valor es mayor que el punto de corte, ajustará la velocidad al valor de corte.

Esto efectivamente reduce el salto. De esta manera, siempre se obtendrá un salto mínimo (por lo menos tan alto como el jumpCutoff ), pero si se sigue pulsando, obtendrá la fuerza de salto completo.

Construir y ejecutar ahora. Esto está empezando a sentirse como un juego real! A partir de este punto, probablemente necesitarás probar en un dispositivo real en lugar del simulador (si no lo has hecho) para poder usar ambos "botones".

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


Tienes Koalio corriendo y saltando, pero eventualmente se quedará sin bienes raíces de pantalla. ¡Tiempo de arreglar eso!

Añadir este fragmento de código del juego tutorial basado en mosaico para GameLevelScene.m:

  - (void) setViewpointCenter: (CGPoint) posición {NSInteger x = MAX (position.x, self.size.width / 2);  NSInteger y = MAX (posición.y, self.size.height / 2);  X = MIN (x, (self.map.mapSize.width * self.map.tileSize.width) - self.size.width / 2);  Y = MIN (y, (self.map.mapSize.height * self.map.tileSize.height) - self.size.height / 2);  CGPoint realPosition = CGPointMake (x, y);  CGPoint centerOfView = CGPointMake (self.size.width / 2, self.size.height / 2);  CGPoint viewPoint = CGPointSubtract (centerOfView, actualPosition);  Self.map.position = viewPoint;  } 

También es necesario importar el SKTUtils.h para que esto funcione:

  #import "SKTUtils.h" 

Este código pinza la pantalla a la posición del reproductor. En el caso en que Koalio está en el borde del nivel, deja de centrarse en él y fija el borde del nivel al borde de la pantalla.

Hay una modificación aquí desde el post original. En la última línea, el mapa se mueve, en lugar de la capa. Esto es posible porque el jugador es un niño del mapa, así que cuando el jugador se mueve a la derecha, el mapa se mueve a la izquierda y el jugador permanece en el centro de la pantalla.

Los métodos táctiles dependen de una posición dentro de la capa también. Si usted movió su capa alrededor en lugar de otro, usted tendría que tomar esos cálculos en cuenta. Esto es más fácil.

Para una explicación completa, consulte el tutorial del juego basado en mosaico.

Es necesario añadir que la llamada a la update método:

  [Self setViewpointCenter: self.player.position]; 

Construir y ejecutar ahora. Usted puede navegar Koalio a través de todo el nivel!

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


La Agonía de la Derrota

Ahora puede pasar a manejar los escenarios de juego ganadores y perdidos.

Enfrentar primero el escenario de la pérdida. Hay peligros colocados en este nivel. Si el jugador choca con un peligro, el juego terminará.

Puesto que estos son azulejos fijados, usted necesita manejarlos como usted manejó las colisiones de la pared en el tutorial anterior. Sin embargo, en lugar de resolver colisiones, terminará el juego. Estás en el tramo de casa ahora - ¡sólo quedan algunas cosas por hacer!

Agregue el siguiente método para GameLevelScene.m:

  - (void) handleHazardCollisions: (Jugador *) jugador {NSInteger índices [8] = {7, 1, 3, 5, 0, 2, 6, 8};  Para (NSUInteger i = 0; i <8; i ++) {NSInteger tileIndex = índices [i];  CGRect playerRect = [jugador collisionBoundingBox];  CGPoint playerCoord = [self.hazards coordForPoint: player.desiredPosition];  NSInteger tileColumn = tileIndex% 3;  NSInteger tileRow = tileIndex / 3;  CGPoint tileCoord = CGPointMake (playerCoord.x + (tileColumn - 1), playerCoord.y + (tileRow - 1));  NSInteger gid = [auto tileGIDAtTileCoord: tileCoord forLayer: self.hazards];  If (gid! = 0) {CGRect tileRect = [auto tileRectFromTileCoords: tileCoord];  If (CGRectIntersectsRect (playerRect, tileRect)) {[self gameOver: 0];  }}}} 

Todo este código será familiar, ya que es copiado y pegado desde el checkForAndResolveCollisionsForPlayer:forLayer: método. El único método que es nuevo es gameOver . Esta llamada toma un parámetro: 0 si el jugador ha perdido, 1 si el jugador ha ganado.

Estás usando los peligros capa en lugar de la capa de las paredes, por lo que necesita para poner esto en marcha en el @interface al inicio del archivo de implementación como propiedad

  @property (no atómico, fuerte) TMXLayer * peligros; 

Configurarlo en initWithSize (después de la línea de configuración de las paredes):

  Self.hazards = [capa de self.mapNamed: @ "peligros"]; 

Una última cosa que necesita hacer es llamar al método de update . Añadir esta línea después de la llamada a checkForAndResolveCollisionsForPlayer:forLayer: :

  [Self handleHazardCollisions: self.player]; 

Ahora, si el jugador se queda en ninguna instalación del revestimiento de la capa de riesgos, que vas a llamar gameOver . Ese método acaba de lanzar un botón de reinicio con un mensaje que has perdido (o ganado, según el caso):

  - (void) gameOver: (BOOL) ganó {// 1 self.gameOver = SI;  // 2 NSString * gameText;  If (won) {gameText = @ "¡Has Ganado!";  } Else {gameText = @ "Has muerto!";  } // 3 SKLabelNode * endGameLabel = [SKLabelNode labelNodeWithFontNamed: @ "Marker Felt"];  EndGameLabel.text = gameText;  EndGameLabel.fontSize = 40;  EndGameLabel.position = CGPointMake (self.size.width / 2.0, self.size.height / 1.7);  [Self addChild: endGameLabel];  // 4 UIButton * replay = [UIButton buttonWithType: UIButtonTypeCustom];  Replay.tag = 321;  UIImage * replayImage = [UIImage imageNamed: @ "replay"];  [Replay setImage: replayImage forState: UIControlStateNormal];  [Replay addTarget: acción propia: @selector (replay :) forControlEvents: UIControlEventTouchUpInside];  Replay.frame = CGRectMake (self.size.width / 2.0 - replayImage.size.width / 2.0, self.size.height / 2.0 - replayImage.size.height / 2.0, replayImage.size.width, replayImage.size.height) ;  [Self.view addSubview: replay];  } - (void) replay: (id) sender {// 5 [[self.view viewWithTag: 321] removeFromSuperview];  // 6 [self.view presentScene: [[GameLevelScene alloc] initWithSize: self.size]];  } 
  1. La primera línea establece un nuevo booleana llamada gameOver . Utiliza este valor para detener el método de actualización de permitir que el reproductor continúe moviéndose e interactuar con el nivel. Verás eso en un minuto.
  2. A continuación, asigna una cadena que indica si el jugador ha ganado o perdido.
  3. A continuación, el código crea una etiqueta y asigna una cadena basada en si el usuario ha ganado o perdido. Kit de Sprite tiene un práctico SKNode subclase diseñado para sellos como este.
  4. Por último, se crea un UIButton que el usuario puede pulsar para reiniciar el nivel otra vez (llamando a la replay: método). Esto debería ser familiar para usted si usted tiene uso UIButtons . Lo único que puede parecer peculiar es que se establece la propiedad tag. Esto es para que pueda buscar el botón más tarde y eliminarlo cuando vuelva a cargar la escena.
  5. En el método de reproducción, primero se obtiene el UIButton por su etiqueta y lo quita de la vista. No desea que ese botón se coloque durante la próxima sesión de juego.
  6. Finalmente, se llama presentScene en una instancia recién asignado del GameLevelScene , este vuelve a cargar la escena con una nueva copia.

La única otra cosa que hay que hacer es poner el gameOver booleano a la GameLevelScene clase. Añadir a la @interface al comienzo de la GameLevelScene.m:

  @property (no atómico, asignar) BOOL gameOver; 

Agregue la siguiente línea al principio del método de actualización:

  If (self.gameOver) return; 

Un último paso. Arrastre replay.png y [email protected] de Resources \ sprites.atlas a Resources para hacer una copia de los archivos que están fuera de sprites.atlas. Esto es necesario para que UIKit pueda encontrar la imagen para mostrar el UIButton (UIKit no sabe nada sobre los atlas de texturas de Sprite Kit).

¡Vaya adelante y construya y corra ahora, y encuentre algunos puntos para saltar encendido! Debería ver algo como esto:

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


No repita esto demasiado, sin embargo, o la agencia de protección de los animales puede venir después de usted! :]

El Pozo de la Perdición

Ahora para el escenario donde Koalio cae por un agujero. En este caso, finalizarás el juego.

Como el código es ahora, se bloqueará. (Horrors!) El código genera un error de aserción TMXLayerInfo. Ahí es donde debe intervenir. Esto ocurre en el checkForAndResolveCollisionsForPlayer:forLayer: método cuando se llama a tileGIDAtTileCoord: .

Agregue el código siguiente en GameLevelScene.m, en el checkForAndResolveCollisionsForPlayer:forLayer: método, después de la CGPoint playerCoord = [layer coordForPoint:player.desiredPosition]; línea;

  If (playerCoord.y> = self.map.mapSize.height - 1) {[self gameOver: 0];  regreso;  } 

Este código se ejecutará la gameOver rutina y abandonar el proceso de construcción de la matriz de baldosas. También abandonará el bucle de colisión y evitará cualquier problema que pudiera derivarse de él.

Los handleHazardCollisions también bucles a través de los azulejos. Es necesario agregar algún código a ese método para evitar que lo haga si el Koala ha saltado por un agujero. Agregue la línea siguiente al principio de ese método:

  If (self.gameOver) return; 

Construir y ejecutar ahora. Encuentra un hoyo para saltar, y. . . Sin estrellarse El juego termina como debe.

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


¡Victorioso!

¡Ahora, maneja el caso donde tu héroe Koalio gana el juego!

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2

Todo lo que vas a hacer es monitorear la posición X del jugador y activar la condición de "ganar" cuando cruce el umbral (que estará al final del nivel). Este nivel es de unos 3400 píxeles de ancho. Vas a activar una condición de "victoria" cuando el jugador llegue al píxel 3130.

Añadir un nuevo método en GameLevelScene.m como sigue:

  - (void) checkForWin {if (auto.player.position.x> 3130.0) {[self gameOver: 1];  }} 

Añadir la checkForWin método después de las handleHazardCollisions llaman en cambio:

  [Comprobación automáticaForWin]; 

Construir y ejecutar ahora. Navega tu héroe Koalio a través del nivel, y si puedes llegar al final, tendrás este mensaje:

Sprite Kit Tutorial: Cómo hacer un juego de plataforma como Super Mario Brothers && num; 8211 & semi;  Parte 2


Música Gratuita y Efectos de Sonido

Ya sabes qué hora es - tiempo para la música gratuita y efectos de sonido!

Vamos a bucear justo en ella. Utilizará los métodos del kit Sprite incorporados para efectos de sonido y el motor SKTAudio para la música de fondo. Añadir este en la parte superior de GameLevelScene.m:

  #import "SKTAudio.h" 

A continuación, añadir esta línea a la initWithSize método de la GameLevelScene (antes self.userInteractionEnabled = YES; ) :.

  [[SKTAudio sharedInstance] playBackgroundMusic: @ "nivel1.mp3"]; 

Esto le da una buena música de juego. Gracias a Kevin Macleod de Incompetech.com por componer la música (Brittle Reel). Él tiene toneladas de música bajo licencia CC allí!

Ahora agregue un sonido saltante. Ir a la Player.m y añadir lo siguiente a la update método en el código de salto:

  If (self.mightAsWellJump && self.onGround) {self.velocity = CGPointAdd (self.velocity, jumpForce);  [RunAction auto: [SKAction playSoundFileNamed: @ "jump.wav" waitForCompletion: NO]];  } Else if (! Self.mightAsWellJump && self.velocity.y> jumpCutoff) {self.velocity = CGPointMake (self.velocity.x, jumpCutoff);  } 

Por último, toque un sonido cuando Koalio cae por un agujero o cuando golpea un obstáculo. Hacer eso en el gameOver método en el GameLevelScene.m:

  - (void) gameOver: (BOOL) ganó {self.gameOver = YES;  [RunAction auto: [SKAction playSoundFileNamed: @ "hurt.wav" waitForCompletion: NO]];  NSString * gameText; 

Construir y ejecutar, y disfrutar de sus melodías nuevas groovy.

Y eso es. Has escrito un juego de plataformas. Tú. Son. ¡Increíble!

¿A dónde ir desde aquí?

Aquí está el SuperKoalioPt2Fin final con todo el código de este tutorial Sprite Kit.

Hay muchas más cosas que podrían haber sido cubiertas: todo, desde colisiones enemigas y AI, hasta habilidades mejoradas de movimientos (diapositivas de pared, salto doble, etc.), para alinear las directrices de diseño.

Y hablando de eso ... una gran noticia sobre eso!

El Juego de Starter del Juego de Plataformas

Acabamos de lanzar la segunda edición del juego de Starter Starter Platform, que está totalmente actualizado para Sprite Kit!

Esto es lo que aprenderá en el Juego de Starter del juego Platformer:

  • Cómo administrar y cargar múltiples niveles
  • Cómo hacer una pantalla de selección de nivel desplegable y desplegable
  • Compatibilidad de Sprite Kit con UIKit Storyboards
  • ¡Cómo utilizar eficientemente las hojas del sprite, las animaciones, los tilesets, y trabajar con arte del pixel!
  • Cómo crear una máquina de estado para manejar animaciones y comportamientos de carácter / enemigo
  • ¡Más sobre cómo hacer increíbles y divertidos motores de física basados ​​en azulejos!
  • Cómo crear un joystick en pantalla y HUD
  • Cómo agregar soporte de controlador de hardware
  • Diseño de nivel para plataformas
  • Cómo construir Enemigo AI y comportamientos dinámicos.
  • Entrevistas con los desarrolladores de varios juegos de plataformas iOS superiores con consejos y trucos
  • . . . Y mucho, mucho más!

Puede consultar la segunda edición del juego de Starter del juego Platformer en la tienda de raywenderlich.com.

Mientras tanto, no olvide los recursos recomendados al final de la Parte 1 de este tutorial.

Espero que haya disfrutado de su física y están más inspirados que nunca en la construcción de su propio juego de plataformas!

Etiqueta:

Artículos relacionados

Popular

Último