Suche…


Zufallszahlen generieren

Obwohl es sich bei GameplayKit (das mit iOS 9 SDK eingeführt wird) um die Implementierung von Spiellogik handelt, kann es auch zur Erzeugung von Zufallszahlen verwendet werden, was in Apps und Spielen sehr nützlich ist.

Neben GKRandomSource.sharedRandom das in den folgenden Kapiteln verwendet wird, gibt es drei zusätzliche Typen von GKRandomSource 's out-of-the-box.

  • GKARC4RandomSource Verwendet den ARC4-Algorithmus
  • GKLinearCongruentialRandomSource Dies ist eine schnelle, aber nicht zufällige GKRandomSource
  • GKMersenneTwisterRandomSource Die Implementierung eines MersenneTwister-Algorithmus. Es ist langsamer aber zufällig.

Im folgenden Kapitel verwenden wir nur die nextInt() Methode einer GKRandomSource . Dazu kommen nextBool() -> Bool und nextUniform() -> Float

Generation

Importiere zuerst GameplayKit :

Schnell

import GameplayKit

Ziel c

#import <GameplayKit/GameplayKit.h>

Verwenden Sie dann diesen Code, um eine Zufallszahl zu generieren:

Schnell

let randomNumber = GKRandomSource.sharedRandom().nextInt()

Ziel c

int randomNumber = [[GKRandomSource sharedRandom] nextInt];

Hinweis

Wenn die nextInt () - Funktion ohne Parameter verwendet wird, wird eine Zufallszahl zwischen -2.147.483.648 und 2.147.483.647 einschließlich ihrer zurückgegeben. Daher sind wir nicht sicher, dass es sich immer um eine positive oder eine ungleich Null handelt.

Eine Zahl von 0 bis n erzeugen

Um dies zu erreichen, sollten Sie der nextIntWithUpperBound() Methode n geben:

Schnell

let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 10)

Ziel c

int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: 10];

Dieser Code gibt uns eine Zahl zwischen 0 und 10, einschließlich sich selbst.

Eine Zahl von m bis n generieren

Dazu erstellen Sie ein GKRandomDistribution Objekt mit einer GKRandomSource und übergeben die Grenzen. Eine GKRandomDistribution kann verwendet werden, um das Verteilungsverhalten wie GKGaussianDistribution oder GKShuffledDistribution zu ändern.

Danach kann das Objekt wie jede reguläre GKRandomSource da es auch das GKRandom Protokoll implementiert.

Schnell

let randomizer = GKRandomDistribution(randomSource: GKRandomSource(), lowestValue: 0, highestValue: 6)
let randomNumberInBounds = randomizer.nextInt()

Objective-C veraltet

int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: n - m] + m;

Um beispielsweise eine Zufallszahl zwischen 3 und 10 zu generieren, verwenden Sie diesen Code:

Schnell

let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 7) + 3

Objective-C veraltet

int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: 7] + 3;

GKEntity und GKComponent

Eine Entität repräsentiert ein Objekt eines Spiels wie eine Spielerfigur oder eine gegnerische Figur. Da dieses Objekt ohne Arme und Beine nicht viel ausmacht, können wir die Komponenten dazu hinzufügen. Um dieses System zu erstellen, verfügt Apple über die Klassen GKEntity und GKComponent .

Nehmen wir an, wir haben die folgende Klasse für die folgenden Kapitel:

class Player: GKEntity{}
class PlayerSpriteComponent: GKComponent {}

GKEntity

Eine Entität ist eine Sammlung von Komponenten und bietet verschiedene Funktionen zum Hinzufügen, Entfernen und Interagieren mit Komponenten davon.

Während wir die GKEntity einfach verwenden könnten, ist es üblich, sie für einen bestimmten Typ von Spieleinheiten zu subclassieren.

Es ist wichtig, dass eine Komponente nur einmal hinzugefügt werden kann. Wenn Sie eine zweite Komponente derselben Klasse hinzufügen, überschreibt sie die erste vorhandene Komponente in 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

Sie fragen vielleicht warum. Der Grund dafür sind die als component(for: T.Type) Methoden, die die Komponente eines bestimmten Entitätstyps zurückgeben.

let component = player.component(ofType: PlayerSpriteComponent.self) 

Neben den Komponenten-Methoden gibt es eine update , mit der die Deltazeit oder die aktuelle Zeit der Spiellogik an ihre Komponenten delegiert wird.

var player = Player()
player.addComponent(PlayerSpriteComponent())
player.update(deltaTime: 1.0) // will call the update method of the PlayerSpriteComponent added to it

GKComponent

Eine Komponente stellt etwas von einer Entität dar, beispielsweise die visuelle Komponente oder die Logikkomponente.

Wenn eine Aktualisierungsmethode einer Entität aufgerufen wird, wird sie an alle ihre Komponenten delegiert. Das Überschreiben dieser Methode wird zum Manipulieren einer Entität verwendet.

class PlayerSpriteComponent: GKComponent {
    override func update(deltaTime seconds: TimeInterval) {
        //move the sprite depending on the update time
    }
}

Darüber hinaus ist es möglich, die Methode didAddToEntity und willRemoveFromEntity zu willRemoveFromEntity , um andere Komponenten über das Entfernen oder Hinzufügen zu informieren.

Um eine andere Komponente innerhalb einer Komponente zu bearbeiten, ist es möglich, die GKEntity abzurufen, zu der die Komponente hinzugefügt wird.

override func update(deltaTime seconds: TimeInterval) {
    let controller = self.entity?.component(ofType: PlayerControlComponent.self)
    //call methods on the controller
}

Während dies möglich ist, ist es kein allgemeines Muster, da es die beiden Komponenten miteinander verbindet.

GKComponentSystem

Während wir gerade über die Verwendung des Aktualisierungsdelegationsmechanismus von GKEntity zum Aktualisieren der GKComponents gibt es eine andere Möglichkeit, GKComponents zu aktualisieren, die als GKComponentSystem .

Es wird verwendet, wenn alle Komponenten eines bestimmten Typs auf einmal aktualisiert werden müssen.

Ein GKComponentSystem wird für einen bestimmten Komponententyp erstellt.

let system = GKComponentSystem(componentClass: PlayerSpriteComponent.self)

Um eine Komponente hinzuzufügen, können Sie die add-Methode verwenden:

system.addComponent(PlayerSpriteComponent())

Eine üblichere Methode besteht jedoch darin, die erstellte Entität mit ihren Komponenten an das GKComponentSystem und es wird eine passende Komponente innerhalb der Entität gefunden.

system.addComponent(foundIn: player)

Um alle Komponenten eines bestimmten Typs zu aktualisieren, rufen Sie das Update auf:

system.update(deltaTime: delta)

GKComponentSystem Sie das GKComponentSystem anstelle eines GKComponentSystem Aktualisierungsmechanismus verwenden GKComponentSystem , müssen GKComponentSystem für jede Komponente ein GKComponentSystem und das Update auf allen Systemen aufrufen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow