見出し画像

【Godot3.2】マウス入力の基本

ごきげんよう。Gutterfly Farmです。

今日はGodotにおけるマウス入力を学びます。

プロジェクトの作成やノードについての基礎知識はGodot Documentをどうぞ。


ノードを準備する

まずは以下のノードを用意。

画像1

Gutterfly Farmのゲームでは画像よりも文字を多用するのでLabelを使います。TextureRectを使って画像を表示してもいいでしょう。

Labelに適当な文字をいれます。

画像2


クリックできる範囲を決める

最初に用意したCollisionShape2Dの横に警告マークがでています。これは何かしらのShapeを必要とするからです。

画像3

Inspecterから四角いShapeを選んで、2Dエディタ上で文字にかぶせます。

画像4

Scene Dockに表示されていた警告マークが消えているはずです。

マウス入力を受け取る

Area2Dにスクリプトをアタッチします。スクリプトについては前回のnoteも参考にしてください。

Area2Dを選択した状態で、Node > Signals > input_event(viewport:...)を選択して…

画像5

そのままConnectします。スクリプトに _on_Area2D_input_event(vierport...)メソッドが追加されています。

画像6

緑のアイコンが光っているので、シグナルが接続されているのも確認できます。

試しにコンソールに文字を出してみましょう。

func _on_Area2D_input_event(viewport, event, shape_idx):
	print(event.as_text())

保存してF6を押すと…

画像7

Labelにマウスカーソルを載せた瞬間に、文字があふれてきます。この状態ではマウスボタンだけでなく、マウスの動きやホイールまで検知してしまうからです。

is を使うことで特定のクラスかどうか判定できます。MouseButtonのみを受けつけるようにしましょう。

func _on_Area2D_input_event(viewport, event, shape_idx):
	if event is InputEventMouseButton:
    	print("click")

マウスの動きには反応しなくなりましたが、ボタンを押す/離すと2度反応しています。

pressedプロパティを使ってpressされたときだけ文字を出します。

func _on_Area2D_input_event(viewport, event, shape_idx):
    if event is InputEventMouseButton and event.pressed:
        print("click")

左クリックに限定したいときはbutton_indexを使います。

func _on_Area2D_input_event(viewport, event, shape_idx):
	if event is InputEventMouseButton and event.pressed:
		if event.button_index == BUTTON_LEFT:
			print("left click")

InputEventMouseButtonはInputEventMouseを継承しているのでpositionなんかも使えます。

func _on_Area2D_input_event(viewport, event, shape_idx):
	if event is InputEventMouseButton and event.pressed:
        if event.button_index == BUTTON_LEFT:
		  print("left click ", event.position)

画像9

左クリックしたときに座標を出力することができました。

ついでに、もうひとつシグナルを接続することでマウスが載ったときの判定も簡単にできます。

画像8

もう色で判定とかしなくていいわけだ。


その先へ?

ひとまず、マウスのクリックを検知することができました。もっといろいろな数値を取得できるはずなので、Godotのクラスリファレンスも読んでおきましょう。


課題

・文字の長さに応じてCollisionShape2Dの大きさを変えたい
・たくさん情報を綺麗に表示するにはコンテナノードに収める必要がある

この記事が気に入ったらサポートをしてみませんか?