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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow