Please explain more on how to do TextureRect on reddot things. I now successfully make a new zone. but it won't appear in map. In explorationregions.gd there are no such thing that define position of each zone.
Viewing post in Modding help
explorationregions.gd only defines the pairs of dots connected by lines on the map.
In map.gd, the function "showtooltip(node)" creates the lines for each exit listed for the zone. The dots are Images displayed by TextureRect GUI controls(https://docs.godotengine.org/en/3.1/classes/class_texturerect.html). The position of those controls is what determines where the dot is. The name of those controls needs to match the name of a zone. The only way to get a zone to appear on the map is to add a new control node to the map.scn scene tree.
The following can be added to the beginning of _ready() in map.gd, as a minimal setup for adding a new red dot node:
var newNode = find_node("sea").duplicate()
newNode.rect_position = Vector2(100,100)
newNode.name = "newZone"
find_node("roads").add_child(newNode)
It seems like adding code to map.gd anywhere lead to freeze of the map. Here is my code to the end of _ready()
extends Control
#warning-ignore:unused_class_variable
var mouse_in = false
#warning-
ignore:unused_class_variable
var dragging = false
onready var size = $TextureRect.get_size()
var
offset = Vector2()
var status = 'none'
var timer = 0
var currentloc = null
var newNode = find_node("sea").duplicate()
newNode.rect_position = Vector2(100,100)
newNode.name = "newZone"
find_node("roads").add_child(newNode)
func _ready():
for i in get_node("TextureRect/roads").get_children() +
get_node("TextureRect/towns").get_children():
i.connect
("mouse_entered",self,'showtooltip',[i])
i.connect
("mouse_exited",self,'hidetooltip')
func _input(event):
if self.is_visible_in_tree() == false:
return
if event.is_action_pressed("LMB"):
var eventpos =
event.global_position
var barpos = $TextureRect.get_global_position()
size =
$TextureRect.get_size()
var target_rect = Rect2(barpos.x, barpos.y, size.x, size.y)
if target_rect.has_point(eventpos):
status = 'clicked'
offset = barpos - eventpos
if event.is_action_released("LMB"):
status
= 'none'
if status == 'clicked' and event.is_class("InputEventMouseMotion"):
status = 'dragging'
#centermap('frostford')
if status == 'dragging':
$TextureRect.set_global_position(event.global_position+offset)
So I said "The following can be added to the beginning of _ready() in map.gd."
You have: "The following code added before the beginning of _ready() in map.gd."
Spot the difference? It freezes cause you put local-scope code in the file-scoped portion of the code, which is completely undefined behavior. I tried to be quite precise with my description, because there are very few locations you can put this code in the file to get the expected behavior. Perhaps I was too concise, but I am going to sleep now. The code I gave you only works inside a function and not inside a for loop.