サーチ…


乱数の生成

GameplayKit (iOS 9 SDKで導入されている)はゲームロジックの実装に関するものですが、乱数を生成するために使用することもできます。これはアプリやゲームで非常に便利です。

次の章で使用されるGKRandomSource.sharedRandom横には、3つの追加タイプのGKRandomSourceGKRandomSourceされています。

  • 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を使用して、 GKGaussianDistributionGKShuffledDistributionなどの配布動作を変更することができます。

その後、オブジェクトは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

エンティティは、プレイヤーのフィギュアや敵のフィギュアのようなゲームのオブジェクトを表します。このオブジェクトは腕と脚がなければあまり機能しませんので、これにコンポーネントを追加できます。このシステムを作成するには、 GKEntityGKComponentクラスと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
    }
}

これに加えて、メソッドdidAddToEntitywillRemoveFromEntityをオーバーライドして、削除または追加について他のコンポーネントに通知することもできます。

コンポーネント内の他のコンポーネントを操作するには、コンポーネントが追加される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を使用する場合は、すべてのコンポーネントに対してGKComponentSystemGKComponentSystemし、すべてのシステムで更新プログラムを呼び出す必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow