Поиск…
Генерация случайных чисел
Хотя 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
и вызывать обновление для всех систем.