In Action Game Maker MV, you could use the “Gimmick Tile” feature to change variables or generate particles when a tile and the player overlapped, or triggered by other conditions. Can you do something similar in Action Game Maker?
Tile’s don’t have the gimmick capabilities as PGM. I know there has been discussion about possibly providing special options for tiles in the future, but I can’t say if, when, or how it will happen.
For now we have these available options for tiles and you can utilize a GameObject with visual script to accomplish PGM gimmick behavior:
As for this, while there is no built-in functionality for gimmick tiles, there is an alternative method using scripts.
The reason is that Godot does not adopt a design where “scripts are assigned directly to tiles themselves”; instead, objects that operate via scripts are intended to use nodes such as “StaticBody”, “CharacterBody”, or “Area2D”.
While we are considering features that can serve as alternatives to gimmick tiles without scripts, no such features currently exist.
Regarding the solutions for the consultation you provided:
Changing variables via triggers such as tiles overlapping with the player
It would be better to use the tile’s Area ID instead of a script, and attach a child object to the player that changes variables when a specific Area ID is reached.
Generating particles via triggers such as tiles overlapping with the player
It would be better to create an object using StaticBody2D. By configuring it as shown below, you can set it so that GPUParticles2D particles are emitted while the character is touching it.
Sample Object:
StaticBody2D_Gimmick.zip (1019 bytes)
Code Content:
extends StaticBody2D
@onready var particles: GPUParticles2D = $GPUParticles2D
@onready var area: Area2D = $Area2D
func _ready() -> void:
particles.emitting = false # Turn off Emitting
# Connect signals via code
area.body_entered.connect(_on_area_body_entered)
area.body_exited.connect(_on_area_body_exited)
func _on_area_body_entered(body: Node2D) -> void:
if body.is_in_group("Player"):
if particles.one_shot:
particles.restart()
particles.emitting = true
func _on_area_body_exited(body: Node2D) -> void:
if body.is_in_group("Player"):
# Turn off Emitting when leaving the Area
if !particles.one_shot:
particles.emitting = false
Thank you for the explanation.
I apologize, but since I have very little knowledge of Godot, I have no idea what specifically needs to be implemented or how to do so regarding the solution you provided. I also do not understand how to use the sample object you shared.
Could you please provide an explanation with screenshots or a video?
Regarding how to use the sample object,
Place the included static_body_2d.tscn and static_body_2d.gd files in the same folder, then load them into the stage via drag-and-drop or instantiation, just like any other game object. They should function correctly.
The internal structure is as follows:
- The topmost CollisionShape2D serves as the “wall collision shape.”
- GPUParticles2D handles the particle effects.
- The CollisionShape2D under Area2D defines the “detection range for contact.”
The mechanism works such that while the “Player’s wall collision shape” is within the “detection range for contact,” particles are emitted from the particle system named “GPUParticles2D.”
Basically, follow these steps:
- Add a new Sprite2D and assign a texture.
- Adjust the wall collision shape size to match the texture dimensions.
- Set the contact detection area slightly larger than the wall collision shape.
- Configure “GPUParticles2D” to emit particles.
Following these steps should make it work.
You might also be able to customize it by passing this code to ChatGPT or similar tools.
Thank you for the explanation.
With the old Akutsu’s gimmick tiles, it was possible to change a variable after touching the tile and then have the tile disappear. Since this is only for displaying particles, is that not possible?
I am trying to reproduce a Mario-style coin using a gimmick tile.
We discussed this within the team, and Baz-san implemented it as a plugin. How about using this feature?

