Implemented group highlight on hover
It's not currently stable, but it's ok for now.
This commit is contained in:
68
grid.gd
68
grid.gd
@@ -1,4 +1,5 @@
|
||||
extends Node2D
|
||||
class_name Grid
|
||||
|
||||
@export var rows: int = 5
|
||||
@export var cols: int = 5
|
||||
@@ -8,6 +9,7 @@ extends Node2D
|
||||
|
||||
var grid: Array[Array]
|
||||
var groups: Array
|
||||
var hovered_group: Array
|
||||
|
||||
var debug_label: Label
|
||||
|
||||
@@ -15,7 +17,7 @@ var token = preload("res://token.tscn")
|
||||
|
||||
func _ready():
|
||||
debug_label = $"Debug Label"
|
||||
|
||||
|
||||
for row in rows:
|
||||
grid.append([])
|
||||
for column in cols:
|
||||
@@ -25,13 +27,14 @@ func _ready():
|
||||
token_node.set_type(randi_range(0,3) as Token.token_type)
|
||||
token_node.set_debug_label(str(row) + "," + str(column))
|
||||
token_node.token_clicked.connect(_on_token_clicked.bind([row,column]))
|
||||
token_node.token_hovered.connect(_on_token_hovered.bind([row,column]))
|
||||
grid[row].append(token_node)
|
||||
|
||||
|
||||
calculate_token_groups()
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
pass
|
||||
|
||||
|
||||
func _on_token_clicked(token_coord):
|
||||
var group = get_group_of_token(token_coord)
|
||||
if group.size() >= min_group_size:
|
||||
@@ -39,24 +42,41 @@ func _on_token_clicked(token_coord):
|
||||
var current_token = grid[coord[0]][coord[1]] as Token
|
||||
current_token.queue_free()
|
||||
grid[coord[0]][coord[1]] = null # do I actually want a null value or should there be some other placeholder?
|
||||
|
||||
|
||||
update_grid()
|
||||
|
||||
func highlight_group(group: Array):
|
||||
pass
|
||||
|
||||
|
||||
func _on_token_hovered(enter: bool, coord: Array):
|
||||
var group = get_group_of_token(coord)
|
||||
if enter:
|
||||
highlight_group(group, true)
|
||||
else:
|
||||
highlight_group(group, false)
|
||||
|
||||
func highlight_group(group: Array, enable: bool):
|
||||
if group != hovered_group:
|
||||
# Un-highlight current, update current
|
||||
for coord in hovered_group:
|
||||
var current_token = grid[coord[0]][coord[1]]
|
||||
current_token.set_highlighted(false)
|
||||
|
||||
for coord in group:
|
||||
var current_token = grid[coord[0]][coord[1]] as Token
|
||||
current_token.set_highlighted(enable)
|
||||
|
||||
hovered_group = group
|
||||
|
||||
func update_grid():
|
||||
pass
|
||||
|
||||
|
||||
func populate_grid():
|
||||
pass
|
||||
|
||||
|
||||
func to_grid_coord(idx):
|
||||
pass
|
||||
|
||||
|
||||
func to_index(idx):
|
||||
pass
|
||||
|
||||
|
||||
func calculate_token_groups():
|
||||
groups = []
|
||||
var visited_nodes = []
|
||||
@@ -65,45 +85,45 @@ func calculate_token_groups():
|
||||
for col in cols:
|
||||
if [row, col] in visited_nodes:
|
||||
continue
|
||||
|
||||
|
||||
group_queue.append([row,col])
|
||||
|
||||
|
||||
var new_group = []
|
||||
while not group_queue.is_empty():
|
||||
var current_coord = group_queue.pop_back()
|
||||
var current_token = grid[current_coord[0]][current_coord[1]]
|
||||
new_group.append(current_coord)
|
||||
visited_nodes.append(current_coord)
|
||||
|
||||
|
||||
var adjacent_token_coords = [
|
||||
[current_coord[0] - 1, current_coord[1]],
|
||||
[current_coord[0], current_coord[1] + 1],
|
||||
[current_coord[0] + 1, current_coord[1]],
|
||||
[current_coord[0], current_coord[1] - 1]
|
||||
]
|
||||
|
||||
|
||||
var valid_coords = adjacent_token_coords.filter(
|
||||
func(coord_pair):
|
||||
func(coord_pair):
|
||||
return (
|
||||
coord_pair[0] >= 0 and
|
||||
coord_pair[0] < rows and
|
||||
coord_pair[1] >= 0 and
|
||||
coord_pair[0] >= 0 and
|
||||
coord_pair[0] < rows and
|
||||
coord_pair[1] >= 0 and
|
||||
coord_pair[1] < cols
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
for coord in valid_coords:
|
||||
if (coord not in visited_nodes and
|
||||
grid[coord[0]][coord[1]].type == current_token.type and
|
||||
coord not in group_queue):
|
||||
group_queue.append(coord)
|
||||
groups.append(new_group)
|
||||
|
||||
|
||||
debug_label.text = str(groups)
|
||||
|
||||
func get_group_of_token(token_coord) -> Array:
|
||||
for group in groups:
|
||||
if token_coord in group:
|
||||
return group
|
||||
|
||||
|
||||
return []
|
||||
|
||||
Reference in New Issue
Block a user