Extended HexGrid to allow getting hex center from offset coordinates.
parent
f0c3035a5f
commit
1a820aa26a
|
@ -207,6 +207,12 @@ func get_hex_center(hex):
|
|||
hex = HexCell.new(hex)
|
||||
return hex_transform * hex.axial_coords
|
||||
|
||||
func get_hex_center_from_offset(offset):
|
||||
# Returns hex's centre position at the given offset coordinates
|
||||
var hex = HexCell.new()
|
||||
hex.offset_coords = offset
|
||||
return hex_transform * hex.axial_coords
|
||||
|
||||
func get_hex_at(coords):
|
||||
# Returns a HexCell at the given Vector2/3 on the projection plane
|
||||
# If the given value is a Vector3, its x,z coords will be used
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
tool
|
||||
extends Polygon2D
|
||||
|
||||
export(Color) var OutLine = Color(0,0,0) setget set_color
|
||||
export(float) var Width = 2.0 setget set_width
|
||||
|
||||
func _draw():
|
||||
var poly = get_polygon()
|
||||
for i in range(1 , poly.size()):
|
||||
draw_line(poly[i-1] , poly[i], OutLine , Width)
|
||||
draw_line(poly[poly.size() - 1] , poly[0], OutLine , Width)
|
||||
|
||||
func set_color(color):
|
||||
OutLine = color
|
||||
update()
|
||||
|
||||
func set_width(new_width):
|
||||
Width = new_width
|
||||
update()
|
|
@ -0,0 +1,51 @@
|
|||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://HexShape.gd" type="Script" id=1]
|
||||
|
||||
[node name="Highlight" type="Polygon2D"]
|
||||
color = Color( 1, 1, 1, 0 )
|
||||
polygon = PoolVector2Array( -12.5, 21.6506, 12.5, 21.6506, 25, 0, 12.5, -21.6506, -12.5, -21.6506, -25, 0 )
|
||||
script = ExtResource( 1 )
|
||||
OutLine = Color( 1, 1, 1, 0.133333 )
|
||||
|
||||
[node name="Label" type="Label" parent="."]
|
||||
visible = false
|
||||
margin_left = 5.0
|
||||
margin_top = -39.0
|
||||
margin_right = 52.0
|
||||
margin_bottom = -25.0
|
||||
text = "SCREEN"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="AreaCoords" type="Label" parent="."]
|
||||
visible = false
|
||||
margin_left = 55.0
|
||||
margin_top = -39.0
|
||||
margin_right = 105.0
|
||||
margin_bottom = -25.0
|
||||
text = "SCREEN"
|
||||
|
||||
[node name="Label2" type="Label" parent="."]
|
||||
visible = false
|
||||
margin_left = 25.0
|
||||
margin_top = -19.0
|
||||
margin_right = 56.0
|
||||
margin_bottom = -5.0
|
||||
text = "HEX"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="HexCoords" type="Label" parent="."]
|
||||
margin_left = -26.0
|
||||
margin_top = -8.0
|
||||
margin_right = 24.0
|
||||
margin_bottom = 6.0
|
||||
text = "HEX"
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
|
@ -2,15 +2,55 @@
|
|||
extends Node2D
|
||||
|
||||
var HexGrid = preload("./HexGrid.gd").new()
|
||||
var HexShape = preload("./HexShape.tscn")
|
||||
|
||||
onready var highlight = get_node("Highlight")
|
||||
onready var area_coords = get_node("Highlight/AreaCoords")
|
||||
onready var hex_coords = get_node("Highlight/HexCoords")
|
||||
|
||||
var rect_min = Vector2(-200, 50)
|
||||
var rect_max = Vector2(400, 200)
|
||||
|
||||
var drag_start = null
|
||||
|
||||
func _ready():
|
||||
HexGrid.hex_scale = Vector2(50, 50)
|
||||
|
||||
func _draw():
|
||||
var hex_cell_bb_min = HexGrid.get_hex_at(rect_min).offset_coords
|
||||
var hex_cell_bb_max = HexGrid.get_hex_at(rect_max).offset_coords
|
||||
|
||||
var hex_cell_offset_min = Vector2(
|
||||
min(hex_cell_bb_min.x, hex_cell_bb_max.x),
|
||||
min(hex_cell_bb_min.y, hex_cell_bb_max.y)
|
||||
)
|
||||
|
||||
var hex_cell_offset_max = Vector2(
|
||||
max(hex_cell_bb_min.x, hex_cell_bb_max.x),
|
||||
max(hex_cell_bb_min.y, hex_cell_bb_max.y)
|
||||
)
|
||||
|
||||
var rect_highlights = get_node ("rect_highlights")
|
||||
if rect_highlights:
|
||||
remove_child(rect_highlights)
|
||||
rect_highlights.queue_free()
|
||||
|
||||
rect_highlights = Node2D.new()
|
||||
rect_highlights.name = "rect_highlights"
|
||||
add_child(rect_highlights)
|
||||
|
||||
for xi in range (hex_cell_offset_min.x, hex_cell_offset_max.x + 1):
|
||||
for yi in range (hex_cell_offset_min.y, hex_cell_offset_max.y + 1):
|
||||
var offset_coords = Vector2(xi, yi)
|
||||
var hex_shape = HexShape.instance()
|
||||
hex_shape.position = HexGrid.get_hex_center_from_offset(offset_coords)
|
||||
var hex_shape_coords = hex_shape.get_node("HexCoords")
|
||||
hex_shape_coords.text = str(offset_coords)
|
||||
rect_highlights.add_child (hex_shape)
|
||||
|
||||
var rect = Rect2(rect_min, rect_max - rect_min)
|
||||
draw_rect (rect, Color("55FFFFFF"))
|
||||
|
||||
|
||||
func _unhandled_input(event):
|
||||
if 'position' in event:
|
||||
|
@ -24,3 +64,15 @@ func _unhandled_input(event):
|
|||
# Snap the highlight to the nearest grid cell
|
||||
if highlight != null:
|
||||
highlight.position = HexGrid.get_hex_center(HexGrid.get_hex_at(relative_pos))
|
||||
|
||||
if event is InputEventMouseButton:
|
||||
if event.button_index == BUTTON_LEFT:
|
||||
if event.pressed:
|
||||
drag_start = relative_pos
|
||||
else:
|
||||
drag_start = null
|
||||
|
||||
if drag_start != null:
|
||||
rect_min = Vector2(min(drag_start.x, relative_pos.x), min(drag_start.y, relative_pos.y))
|
||||
rect_max = Vector2(max(drag_start.x, relative_pos.x), max(drag_start.y, relative_pos.y))
|
||||
update()
|
||||
|
|
Loading…
Reference in New Issue