game/godot

Godot - Services for iOS

C/H 2018. 11. 27. 08:30

Services for iOS

At the moment, there are two iOS APIs partially implemented, GameCenter and Storekit. Both use the same model of asynchronous calls explained below.
현재 부분적으로 구현 된 두 가지 iOS API 인 GameCenter와 Storekit가 있습니다. 두 모델 모두 아래에 설명 된 것과 동일한 비동기 호출 모델을 사용합니다.

Asynchronous methods

When requesting an asynchronous operation, the method will look like this:
비동기 작업을 요청할 때 메서드는 다음과 같습니다.

Error purchase(Variant p_params);

The parameter will usually be a Dictionary, with the information necessary to make the request, and the call will have two phases. First, the method will immediately return an Error value. If the Error is not ‘OK’, the call operation is completed, with an error probably caused locally (no internet connection, API incorrectly configured, etc). If the error value is ‘OK’, a response event will be produced and added to the ‘pending events’ queue. Example:
매개 변수는 일반적으로 요청을하는 데 필요한 정보가 들어있는 사전이 될 것이며 호출은 두 단계로 이루어집니다. 첫째, 메서드는 즉시 Error 값을 반환합니다. 오류가 '확인'이 아닌 경우 로컬에서 발생한 오류 (인터넷 연결, API가 잘못 구성된 등)로 인해 호출 작업이 완료됩니다. 오류 값이 'OK'이면 응답 이벤트가 생성되어 '보류 중 이벤트'대기열에 추가됩니다. 예:

func on_purchase_pressed():
    var result = InAppStore.purchase( { "product_id": "my_product" } )
    if result == OK:
        animation.play("busy") # show the "waiting for response" animation
    else:
        show_error()

# put this on a 1 second timer or something
# 이것을 1 초 타이머 또는 다른 것에 넣으십시오.
func check_events():
    while InAppStore.get_pending_event_count() > 0:
        var event = InAppStore.pop_pending_event()
        if event.type == "purchase":
            if event.result == "ok":
                show_success(event.product_id)
            else:
                show_error()

Remember that when a call returns OK, the API will always produce an event through the pending_event interface, even if it’s an error, or a network timeout, etc. You should be able to, for example, safely block the interface waiting for a reply from the server. If any of the APIs don’t behave this way it should be treated as a bug.
호출이 OK를 반환하면 API는 오류 또는 네트워크 시간 초과 등의 경우에도 항상 pending_event 인터페이스를 통해 이벤트를 생성합니다. 예를 들어 서버로부터의 응답을 기다리는 인터페이스를 안전하게 차단할 수 있어야합니다. 이런 방식으로 작동하지 않는 API가 있으면 버그로 처리 해야합니다.

The pending event interface consists of two methods:
보류중인 이벤트 인터페이스는 두 가지 방법으로 구성됩니다.

  • get_pending_event_count() Returns the number of pending events on the queue.
    대기열에있는 보류중인 이벤트의 수를 반환합니다.
  • Variant pop_pending_event() Pops the first event from the queue and returns it.
    큐로부터 최초의 이벤트를 팝해서(꺼내서) 돌려줍니다.

Store Kit

Implemented in platform/iphone/in_app_store.mm
platform/iphone/in_app_store.mm 에서 구현 되었습니다.

The Store Kit API is accessible through the “InAppStore” singleton (will always be available from gdscript). It is initialized automatically. It has three methods for purchasing:
Store Kit API는 "InAppStore"싱글톤을 통해 액세스 할 수 있습니다 (항상 gdscript에서 사용할 수 있습니다). 자동으로 초기화됩니다. 구매에는 다음 세가지 방법이 있습니다.

  • Error purchase(Variant p_params);
  • Error request_product_info(Variant p_params);
  • Error restore_purchases();

and the pending_event interface
그리고 pending_event 인터페이스

int get_pending_event_count();
Variant pop_pending_event();

purchase

Purchases a product id through the Store Kit API.
Store Kit API를 통해 제품 ID를 구입합니다.

Parameters

Takes a Dictionary as a parameter, with one field, product_id, a string with your product id. Example:
Product_id라는 하나의 필드를 제품 사전에 매개 변수로 사용합니다. 예:

var result = InAppStore.purchase( { "product_id": "my_product" } )
Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다:

On error:

{
  "type": "purchase",
  "result": "error",
  "product_id": "the product id requested"
}

On success:

{
  "type": "purchase",
  "result": "ok",
  "product_id": "the product id requested"
}

request_product_info

Requests the product info on a list of product IDs.
제품 ID 목록의 제품 정보를 요청합니다.

Parameters

