サーチ…
乱数の生成
GameplayKit
(iOS 9 SDKで導入されている)はゲームロジックの実装に関するものですが、乱数を生成するために使用することもできます。これはアプリやゲームで非常に便利です。
次の章で使用されるGKRandomSource.sharedRandom
横には、3つの追加タイプのGKRandomSource
がGKRandomSource
されています。
- GKARC4RandomSource ARC4アルゴリズムを使用するもの
- GKLinearCongruentialRandomSource高速ですがランダムではないGKRandomSourceはどれ
GKRandomSource
- GKMersenneTwisterRandomSource MersenneTwisterアルゴリズムを実装しています。それはより遅いが、よりランダムである。
次の章では、 GKRandomSource
nextInt()
メソッドのみを使用します。これに加えて、 nextBool() -> Bool
およびnextUniform() -> Float
世代
まず、 GameplayKit
:
迅速
import GameplayKit
目標-C
#import <GameplayKit/GameplayKit.h>
次に、乱数を生成するには、次のコードを使用します。
迅速
let randomNumber = GKRandomSource.sharedRandom().nextInt()
目標-C
int randomNumber = [[GKRandomSource sharedRandom] nextInt];
注意
nextInt()関数は、パラメータなしで使用すると-2,147,483,648から2,147,483,647までの乱数を返します。したがって、常に正の数または非ゼロの数であるかどうかはわかりません。
0からnまでの数を生成する
これを実現するには、 nextIntWithUpperBound()
メソッドにnをnextIntWithUpperBound()
必要があります。
迅速
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 10)
目標-C
int randomNumber = [[GKRandomSource sharedRandom] nextIntWithUpperBound: 10];
このコードは、それ自身を含めて、0と10の間の数値を返します。
mからnまでの数値の生成
これを行うには、作成GKRandomDistribution
持つオブジェクトGKRandomSource
し、境界を渡します。 GKRandomDistribution
を使用して、 GKGaussianDistribution
やGKShuffledDistribution
などの配布動作を変更することができます。
その後、オブジェクトはGKRandom
プロトコルも実装しているので、通常のGKRandomSource
同じように使用できます。
迅速
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
エンティティは、プレイヤーのフィギュアや敵のフィギュアのようなゲームのオブジェクトを表します。このオブジェクトは腕と脚がなければあまり機能しませんので、これにコンポーネントを追加できます。このシステムを作成するには、 GKEntity
にGKComponent
クラスとGKComponent
クラスがあります。
次の章については、次のようなクラスがあると仮定します。
class Player: GKEntity{}
class PlayerSpriteComponent: GKComponent {}
GKEntity
エンティティはコンポーネントの集合であり、コンポーネントを追加、削除、および相互作用するためのいくつかの機能を提供します。
私たちはGKEntityを使うことができますが、特定のタイプのゲームエンティティに対してサブクラス化するのが一般的です。
一度クラスのコンポーネントを追加することが可能なのは重要です。同じクラスの2番目のコンポーネントを追加する場合は、 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
}
これは可能ですが、2つのコンポーネントを結線するため、共通のパターンではありません 。
GKComponentSystem
私たちはただの更新デリゲートメカニズム使用しての話ながらGKEntity
更新するGKComponents
更新する別の方法がありGKComponents
と呼ばれるGKComponentSystem
。
これは、特定のタイプのすべてのコンポーネントを一度に更新する必要がある場合に使用されます。
GKComponentSystem
は、特定のタイプのコンポーネントに対して作成されます。
let system = GKComponentSystem(componentClass: PlayerSpriteComponent.self)
コンポーネントを追加するには、addメソッドを使用します。
system.addComponent(PlayerSpriteComponent())
しかしより一般的な方法は、作成されたエンティティをコンポーネントと共にGKComponentSystem
ことです。エンティティ内で一致するコンポーネントが見つかるGKComponentSystem
です。
system.addComponent(foundIn: player)
特定のタイプのコンポーネントをすべて更新するには、更新プログラムを呼び出します。
system.update(deltaTime: delta)
エンティティベースの更新メカニズムの代わりにGKComponentSystem
を使用する場合は、すべてのコンポーネントに対してGKComponentSystem
をGKComponentSystem
し、すべてのシステムで更新プログラムを呼び出す必要があります。