I studied programming 20 years ago, but I only now decided to return and try again due to personal problems.
I generally don’t ask for help, I prefer to study to understand the subject, but I find myself stuck.
I’ve been studying Godot for a month and a half, and I’ve already understood almost the entire program, but the language, despite being easy to understand, is difficult to write. I’ve been trying to do simple logic for two weeks, but nothing I try works.
The funniest part is that I’m stuck in what I swore would be the easiest part…
What I’m trying to do is simple: I have a button and when I click it I instantiate an object (which must follow the mouse pointer) and I duplicate it in my scene. In other words, it is a builder like Cities Skylines but 2D.
I’ve tried over 20 different codes but none of them worked…here’s the current code:
Contol–
–Button
extends Button
var object_scene: PackedScene = preload(“res://scenes/Buildings/build_01.tscn”)
var object_to_duplicate: Node2D = null
extends Node2D
# O objeto que vc planeja criar
var object_scene: PackedScene = preload("res://color_rect.tscn")
# A instancia do objeto criado
var new_object: Node
func _ready():
# Começa como falso pq vc n precisa dele funcionando enquanto não
# tiver criando algo
set_process(false)
func _process(delta: float) -> void:
# Seta a posição do seu objeto para a posição do mouse, questões
# de centralização vão variar de acordo com o objeto sendo mexido
# no seu caso vai ser bom ter uma função que retorne o tamanho do objeto
# sendo criado pra setar um offset, como eu sei que o tamanho do node
# então uso ele diretamente
new_object.global_position = get_global_mouse_position() - (Vector2(40, 40)/2)
func _unhandled_input(event: InputEvent) -> void:
# Se o evento for um clique do mouse
if event is InputEventMouseButton:
# Se new_object não for nulo, o clique for do botão esquerdo do mouse
# e se for pressionado, desliga _process e deixa o node parado na
# posição do mouse
if new_object and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
# Aqui uso modulate pq estou simulando o objeto com
# um node do tipo ColorRect, pra o seu caso vc deve criar uma
# função no objeto pra avisar quando ele esta na posição final
# caso vc queira que ele troque de cor ou qualquer outra ação
new_object.modulate = Color.WHITE
# Desliga o _process pra não mexer mais o node
set_process(false)
new_object = null
func _on_button_pressed() -> void:
# Instancia seu novo objeto e garante que vc tem uma referencia dele,
# não precisa duplicar o node
new_object = object_scene.instantiate()
# Aqui estou usando add_child direto só pra exemplo mesmo, mas o ideal
# é vc ter um node exclusivamente pra segurar todos as construções
add_child(new_object)
# Isso aqui é só pra ele mudar de cor enquanto movo, vc n vai usar essa
# linha abaixo
new_object.modulate = Color.YELLOW
# Essa vc precisa, vai ligar o callback _process para mexer seu novo objeto
set_process(true)