Takes a Dictionary as a parameter, with one field, product_ids, a string array with a list of product ids. Example:
Dictionary를 매개 변수로 사용하여 product_ids라는 하나의 필드와 제품 ID 목록이있는 문자열 배열을 가져옵니다. 예:

var result = InAppStore.request_product_info( { "product_ids": ["my_product1", "my_product2"] } )
Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다:

{
  "type": "product_info",
  "result": "ok",
  "invalid_ids": [ list of requested ids that were invalid / 유효하지 않는 요청 id 목록 ],
  "ids": [ list of ids that were valid / 유효한 id 목록],
  "titles": [ list of valid product titles (corresponds with list of valid ids) / 유효한 제품 제목 목록 (유효한 ID 목록에 해당) ],
  "descriptions": [ list of valid product descriptions / 유효한 제품 설명 목록] ,
  "prices": [ list of valid product prices / 유효한 제품 가격 목록 ],
  "localized_prices": [ list of valid product localized prices / 유효한 제품 현지 가격 목록 ],
}

restore_purchases

Restores previously made purchases on user’s account. This will create response events for each previously purchased product id.
사용자 계정에서 이전에 구매 한 항목을 복원합니다. 그러면 이전에 구입 한 각 제품 ID에 대한 응답 이벤트가 작성됩니다.

Response event

The response events will be dictionaries with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다:

{
  "type": "restore",
  "result": "ok",
  "product id": "product id of restored purchase"
}

Game Center

Implemented in platform/iphone/game_center.mm
platform/iphone/game_center.mm 에서 구현 되었습니다.

The Game Center API is available through the “GameCenter” singleton. It has 6 methods:
Game Center API는 "GameCenter"싱글 톤을 통해 사용할 수 있습니다. 그 방법에는 6 가지가 있습니다 :

  • Error post_score(Variant p_score);
  • Erroraward_achievement(Variant p_params);
  • Error reset_achievements();
  • Error request_achievements();
  • Error request_achievement_descriptions();
  • Error show_game_center(Variant p_params);

plus the standard pending event interface.
추가로 표준 보류중인(대기) 이벤트 인터페이스.

post_score

Posts a score to a Game Center leaderboard.
Game Center 리더 보드에 점수를 게시합니다.

Parameters

Takes a Dictionary as a parameter, with two fields:
사전을 매개 변수로 사용하여 두 개의 입력란을 사용합니다.

  • score a float number
  • category a string with the category name

Example:

var result = GameCenter.post_score( { "score": 100, "category": "my_leaderboard", } )
Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다:

On error:

{
  "type": "post_score",
  "result": "error",
  "error_code": the value from NSError::code,
  "error_description": the value from NSError::localizedDescription,
}

On success:

{
  "type": "post_score",
  "result": "ok",
}

award_achievement

Modifies the progress of a Game Center achievement.
Game Center 업적의 진행 상황을 수정합니다.

Parameters

Takes a Dictionary as a parameter, with 3 fields:
Dictionary를 매개 변수로 사용하여 3 개의 입력란을 사용합니다.

  • name (string) the achievement name
  • progress (float) the achievement progress from 0.0 to 100.0 (passed to GKAchievement::percentComplete)
  • show_completion_banner (bool) whether Game Center should display an achievement banner at the top of the screen
    Game Center가 화면 상단에 업적 배너를 표시할지 여부

Example:

var result = award_achievement( { "name": "hard_mode_completed", "progress": 6.1 } )
Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다.

On error:

{
  "type": "award_achievement",
  "result": "error",
  "error_code": the error code taken from NSError::code,
}

On success:

{
  "type": "award_achievement",
  "result": "ok",
}

reset_achievements

Clears all Game Center achievements. The function takes no parameters.
모든 Game Center 업적을 삭제합니다. 이 함수는 매개 변수를 사용하지 않습니다.

Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다.

On error:

{
  "type": "reset_achievements",
  "result": "error",
  "error_code": the value from NSError::code
}

On success:

{
  "type": "reset_achievements",
  "result": "ok",
}

request_achievements

Request all the Game Center achievements the player has made progress on. The function takes no parameters.
플레이어가 진행 한 모든 Game Center 업적을 요청합니다. 이 함수는 매개 변수를 사용하지 않습니다.

Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다.

On error:

{
  "type": "achievements",
  "result": "error",
  "error_code": the value from NSError::code
}

On success:

{
  "type": "achievements",
  "result": "ok",
  "names": [ list of the name of each achievement / 각 업적의 이름 목록],
  "progress": [ list of the progress made on each achievement / 각 업적에 대한 진행 상황 목록 ]
}

request_achievement_descriptions

Request the descriptions of all existing Game Center achievements regardless of progress. The function takes no parameters.
진행 상황에 관계없이 기존의 모든 Game Center 업적에 대한 설명을 요청하십시오. 이 함수는 매개 변수를 사용하지 않습니다.

Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다:

On error:

{
  "type": "achievement_descriptions",
  "result": "error",
  "error_code": the value from NSError::code
}

On success:

{
  "type": "achievement_descriptions",
  "result": "ok",
  "names": [ list of the name of each achievement / 각 업적의 이름 목록 ],
  "titles": [ list of the title of each achievement / 각 업적의 제목 목록 ]
  "unachieved_descriptions": [ list of the description of each achievement when it is unachieved / 미 달성시 각 업적에 대한 설명 목록 ]
  "achieved_descriptions": [ list of the description of each achievement when it is achieved / 달성 될 때 각 업적에 대한 설명 목록 ]
  "maximum_points": [ list of the points earned by completing each achievement / 각 업적을 완료하여 얻은 포인트 목록]
  "hidden": [ list of booleans indicating whether each achievement is initially visible / 각 업적이 처음에 표시되는지 여부를 나타내는 부울리스트]
  "replayable": [ list of booleans indicating whether each achievement can be earned more than once / 각 업적을 한 번 이상받을 수 있는지 여부를 나타내는 부울리스트]
}

show_game_center

Displays the built in Game Center overlay showing leaderboards, achievements, and challenges.
리더 보드, 업적 및 과제를 보여주는 내장 된 Game Center 오버레이를 표시합니다.

Parameters

Takes a Dictionary as a parameter, with two fields:
사전을 매개 변수로 사용하여 두 개의 입력란을 사용합니다.

  • view (string) (optional) the name of the view to present. Accepts “default”, “leaderboards”, “achievements”, or “challenges”. Defaults to “default”.
    (선택 사항) 제시할 뷰의 이름. '기본', '리더보드', '업적' 또는 '도전'을 허용합니다. 기본값은 "default"입니다.
  • leaderboard_name (string) (optional) the name of the leaderboard to present. Only used when “view” is “leaderboards” (or “default” is configured to show leaderboards). If not specified, Game Center will display the aggregate leaderboard.
    (선택 사항) 제시할 리더보드의 이름입니다. 'view'가 '리더 보드'인 경우에만 사용됩니다 (또는 '기본'은 리더 보드를 표시하도록 구성됨). 지정하지 않으면 Game Center에 집계표가 표시됩니다.

Examples:

var result = show_game_center( { "view": "leaderboards", "leaderboard_name": "best_time_leaderboard" } )
var result = show_game_center( { "view": "achievements" } )
Response event

The response event will be a dictionary with the following fields:
응답 이벤트는 다음 필드가있는 사전입니다.

On close:

{
  "type": "show_game_center",
  "result": "ok",
}

Multi-platform games

When working on a multi-platform game, you won’t always have the “GameCenter” singleton available (for example when running on PC or Android). Because the gdscript compiler looks up the singletons at compile time, you can’t just query the singletons to see and use what you need inside a conditional block, you need to also define them as valid identifiers (local variable or class member). This is an example of how to work around this in a class:
멀티 플랫폼 게임에서 작업 할 때 항상 "GameCenter" 싱글톤을 사용할 수있는 것은 아닙니다 (예 : PC 또는 Android에서 실행 중일 때). gdscript 컴파일러는 컴파일 타임에 싱글톤을 조회하기 때문에 싱글톤을 쿼리하여 조건부 블록에서 필요한 것 을보고 사용할 수 없으며 유효한 식별자 (로컬 변수 또는 클래스 멤버)로 정의해야합니다. 다음은 클래스에서 이 문제를 해결하는 방법의 예입니다:

var GameCenter = null # define it as a class member

func post_score(p_score):
    if GameCenter == null:
        return
    GameCenter.post_score( { "value": p_score, "category": "my_leaderboard" } )

func check_events():
    while GameCenter.get_pending_event_count() > 0:
        # do something with events here
        pass

func _ready():
    # check if the singleton exists
    if Globals.has_singleton("GameCenter"):
        GameCenter = Globals.get_singleton("GameCenter")
        # connect your timer here to the "check_events" function


반응형

'game > godot' 카테고리의 다른 글

Gdoot - Platform-specific  (0) 2018.11.28
Godot - Console support in Godot  (0) 2018.11.28
Gdoot - Android in-app purchases  (0) 2018.11.26
Godot3 - Compiling for Android - Troubleshooting Fail  (0) 2018.11.24
Godot3 - Compiling for Android  (0) 2018.11.23