Game : set water + some debug

pull/3/head
Valentin Stark 3 years ago
parent 02a857ed55
commit ff55c96dfc
  1. 24
      ui/map/map.gd
  2. 4
      utils/terrain/Terrain.gd
  3. 49
      world/game.gd
  4. 3
      world/game.tscn

@ -47,13 +47,27 @@ func draw_triangles():
colors.add_point(0.999, Color("#9e0142")) # red colors.add_point(0.999, Color("#9e0142")) # red
colors.add_point(0.5, Color("#dc865d")) # orange colors.add_point(0.5, Color("#dc865d")) # orange
colors.add_point(0.25, Color("#fbf8b0")) # yellow colors.add_point(0.25, Color("#fbf8b0")) # yellow
colors.add_point(0, Color("#89cfa5")) # green colors.add_point(0, Color.green) # green
colors.add_point(-0.999, Color("#5e4fa2")) # blue colors.add_point(-0.999, Color("#5e4fa2")) # blue
var color = Color(randf(), randf(), randf(), 1) var color = colors.interpolate(min(triangle.get_data("elevation"), 0.999))
color = colors.interpolate(min(triangle.get_data("elevation"), 0.999)) if triangle.get_data("ocean"):
color = Color.red
if triangle.polygon().size() > 2: if triangle.polygon().size() > 2:
draw_polygon(triangle.polygon(), PoolColorArray([color])) draw_polygon(triangle.polygon(), PoolColorArray([color]))
func draw_triangles_edges(color=Color("#000000")): func draw_triangles_edges(color=Color("#000000")):
for line in terrain.get_edges_as_line(): for line in terrain.get_edges_as_line():
draw_line(line[0], line[1], color) draw_line(line[0], line[1], color)
@ -121,4 +135,4 @@ func _draw():
func _on_Game_world_loaded(game_terrain): func _on_Game_world_loaded(game_terrain):
terrain = game_terrain terrain = game_terrain
create_map() update()

@ -166,11 +166,11 @@ class Point:
func points_around(): func points_around():
var list_points = [] var list_points = []
var incoming = _terrain._points_to_halfedges.get(_idx) var incoming = _terrain._points_to_halfedges.get(_idx)
var incoming_edge = Point.new(incoming, _terrain) var incoming_edge = Edge.new(incoming, _terrain)
var outgoing_edge var outgoing_edge
while true: while true:
list_points.append(Point.new(_terrain._triangles[incoming_edge._idx], _terrain)); list_points.append(Point.new(_terrain._triangles[incoming_edge._idx], _terrain));
outgoing_edge = incoming_edge.next_half() outgoing_edge = incoming_edge.opposite()
incoming_edge = Edge.new(_terrain._halfedges[outgoing_edge._idx], _terrain); incoming_edge = Edge.new(_terrain._halfedges[outgoing_edge._idx], _terrain);
if not (incoming_edge._idx != -1 and incoming_edge._idx != incoming): if not (incoming_edge._idx != -1 and incoming_edge._idx != incoming):
break break

@ -23,13 +23,14 @@ func _ready():
noise.seed = rng.randi() noise.seed = rng.randi()
noise.octaves = octaves noise.octaves = octaves
terrain = Terrain.new(width,height,spacing,true) terrain = Terrain.new(width,height,spacing,true)
init_points_data() init_data()
print(terrain) print(terrain)
emit_signal("world_loaded", terrain) emit_signal("world_loaded", terrain)
func init_points_data(): func init_data():
for point in terrain.get_points(): for point in terrain.get_points():
point.set_elevation(find_point_elevation(point.point2d())) point.set_elevation(point_find_elevation(point.point2d()))
point.set_data("water", point_is_water(point))
# points_data.append({ # points_data.append({
# "elevation": 0, # "elevation": 0,
# "used": false, # "used": false,
@ -39,10 +40,19 @@ func init_points_data():
# "mountain": false, # "mountain": false,
# "river": false # "river": false
# }) # })
fill_oceans()
for triangle in terrain.get_triangles(): for triangle in terrain.get_triangles():
triangle.set_data("elevation", find_triangle_elevation(triangle)) triangle.set_data("elevation", triangle_find_elevation(triangle))
triangle.set_data("water", triangle_is_water(triangle))
triangle.set_data("ocean", false)
for point in triangle.points():
if point.get_data("ocean"):
triangle.set_data("ocean", true)
# Point
func find_point_elevation(point): func point_find_elevation(point):
var border = border_width + rng.randf_range(-20.0, 20.0) var border = border_width + rng.randf_range(-20.0, 20.0)
var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength)
@ -64,10 +74,35 @@ func find_point_elevation(point):
# elevation = elevation * terraces # elevation = elevation * terraces
return elevation return elevation
func point_is_water(point):
if (point.get_elevation() <= 0):
return true
return false
# Triangle
func find_triangle_elevation(triangle): func triangle_find_elevation(triangle):
var elevation = 0 var elevation = 0
for point in triangle.points(): for point in triangle.points():
elevation += point.get_elevation() elevation += point.get_elevation()
elevation /= 3 elevation /= 3.0
return elevation return elevation
func triangle_is_water(triangle):
if triangle.get_data("elevation") <= 0:
return true
return false
func fill_oceans():
var stack = []
for point in terrain.get_points():
if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"):
stack.append(point.get_index())
while stack.size():
var current_point_id = stack.pop_back()
terrain.get_point(current_point_id).set_data("ocean", true)
for neighbour in terrain.get_point(current_point_id).points_around():
if neighbour.get_data("water") and not neighbour.get_data("ocean"):
stack.append(neighbour.get_index())
break

@ -8,6 +8,9 @@ script = ExtResource( 2 )
[node name="UI" parent="." instance=ExtResource( 1 )] [node name="UI" parent="." instance=ExtResource( 1 )]
[node name="Map" parent="UI" index="0"]
scale = Vector2( 0.5, 0.5 )
[connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"]
[editable path="UI"] [editable path="UI"]

Loading…
Cancel
Save