Action Game Maker でドラッグ&ドロップする方法を解説します。
この記事を書いた後にプラグインがあるのを発見した……こちらでもできるようです。
1.プロジェクト設定
まずメニューから、プロジェクト設定>インプットマップで、マウスボタンを設定します。
左ボタンを、Mouse_Lとします。(右ボタンMouse_Rも設定しているけどはここでは使いません)
同じくプロジェクト設定>一般>物理>2Dを全部0にして、重力の効果をなくしておきます。(無重力は説明のためなので、必要なら重力ありでも可)
2.ゲームシーン
ゲームシーン(game_scene2)を新規作成して、SceneTransitionに配置
ゲームオブジェクト(dragdrop)も新規作成して。ゲームシーン(game_scene2)のBaselayerに配置します。
画像ないですが、ゲームシーン(game_scene2)のインスペクターでの重力も0にしておきます。
3.ColorRectとArea2Dを配置
ゲームオブジェクト(dragdrop)に、ColorRect(とりあえず四角形を表示)とArea2Dを配置し、さらにArea2DにCollisionShape2Dを取り付けます。
3-1.ColorRect
ColorRectは、右のインスペクターのレイアウト>アンカー位置を中央に、Mouse>フィルター設定をignoreにします。フィルター設定を忘れるとマウスクリックが検出されませんので注意。
3-2.CollisionShape2D
CollisionShape2Dのインスペクターの一番上、シェイプを新規RectangleShape2Dに設定。
その領域(青い四角形)を、四角形と同じにしておきます。ここの領域でマウスクリックの判定をします。
3-3.Area2D
Area2DにGDScriptを付けます。
ソースは以下。ソースを貼り付けたら、右のインスペクターの一番上variable settingsに、左のVariableSettingsというシーンをドラッグ&ドロップして設定します。
extends Area2D
#マウスでおいたり持ち上げたりできるオブジェクト
@export var variable_settings: VariableSettings
var _drag_mode = 0
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
if _drag_mode:
var m_pos = get_global_mouse_position()
variable_settings.set_value("position_x", m_pos.x)
variable_settings.set_value("position_y", m_pos.y)
pass
func _on_input_event(_viewport, _event, _shape_idx):
if _event is InputEventMouseButton:
if _event.is_action_pressed("Mouse_L"):
_drag_mode = true
print("[Mouse_L]Click/Unclick at: ", _event.position)
elif _event.is_action_released("Mouse_L"):
_drag_mode = false
elif _event is InputEventMouseMotion:
print("Mouse Motion at: ", _event.position)
3-4 input_eventシグナルを接続
マウスが、Area2DのCollisionShape2D内に入ったことを検出するのに、input_eventシグナルを使います。Area2Dの右のノード>シグナルから、input_eventをダブルクリック。_on_input_eventを選択すると、シグナルとGDScriptが接続されます。
接続完了すると、緑色のアイコンがシグナルとスクリプトの関数のところに表示されます。
4.実行すると四角形がドラッグできるようになりました。
ゲームオブジェクトには通常のビジュアルスクリプトをつけることができます。
実行画面 ↓
5.補足説明
ActionGameMakerのノードにはVisualScriptかGDScriptの一つしか付けられないので、新たにArea2Dを追加しています。
Area2Dで親のCollisionShape2Dのシグナルが検出できなかったので、子のCollisionShape2Dのシグナルを利用しています。
マウスの入力を感知し、
ボタンが押されたら、_drag_mode=true、
離したら_drag_mode=false
_drag_mode=trueの間、
var m_pos = get_global_mouse_position()
variable_settings.set_value("position_x", m_pos.x)
variable_settings.set_value("position_y", m_pos.y)
で、親オブジェクトの座標(position)を直接、マウスカーソルの座標(m_pos)に書き換えています。
これでドラッグ&ドロップができました。
直接座標を書き換えているので、ドラッグ中の当たり判定はおかしな動きになってしまうので、当たり判定の設定に工夫が必要です。(ここでは特に説明していません)
6.以下のサイトを参考にしました。(感謝)