Island placement okayish, added boat
parent
db97e9d66d
commit
2652bbbfa8
|
@ -8,6 +8,7 @@ const SHOVEL_DURATION=1
|
|||
|
||||
var DebugLabel = null
|
||||
var HexGrid = null
|
||||
var OceanGrid = null
|
||||
|
||||
var hex_size = 128
|
||||
|
||||
|
@ -15,7 +16,9 @@ var hex_size = 128
|
|||
func _ready():
|
||||
HexGrid = preload("../thirdparty/gdhexgrid/HexGrid.gd").new()
|
||||
HexGrid.hex_scale = Vector2(hex_size, hex_size)
|
||||
# add_child(HexGrid)
|
||||
|
||||
OceanGrid = preload("../thirdparty/gdhexgrid/HexGrid.gd").new()
|
||||
OceanGrid.hex_scale = Vector2(hex_size, hex_size)
|
||||
|
||||
HexTileDrawer.hex_scale = Vector2(hex_size, hex_size)
|
||||
|
||||
|
@ -51,5 +54,9 @@ func WorldToHex(pos: Vector2):
|
|||
return Globals.HexGrid.get_hex_at(pos).axial_coords
|
||||
|
||||
|
||||
func WorldToHexCenter(pos: Vector2):
|
||||
return Globals.HexGrid.get_hex_center(Globals.HexGrid.get_hex_at(pos).axial_coords)
|
||||
|
||||
|
||||
func WorldToScreen(pos: Vector2, camera: Camera2D):
|
||||
return pos * camera.zoom + camera.offset
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="67.73333mm"
|
||||
height="67.73333mm"
|
||||
viewBox="0 0 67.73333 67.73333"
|
||||
version="1.1"
|
||||
id="svg1420"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="boat.svg">
|
||||
<defs
|
||||
id="defs1414" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="118.12073"
|
||||
inkscape:cy="-21.57981"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1041"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="37"
|
||||
inkscape:window-maximized="0"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
showguides="false" />
|
||||
<metadata
|
||||
id="metadata1417">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-22.735567,-21.843752)">
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect2086"
|
||||
width="67.73333"
|
||||
height="67.73333"
|
||||
x="22.735567"
|
||||
y="21.843752" />
|
||||
<path
|
||||
style="opacity:1;fill:#aa4400;fill-opacity:1;stroke:#2b1100;stroke-width:0.52916664;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 23.071131,55.664689 14.890256,-0.395664 6.023877,11.301298 30.159844,-0.25963 3.997071,-4.343995 11.792181,-0.808583 -6.566376,19.510488 -13.026317,8.152523 -32.203568,0.09449 -10.826748,-3.990267 z"
|
||||
id="rect904"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#2b1100;fill-opacity:1;stroke:#2b1100;stroke-width:0.52916664;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 25.288535,67.942695 61.907369,0.801808 -1.80407,5.865346 -59.201264,-0.968852 z"
|
||||
id="rect907"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#2b1100;fill-opacity:1;stroke:#2b1100;stroke-width:0.52916664;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 26.509194,78.481637 56.85879,2.186966 -5.580848,3.288939 -50.612142,-0.202825 z"
|
||||
id="rect907-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#2b1100;fill-opacity:1;stroke:#2b1100;stroke-width:0.52916664;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 23.40113,58.180225 40.23631,59.699017 42.139007,63.65613 24.06693,63.453305 Z"
|
||||
id="rect907-4-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/boat.svg-5f58629bd5f6beab10c05f8be81c6a0b.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/boat.svg"
|
||||
dest_files=[ "res://.import/boat.svg-5f58629bd5f6beab10c05f8be81c6a0b.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_mode=0
|
||||
compress/bptc_ldr=0
|
||||
compress/normal_map=0
|
||||
flags/repeat=0
|
||||
flags/filter=true
|
||||
flags/mipmaps=false
|
||||
flags/anisotropic=false
|
||||
flags/srgb=2
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/HDR_as_SRGB=false
|
||||
process/invert_color=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=true
|
||||
svg/scale=1.0
|
|
@ -1,4 +1,4 @@
|
|||
[gd_scene load_steps=12 format=2]
|
||||
[gd_scene load_steps=13 format=2]
|
||||
|
||||
[ext_resource path="res://scenes/World.gd" type="Script" id=1]
|
||||
[ext_resource path="res://scenes/Grid.gd" type="Script" id=2]
|
||||
|
@ -8,6 +8,7 @@
|
|||
[ext_resource path="res://fonts/Roboto/Roboto-Regular.ttf" type="DynamicFontData" id=6]
|
||||
[ext_resource path="res://scenes/Editor.gd" type="Script" id=7]
|
||||
[ext_resource path="res://scenes/GridHighlight.gd" type="Script" id=8]
|
||||
[ext_resource path="res://assets/boat.svg" type="Texture" id=9]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
size = 27
|
||||
|
@ -24,9 +25,6 @@ resource_name = "TileTypeGroup"
|
|||
[node name="World" type="Node2D" parent="."]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Camera" type="Camera2D" parent="World"]
|
||||
current = true
|
||||
|
||||
[node name="Grid" type="Node2D" parent="World"]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
|
@ -143,6 +141,15 @@ texture = ExtResource( 3 )
|
|||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="World/PlayerChar"]
|
||||
|
||||
[node name="Camera" type="Camera2D" parent="World"]
|
||||
current = true
|
||||
|
||||
[node name="PlayerBoat" type="Node2D" parent="World"]
|
||||
|
||||
[node name="boat" type="Sprite" parent="World/PlayerBoat"]
|
||||
scale = Vector2( 0.455, 0.455 )
|
||||
texture = ExtResource( 9 )
|
||||
|
||||
[node name="Editor" type="Node2D" parent="."]
|
||||
script = ExtResource( 7 )
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
extends Node2D
|
||||
|
||||
var tiles = {}
|
||||
var offset = Vector2.ZERO
|
||||
var offset_world = Vector2.ZERO
|
||||
var center_coord = Vector2.ZERO
|
||||
var center_world_coord = Vector2.ZERO
|
||||
var tile_local_coords = []
|
||||
var rect_world = Rect2()
|
||||
var rect_local = Rect2()
|
||||
var radius_world = 0.0
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
|
@ -23,8 +23,8 @@ func set_tile(coord: Vector2, value: String):
|
|||
update()
|
||||
|
||||
|
||||
func set_offset(value: Vector2):
|
||||
offset = value
|
||||
func set_offset_world(value: Vector2):
|
||||
offset_world = value
|
||||
|
||||
|
||||
func clear_island():
|
||||
|
@ -50,10 +50,12 @@ func calc_bbox():
|
|||
if local_coords.y > coord_max.y:
|
||||
coord_max.y = local_coords.y
|
||||
|
||||
var hex_half_size = Vector2.ONE * Globals.hex_size * 0.5
|
||||
rect_world = Rect2(coord_min - hex_half_size, coord_max - coord_min + hex_half_size * 2)
|
||||
var hex_half_size = Vector2 (Globals.hex_size * 0.5, Globals.hex_size * sqrt(3) * 0.25)
|
||||
rect_local = Rect2(coord_min - hex_half_size, coord_max - coord_min + hex_half_size * 2)
|
||||
center_world_coord = Globals.HexToWorld(Globals.WorldToHex(coord_min + 0.5 * (coord_max - coord_min)))
|
||||
radius_world = max(rect_world.size.x, rect_world.size.y) * 0.5
|
||||
center_coord = Globals.WorldToHex(center_world_coord)
|
||||
print ("center coord: " + str(center_coord))
|
||||
radius_world = max(rect_local.size.x, rect_local.size.y) * 0.5
|
||||
|
||||
|
||||
func save_island(path: String):
|
||||
|
@ -100,28 +102,35 @@ func load_island(path: String):
|
|||
|
||||
|
||||
func check_overlap(other):
|
||||
var tile_offset = Globals.HexToWorld(offset)
|
||||
var other_offset = Globals.HexToWorld(other.offset)
|
||||
var rect_world = calc_rect_world()
|
||||
var rect_world_other = other.calc_rect_world()
|
||||
|
||||
var rel_offset = other_offset - tile_offset
|
||||
var dist = rel_offset.length() - radius_world - other.radius_world
|
||||
return rect_world.intersects(rect_world_other)
|
||||
|
||||
return dist < 0
|
||||
|
||||
func calc_rect_world():
|
||||
var rect_world = Rect2(rect_local)
|
||||
rect_world.position = transform.origin + rect_world.position + offset_world
|
||||
return rect_world
|
||||
|
||||
|
||||
func draw_bsphere():
|
||||
var transform = get_transform()
|
||||
draw_set_transform(transform.origin + offset_world, transform.get_rotation(), transform.get_scale())
|
||||
draw_circle(center_world_coord, radius_world, Color("#80000033"))
|
||||
draw_circle(center_world_coord, 10, Color.red)
|
||||
|
||||
func _draw():
|
||||
var tile_offset = Globals.HexToWorld(offset)
|
||||
print (name, tile_offset)
|
||||
print (name, offset_world)
|
||||
for coord in tiles.keys():
|
||||
draw_set_transform (coord + tile_offset, 0, Vector2.ONE)
|
||||
draw_set_transform (coord + offset_world, 0, Vector2.ONE)
|
||||
draw_polygon(HexTileDrawer.HexPoints, HexTileDrawer.get_tile_color(tiles[coord]))
|
||||
|
||||
var transform = get_transform()
|
||||
draw_set_transform(transform.origin + tile_offset, transform.get_rotation(), transform.get_scale())
|
||||
draw_set_transform(transform.origin + offset_world, transform.get_rotation(), transform.get_scale())
|
||||
|
||||
draw_rect(rect_world, Color.red, false)
|
||||
draw_circle(center_world_coord, radius_world, Color.brown)
|
||||
draw_circle(center_world_coord, 10, Color.red)
|
||||
# draw_rect(rect_local, Color.red, false)
|
||||
# draw_bsphere()
|
||||
|
||||
var default_font = Control.new().get_font("font")
|
||||
draw_string(default_font, Vector2(0, 0), name)
|
||||
draw_string(default_font, Vector2(0, 0), name + str(" ") + str(offset_world))
|
||||
|
|
|
@ -12,6 +12,7 @@ onready var ZoomValueLabel = get_node("UI/TopContainer/ZoomValue")
|
|||
onready var HexCoordValueLabel = get_node("UI/TopContainer/HexCoordValue")
|
||||
onready var WorldCoordValueLabel = get_node("UI/TopContainer/WorldCoordValue")
|
||||
onready var PlayerChar = get_node("PlayerChar")
|
||||
onready var PlayerBoat = get_node("PlayerBoat")
|
||||
onready var FPSValueLabel = get_node("UI/TopContainer/FPSValue")
|
||||
|
||||
var Island = preload("Island.gd")
|
||||
|
@ -23,7 +24,6 @@ var is_dragging = false
|
|||
var drag_start = null
|
||||
var target = Vector2()
|
||||
var tile_data = {}
|
||||
var islands = []
|
||||
var current_island = null
|
||||
|
||||
|
||||
|
@ -37,41 +37,78 @@ func _ready():
|
|||
PlayerChar.position = Globals.HexGrid.get_hex_center(Vector2(0,0))
|
||||
|
||||
|
||||
func generate():
|
||||
var rng = RandomNumberGenerator.new()
|
||||
rng.randomize()
|
||||
|
||||
islands.clear()
|
||||
func clear_islands():
|
||||
for island in Islands.get_children():
|
||||
Islands.remove_child(island)
|
||||
island.queue_free()
|
||||
|
||||
var radius = 5
|
||||
var num_islands = 3
|
||||
|
||||
func _process(_delta):
|
||||
WorldCamera.offset = PlayerChar.position
|
||||
PlayerBoat.transform.origin = PlayerChar.transform.origin
|
||||
pass
|
||||
|
||||
|
||||
func check_island_overlap(new_island):
|
||||
var islands = Islands.get_children()
|
||||
|
||||
for island in islands:
|
||||
if island.check_overlap(new_island):
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
|
||||
func add_island_at(file_name, offset_world: Vector2):
|
||||
var island = Island.new()
|
||||
island.load_island(file_name)
|
||||
island.offset_world = offset_world
|
||||
Islands.add_child(island)
|
||||
|
||||
|
||||
func populate_ocean_grid():
|
||||
Globals.OceanGrid.remove_obstacles(Globals.OceanGrid.get_obstacles())
|
||||
|
||||
|
||||
func generate():
|
||||
var rng = RandomNumberGenerator.new()
|
||||
rng.randomize()
|
||||
|
||||
clear_islands()
|
||||
|
||||
var radius = 1300
|
||||
var num_islands = 10
|
||||
|
||||
for i in range (num_islands):
|
||||
|
||||
var overlapping = true
|
||||
var find_free_retries = 10
|
||||
|
||||
var island = Island.new()
|
||||
var file_name = "user://pirate_game_island_" + str(i) + ".island"
|
||||
var island_index = i % 4
|
||||
var file_name = "user://pirate_game_island_" + str(island_index) + ".island"
|
||||
island.load_island(file_name)
|
||||
|
||||
while overlapping and find_free_retries > 0:
|
||||
overlapping = false
|
||||
island.offset = Vector2(rng.randi_range(-radius, radius), rng.randi_range(-radius, radius))
|
||||
var rand_coord = Vector2(rng.randi_range(-radius, radius), rng.randi_range(-radius, radius))
|
||||
island.offset_world = Globals.WorldToHexCenter(rand_coord)
|
||||
|
||||
for world_island in Islands.get_children():
|
||||
overlapping = world_island.check_overlap(island)
|
||||
var overlapping = check_island_overlap(island)
|
||||
var overlap_retry_num = 0
|
||||
var overlap_retry_max = 10
|
||||
while overlapping and overlap_retry_num < overlap_retry_max:
|
||||
if overlap_retry_num % 4 == 0:
|
||||
radius = radius + 500
|
||||
overlap_retry_num = overlap_retry_num + 1
|
||||
|
||||
find_free_retries = find_free_retries - 1
|
||||
rand_coord = Vector2(rng.randi_range(-radius, radius), rng.randi_range(-radius, radius))
|
||||
island.offset_world = Globals.WorldToHexCenter(rand_coord)
|
||||
overlapping = check_island_overlap(island)
|
||||
|
||||
if overlapping:
|
||||
print ("Could not find free spot for island!")
|
||||
print ("Could not place island!")
|
||||
else:
|
||||
print ("Retries left: " + str(find_free_retries) )
|
||||
print ("Placed after " + str(overlap_retry_num) + " retries.")
|
||||
Islands.add_child(island)
|
||||
|
||||
populate_ocean_grid()
|
||||
|
||||
|
||||
|
||||
func handle_game_event(event):
|
||||
if event is InputEventMouseButton:
|
||||
|
@ -106,6 +143,9 @@ func _unhandled_input(event):
|
|||
GridHighlight.pos = hex_hover
|
||||
HexCoordValueLabel.text = str(hex_hover)
|
||||
|
||||
# Islands.get_children()[1].offset_world = Globals.HexToWorld(hex_hover)
|
||||
# Islands.get_children()[1].update()
|
||||
|
||||
WorldCoordValueLabel.text = str(Globals.ScreenToWorld(event.position, WorldCamera))
|
||||
|
||||
if is_dragging:
|
||||
|
|
Loading…
Reference in New Issue