Поиск…


Генерация случайных чисел

Хотя GameplayKit (который представлен с iOS 9 SDK) посвящен реализации логики игры, он также может быть использован для генерации случайных чисел, что очень полезно в приложениях и играх.

Помимо GKRandomSource.sharedRandom который используется в следующих главах, есть три дополнительных типа GKRandomSource 's из коробки.

  • GKARC4RandomSource, который использует алгоритм ARC4
  • GKLinearCongruentialRandomSource, который является быстрым, но не столь случайным GKRandomSource
  • GKMersenneTwisterRandomSource, который реализует алгоритм MersenneTwister. Он медленнее, но более случайным.

В следующей главе мы используем только метод nextInt() для GKRandomSource . В дополнение к этому есть nextBool() -> Bool и nextUniform() -> Float

поколение

Во-первых, импортируйте GameplayKit :

стриж

import GameplayKit

Objective-C

#import <GameplayKit/GameplayKit.h>

Затем, чтобы сгенерировать случайное число, используйте этот код:

стриж

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

Objective-C

int randomNumber = [[GKRandomSource sharedRandom] nextInt];

Заметка

Функция nextInt () при использовании без параметров возвращает случайное число между -2,147,483,648 и 2,147,483,647, включая самих себя, поэтому мы не уверены, что это всегда положительное или ненулевое число.

Создание числа от 0 до n

Чтобы добиться этого, вы должны дать n nextIntWithUpperBound() методу nextIntWithUpperBound() :

стриж

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

Objective-C

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

Этот код даст нам число от 0 до 10, включая себя.

Создание числа от m до n

Для этого вы создаете объект GKRandomDistribution с GKRandomSource и проходите в границах. GKRandomDistribution можно использовать для изменения поведения распределения, такого как GKGaussianDistribution или GKShuffledDistribution .

После этого объект может использоваться как каждый регулярный GKRandomSource поскольку он также реализует протокол GKRandom .

стриж

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

Объектив-C устарел

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

Например, чтобы создать случайное число от 3 до 10, вы используете этот код:

стриж

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

Объектив-C устарел

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

GKEntity и GKComponent

Сущность представляет объект игры, такой как фигура игрока или фигура врага. Поскольку этот объект не делает много без рук и ног, мы можем добавить к нему компоненты. Для создания этой системы в Apple есть GKEntity и GKComponent .

Предположим, что у нас есть следующий класс для следующих глав:

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

GKEntity

Сущность представляет собой набор компонентов и предлагает несколько функций для добавления, удаления и взаимодействия с ее компонентами.

Хотя мы могли бы просто использовать GKEntity, он является общим для подкласса для определенного типа игрового объекта.

Важно, что только один раз можно добавить компонент класса. Если вы добавите второй компонент того же класса, он переопределит первый существующий компонент внутри 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

Вы можете спросить, почему. Причиной этого являются методы, называемые component(for: T.Type) который возвращает компонент определенного типа объекта.

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

В дополнение к компонентам-методам у него есть метод update который используется для делегирования дельта-времени или текущего времени игровой логики на его компоненты.

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

GKComponent

Компонент представляет собой нечто вроде объекта, например визуального компонента или логического компонента.

Если вы вызываете метод обновления объекта, он делегирует его всем его компонентам. Переопределение этого метода используется для управления сущностью.

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

В дополнение к этому можно переопределить метод didAddToEntity и willRemoveFromEntity чтобы сообщить другим компонентам о его удалении или добавлении.

Для управления другим компонентом внутри компонента можно получить GKEntity, к которому добавлен компонент.

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

Хотя это возможно, это не общий шаблон, поскольку он соединяет два компонента вместе.

GKComponentSystem

Хотя мы просто говорили об использовании механизма делегирования обновлений GKEntity для обновления GKComponents существует другой способ обновления GKComponents который называется GKComponentSystem .

Он используется в случае необходимости, чтобы все компоненты определенного типа нуждались в обновлении за один раз.

GKComponentSystem создается для определенного типа компонента.

let system = GKComponentSystem(componentClass: PlayerSpriteComponent.self)

Чтобы добавить компонент, вы можете использовать метод add:

system.addComponent(PlayerSpriteComponent())

Но более распространенным способом является передача созданного объекта с его компонентами в GKComponentSystem и он найдет соответствующий компонент внутри объекта.

system.addComponent(foundIn: player)

Чтобы обновить все компоненты определенного типа, выполните обновление:

system.update(deltaTime: delta)

Если вы хотите использовать GKComponentSystem вместо механизма обновления на основе GKComponentSystem для каждого компонента необходимо иметь GKComponentSystem и вызывать обновление для всех систем.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow