Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@2dgames_jp

【Godot】ゲームを一時停止するポップアップウィンドウの実装方法

概要

この記事では、ゲームを一時停止するポップアップウィンドウを実装します。

最も簡単なポップアップウィンドウ

OS.alert() と書くとゲームを止めて、ウィンドウがポップアップ表示されます。

OS.alert("メッセージウィンドウ", "")

スクリーンショット_2021_02_11_0_47.png

ただこれでは見栄えが良くないので、あくまでテスト用ですね。

ゲームを止めるには get_tree().pausedtrue を指定すると、ゲーム全体が停止します。ただ全部止まってしまうと解除できないので、ポップアップウィンドウはこの停止を無効にする設定をしておき、ウィンドウが閉じたら一時停止を解除する……という流れになるようにします。

動き回るオブジェクトを作成する

ゲームが一時停止されていることを確認するため、画面を動き回るオブジェクトを作ります。

例えば、Area2D ノード(シーン)を作成してスクリプトを以下のように記述します。

MovingObj
extends Node2D

var velocity = Vector2(200, 100)

func _ready():
    pass

func _process(delta):
    position += velocity * delta
    if position.x < 0:
        position.x = 0
        velocity.x *= -1
    if position.y < 0:
        position.y = 0
        velocity.y *= -1
    if position.x > 480:
        position.x = 480
        velocity.x *= -1
    if position.y > 320:
        position.y = 320
        velocity.y *= -1

画面内を動き回ります。

shot.gif

ポップアップウィンドウ(シーン)の作成

次にポップアップウィンドウ(シーン)を作成します。

ノード構成は以下のようにしました

Dialog (Popup): ポップアップ(シーン)
  +-- FadeBg (ColorRect): 暗転用の板
  +-- Label: メッセージテキスト
  +-- Button: OKボタン

Godot_Engine_-_TestPopup_-_Dialog_tscn____.png

テスト用なので、テキスト内容やボタンテキストは最低限のものとなります。

Godot_Engine_-_TestPopup_-_Dialog_tscn.png

このポップアップウィンドウを一時停止させないようにするため、Dialog ノードの Pause > ModeProcess に変更しておきます。
Godot_Engine_-_TestPopup_-_Dialog_tscn_____と_Qiita.png

ボタンクリックのスクリプト

Dialogノードにスクリプトをアタッチして以下のように記述します。

Dialog.gd
extends Popup

func _on_Button_pressed():
    # ボタンがクリックされたらインスタンスを消す
    queue_free()

ボタン(Button)の pressed シグナルに _on_Button_pressed() を接続しています。
ボタンクリック時は hide() で非表示にするか、queue_free() でインスタンスを削除するか、好みがわかれそうですが、今回は削除する方法としました。

メインシーンからポップアップウィンドウを呼び出す。

Mainシーンを作成して、動き回るオブジェクトとボタンを配置します。
Godot_Engine_-_TestPopup_-_Main_tscn.png

実行イメージです。
shot.gif

Mainシーンにスクリプトをアタッチして以下のように記述します。

Main.gd
extends Node2D

# ポップアップウィンドウをプリロード
var Popup = preload("res://Dialog.tscn")

func _on_Button_pressed():
    # ポップアップウィンドウ呼び出し
    var popup = Popup.instance()

    # ポーズ開始。ゲームを止める
    get_tree().paused = true
    add_child(popup)
    popup.show_modal(true)

    # popup終了時に "_resume()" を呼び出す
    popup.connect('tree_exited', self, '_resume')

func _resume():
    # ウィンドウを閉じたときのコールバック
    var tree = get_tree()
    if tree:
        # ポーズ解除
        tree.paused = false 

ボタンの press() シグナルに _on_Button_pressed() を接続しておきます。
Godot_Engine_-_TestPopup_-_Main_tscn.png

ポップアップウィンドウを閉じた場合に、"tree_exited" シグナルに "_resume()" を接続しています。
そして、"resume()" でポーズを解除するようにしています。

では実行して一時停止と解除ができることを確認します。
shot.gif

参考

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2dgames_jp
ゲーム作ってます

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?