수색…


난수 생성하기

GameplayKit (iOS 9 SDK에 도입)은 게임 논리를 구현하는 데 사용되지만, 난수 생성에 사용될 수도 있습니다. 이는 앱과 게임에서 매우 유용합니다.

GKRandomSource.sharedRandom 다음 장에서 사용되는 세 가지 추가 유형이 있습니다 GKRandomSource 상자 밖으로 '들.

  • GKARC4RandomSource ARC4 알고리즘을 사용합니다.
  • GKLinearCongruentialRandomSource 빠르고 랜덤하지 않은 GKRandomSource는 어느 것입니까 GKRandomSource
  • GKMersenneTwisterRandomSource MersenneTwister 알고리즘을 구현합니다. 느리지 만 무작위입니다.

다음 장에서는 GKRandomSourcenextInt() 메서드 만 사용합니다. 이 외에도 nextBool() -> BoolnextUniform() -> Float

세대

먼저, Import 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이 아닌 숫자가 확실하지 않습니다.

0에서 n까지의 숫자 생성

이를 달성하려면 nextIntWithUpperBound() 메소드에 n을 부여해야합니다.

빠른

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

목표 -C

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

이 코드는 0과 10 사이의 숫자를 제공합니다.

m에서 n으로 숫자 생성하기

이렇게하려면 당신은 만들 GKRandomDistribution A의 객체 GKRandomSource 하고 경계를 전달합니다. GKRandomDistributionGKGaussianDistribution 또는 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

엔티티는 플레이어 피겨 또는 적 피겨와 같은 게임의 개체를 나타냅니다. 이 객체는 팔과 다리가 없어도 많은 작업을 수행하지 않으므로 여기에 구성 요소를 추가 할 수 있습니다. 이 시스템을 만들기 위해 apple에는 GKEntityGKComponent 클래스가 있습니다.

우리는 다음 장들에 대해 다음과 같이 가정합니다 :

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 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

구성 요소는 예를 들어 시각적 구성 요소 또는 논리 구성 요소와 같은 엔티티의 일부를 나타냅니다.

엔티티의 갱신 메소드가 호출되면,이를 모든 구성 요소에 위임합니다. 이 메소드를 오버라이드 (override)하면, Entity를 조작 할 수 있습니다.

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
}

이것은 가능하지만 일반적인 패턴이 아니기 때문에 두 구성 요소를 서로 연결합니다.

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 을 갖고 모든 시스템에서 업데이트를 호출해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow