シンプルなドア
動作
左クリックで開く
Playerがdoorの範囲に入っているときだけクリックで開く
NPC(敵) は、近づくだけで開く
光を遮断する
https://gyazo.com/0f8b0c9294183329ef8589a4329ceb13
ドア開閉 & オーディオ再生トラック
AnimationPlayer ノードを使って、新規アニメーションOpenを作成
アニメーションと共になる音は、AnimationのAudioClipトラックで鳴らしたほうがいい
エディタ上で再生して音を確認できる
複数のAudioStreamPlayerを用意しなくても、時間経過でAudioStream(音声ファイル)を切り替えられる。
https://gyazo.com/37f50bcd0e041cf758803736cfffb813
Area2Dに入る/出る/クリック signal
area2Dには body (PhysicsNode)に関するイベントがあるが、実は
CollisionShapeには、マウスイベントに関するsignalがある。
今回は、それらをDoorノードのスクリプトにアタッチしておく
Script
code: Door.py
extends Area2D
# Collision Layer は ビットで表現される。(0番, 1番, 2番 ... ) -> (1, 2, 4, ....)
const PLAYER_LAYER = 0b1
const TILEMAP_LAYER = 0b10
const NPC_LAYER = 0b100
var can_click = false
# 型アサーション : on_body_** 系のsignalは、PhysicsBody2Dを渡してくる
# PhysicsBody2D -> KinematicBody2D, RigidBody2D, StaticBody2D の継承元
func _on_Door_body_entered(body: PhysicsBody2D):
if body.collision_layer == PLAYER_LAYER:
can_click = true
else:
open()
func _on_Door_body_exited(body: PhysicsBody2D):
if body.collision_layer == PLAYER_LAYER:
can_click = false
# BUTTON_LEFT : マウスの左ボタンの定数
func _on_Door_input_event(viewport, event, shape_idx):
if Input.is_mouse_button_pressed(BUTTON_LEFT) and can_click:
open()
func open():
$AnimationPlayer.play("Open")
Wall と Door のZインデックスを調整
ドアがスライドすると、壁に重なる。
TileMapのWallのZ indexを調整する
https://gyazo.com/a1be7106db48d67ce3a1e645843ede3e
TileMap全体のZindexをいじると床まで高くなってしまうので、
TileSet > Walls のエリアを選択 > Selected Tile > Z index