0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-10

概要

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

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

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

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?