iOS
Kit de juego
Buscar..
Generando numeros al azar
Aunque GameplayKit
(que se presenta con iOS 9 SDK) trata de implementar la lógica del juego, también se puede usar para generar números aleatorios, lo cual es muy útil en aplicaciones y juegos.
Además del GKRandomSource.sharedRandom
que se usa en los siguientes capítulos, hay tres tipos adicionales de GKRandomSource
's out of the box.
- GKARC4RandomSource que utiliza el algoritmo ARC4
- GKLinearCongruentialRandomSource ¿Qué es un rápido pero no tan al azar
GKRandomSource
- GKMersenneTwisterRandomSource que implementa un algoritmo MersenneTwister. Es más lento pero más aleatorio.
En el siguiente capítulo solo usamos el método nextInt()
de un GKRandomSource
. Además de esto hay el nextBool() -> Bool
y el nextUniform() -> Float
Generacion
Primero, importa GameplayKit
:
Rápido
import GameplayKit
C objetivo
#import <GameplayKit/GameplayKit.h>
Luego, para generar un número aleatorio, usa este código:
Rápido
let randomNumber = GKRandomSource.sharedRandom().nextInt()
C objetivo
int randomNumber = [[GKRandomSource sharedRandom] nextInt];
Nota
La función nextInt (), cuando se usa sin parámetros, devolverá un número aleatorio entre -2,147,483,648 y 2,147,483,647, incluidos ellos mismos, por lo que no estamos seguros de que siempre sea un número positivo o distinto de cero.
Generando un número de 0 a n
Para lograr esto, debe nextIntWithUpperBound()
n al método nextIntWithUpperBound()
:
Rápido
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 10)
C objetivo
int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: 10];
Este código nos dará un número entre 0 y 10, incluidos ellos mismos.
Generando un número de ma n
Para hacer esto, creas un objeto GKRandomDistribution
con un GKRandomSource
y pasas los límites. Se puede GKRandomDistribution
una GKRandomDistribution
para cambiar el comportamiento de distribución, como GKGaussianDistribution
o GKShuffledDistribution
.
Después de eso, el objeto se puede usar como cualquier GKRandomSource
regular, ya que también implementa el protocolo GKRandom
.
Rápido
let randomizer = GKRandomDistribution(randomSource: GKRandomSource(), lowestValue: 0, highestValue: 6)
let randomNumberInBounds = randomizer.nextInt()
Objective-C obsoleto
int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: n - m] + m;
Por ejemplo, para generar un número aleatorio entre 3 y 10, utiliza este código:
Rápido
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 7) + 3
Objective-C obsoleto
int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: 7] + 3;
GKEntity y GKComponent
Una entidad representa un objeto de un juego como una figura de jugador o una figura enemiga. Como este objeto no hace mucho sin brazos y piernas, podemos agregarle los componentes. Para crear este sistema, Apple tiene las clases GKEntity
y GKComponent
.
Asumamos que tenemos la siguiente clasificación para los siguientes capítulos:
class Player: GKEntity{}
class PlayerSpriteComponent: GKComponent {}
GKEntity
Una entidad es una colección de componentes y ofrece varias funciones para agregar, eliminar e interactuar con los componentes de la misma.
Si bien podríamos usar GKEntity, es común Subclase para un tipo específico de entidad de juego.
Es importante que solo sea posible agregar un componente de una clase una vez. En caso de que agregue un segundo componente de la misma clase, se anulará el primer componente existente dentro de GKEntity
let otherComponent = PlayerSpriteComponent()
var player = Player()
player.addComponent(PlayerSpriteComponent())
player.addComponent(otherComponent)
print(player.components.count) //will print 1
print(player.components[0] === otherComponent) // will print true
Puedes preguntar por qué. La razón de esto es los métodos llamados component(for: T.Type)
que devuelve el componente de un tipo específico de la entidad.
let component = player.component(ofType: PlayerSpriteComponent.self)
Además de los componentes-métodos, tiene un método de update
que se utiliza para delegar la hora delta o la hora actual de la lógica del juego a sus componentes.
var player = Player()
player.addComponent(PlayerSpriteComponent())
player.update(deltaTime: 1.0) // will call the update method of the PlayerSpriteComponent added to it
GKComponent
Un componente representa algo de una entidad, por ejemplo, el componente visual o el componente lógico.
Si se llama a un método de actualización de una entidad, se lo delegará a todos sus componentes. La anulación de este método se utiliza para manipular una entidad.
class PlayerSpriteComponent: GKComponent {
override func update(deltaTime seconds: TimeInterval) {
//move the sprite depending on the update time
}
}
Además de esto, es posible anular el método didAddToEntity
y willRemoveFromEntity
para informar a otros componentes sobre su eliminación o adición.
Para manipular otro componente dentro de un componente, es posible obtener la GKEntity a la que se agrega el componente.
override func update(deltaTime seconds: TimeInterval) {
let controller = self.entity?.component(ofType: PlayerControlComponent.self)
//call methods on the controller
}
Aunque esto es posible, no es un patrón común, ya que los alambres de los dos componentes juntos.
GKComponentSystem
Si bien acabamos de hablar sobre el uso del mecanismo de actualización de delegados de GKEntity
para actualizar los GKComponents
hay una forma diferente de actualizar GKComponents
que se llama GKComponentSystem
.
Se utiliza en caso de que sea necesario que todos los componentes de un tipo específico se actualicen de una sola vez.
Se GKComponentSystem
un GKComponentSystem
para un tipo específico de componente.
let system = GKComponentSystem(componentClass: PlayerSpriteComponent.self)
Para agregar un componente puedes usar el método add:
system.addComponent(PlayerSpriteComponent())
Pero una forma más común es pasar la entidad creada con sus componentes al GKComponentSystem
y encontrará un componente coincidente dentro de la entidad.
system.addComponent(foundIn: player)
Para actualizar todos los componentes de un tipo específico, llame a la actualización:
system.update(deltaTime: delta)
En caso de que desee utilizar GKComponentSystem
lugar de un mecanismo de actualización basado en entidades, debe tener un GKComponentSystem
para cada componente y llamar a la actualización en todos los sistemas.