2021-08-01 Godot Engine > ボタン押下時に中国語のピンイン表示とMP3再生 > シーンの読込み

### 動作環境

```
Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official
```

### 概要

ボタン押下時に下記を実施する。

- ピンインのpngを表示
- MP3の再生

### シーン

二つのシーンを用意する。

- Main.tscn
    - Buttonだけ配置
    - Main.gdをアタッチ
- 46.tscn
    - 46.gdをアタッチ
    - 以下の二つのノードを持つ
        - AudioStreamPlayer : MP3再生用 (46.mp3)
        - AnimatedSprite : ピンイン表示用 (46.png)


### 実装

インスタンスが増え続けるためremove_1st()で古いものを削除しておく。

```python:Main.gd
extends Node2D

var charlist = []

func _ready():
	pass # Replace with function body.

func remove_1st():
	if charlist.size() > 0:
		charlist[0].queue_free()
		charlist.remove(0)

func make_child():
	var name = "res://46.tscn"
	var scene = load(name)
	var instance = scene.instance()
	charlist.append(instance)
	add_child(instance)
	instance.position = Vector2(100, 100)

func _on_Button_pressed():
	remove_1st()
	make_child()
```

MP3再生については音が大きかったためvolume_dbを変更。
再生速度もpitch_scale変更で可能。

```python:46.gd
extends Node2D

onready var audio = $AudioStreamPlayer

func _ready():
	audio.volume_db = -15
	audio.pitch_scale = 1.05
	audio.play()
```


### 実行例

46ボタン押下後に以下のようになる。
(音声が流れている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9dfafa62-68f7-8579-0ca2-5c1dc9e9dd3c.png)


### コードでmp3ファイルをAudioStreamPlayerのstreamに設定する場合

参考: https://godotengine.org/qa/20558/how-to-set-stream-on-audiostreamplayer2d

```python:46.gd
extends Node2D

onready var audio = $AudioStreamPlayer

func _ready():
	var player = AudioStreamPlayer.new()
	var audio_file = "res://046.mp3"
	var sfx = load(audio_file)
	sfx.set_loop(false)
	audio.stream = sfx
	audio.volume_db = -15
	audio.pitch_scale = 1.05
	audio.play()
```

## v0.2 グローバル変数で表示と再生する題材を変更

- Main.tscn
    - Main.gdアタッチ
    - Button46
    - Button48
- 46.tscn (名前が46はもはや変だが)
    - 46.gdアタッチ
    - AnimatedSprite46 : 46.pngを関連付け
    - AnimatedSprite48 : 48.pngを関連付け
- Global.gd
    - AutoLoad設定する
        - https://docs.godotengine.org/en/3.0/getting_started/step_by_step/singletons_autoload.html

```python:Main.gd
extends Node2D

var charlist = []

func _ready():
	pass # Replace with function body.

func remove_1st():
	if charlist.size() > 0:
		charlist[0].queue_free()
		charlist.remove(0)

func make_child():
	var name = "res://46.tscn"
	var scene = load(name)
	var instance = scene.instance()
	charlist.append(instance)
	add_child(instance)
	instance.position = Vector2(100, 100)

func _on_Button_pressed(extra_arg_0):
	Global.current_number = extra_arg_0
	remove_1st()
	make_child()
```

```python:46.gd
extends Node2D

onready var audio = $AudioStreamPlayer

func _ready():
	# 1. Hide all the Animted Sprite
	for idx in range(50):
		var name = "AnimatedSprite%02d" % idx
		var anime = get_node(name)
		if anime != null:
			anime.hide()

	# 2. Play sound
	var player = AudioStreamPlayer.new()
	var audio_file = "res://%03d.mp3" % Global.current_number
	var sfx = load(audio_file)
	sfx.set_loop(false)
	audio.stream = sfx
	audio.volume_db = -15
	audio.pitch_scale = 1.05
	audio.play()

	# 3. Show Animated Sprite
	var name = "AnimatedSprite%02d" % Global.current_number  ## e.g. AnimatedSprite46
	var anime = get_node(name)
	if anime != null:
		anime.show()
```

```globa.gd
extends Node

var current_number = 46

func _ready():
	pass # Replace with function body.
```

global.gdで定義したcurrent_numberは`Global.current_number`として使用できるようだ。先頭が大文字になる。