Random progress
parent
69933d58ae
commit
c3bca6b208
|
@ -61,6 +61,7 @@
|
|||
|
||||
"""
|
||||
extends Resource
|
||||
class_name HexCell
|
||||
#warning-ignore-all:unused_class_variable
|
||||
|
||||
# We use unit-size flat-topped hexes
|
||||
|
|
|
@ -2,9 +2,9 @@ extends Node2D
|
|||
|
||||
var SpringDamper = preload("res://utils/SpringDamper.gd")
|
||||
|
||||
export var target = Vector2 (0, 0)
|
||||
export var pos = Vector2 (0, 0)
|
||||
export var vel = Vector2 (0, 0)
|
||||
export var target = Vector3 (0, 0, 0)
|
||||
export var pos = Vector3 (0, 0, 0)
|
||||
export var vel = Vector3 (0, 0, 0)
|
||||
export var max_speed = 100000
|
||||
|
||||
onready var spring_damper = SpringDamper.new(4, .99, 0.5)
|
||||
|
@ -35,4 +35,5 @@ func _process(delta):
|
|||
|
||||
|
||||
func _draw():
|
||||
draw_circle (target, 10, Color(0.9, 0.2, 0.2))
|
||||
#draw_circle (target, 10, Color(0.9, 0.2, 0.2))
|
||||
pass
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://components/MovableComponent.gd" type="Script" id=1]
|
||||
|
||||
[node name="Movable" type="Node2D"]
|
||||
script = ExtResource( 1 )
|
||||
max_speed = 300
|
|
@ -1,4 +1,4 @@
|
|||
extends KinematicBody2D
|
||||
extends KinematicBody
|
||||
|
||||
onready var color_component = $Color
|
||||
onready var tinted_sprite_component = $TintedSprite
|
||||
|
@ -54,10 +54,15 @@ func _on_entity_clicked():
|
|||
func _on_position_updated(new_position):
|
||||
if not collision_component:
|
||||
transform.origin = new_position
|
||||
update()
|
||||
|
||||
|
||||
func _unhandled_input(event):
|
||||
func set_movable_target(target):
|
||||
if not movable_component == null:
|
||||
movable_component.target = target
|
||||
|
||||
|
||||
func _unhandled_input_disabled(event):
|
||||
print ("Player unhandled input...")
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
assert(movable_component)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
[ext_resource path="res://components/TintedSpriteComponent.gd" type="Script" id=2]
|
||||
[ext_resource path="res://components/ColorComponent.gd" type="Script" id=3]
|
||||
[ext_resource path="res://components/ClickableComponent.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://components/MovableComponent.gd" type="Script" id=5]
|
||||
[ext_resource path="res://components/MovableComponent.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://assets/pirate.svg" type="Texture" id=6]
|
||||
[ext_resource path="res://assets/white.png" type="Texture" id=8]
|
||||
|
||||
|
@ -18,11 +18,7 @@ height = 122.0
|
|||
[node name="PlayerEntity" type="KinematicBody2D"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Components" type="Node2D" parent="."]
|
||||
|
||||
[node name="Movable" type="Node2D" parent="."]
|
||||
script = ExtResource( 5 )
|
||||
max_speed = 300
|
||||
[node name="Movable" parent="." instance=ExtResource( 5 )]
|
||||
|
||||
[node name="TintedSprite" type="Sprite" parent="."]
|
||||
position = Vector2( -9, 3 )
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[gd_resource type="SpatialMaterial" format=2]
|
||||
|
||||
[resource]
|
||||
albedo_color = Color( 0.0627451, 0.235294, 0.0117647, 1 )
|
|
@ -0,0 +1,4 @@
|
|||
[gd_resource type="SpatialMaterial" format=2]
|
||||
|
||||
[resource]
|
||||
albedo_color = Color( 0.160784, 0.384314, 0.0901961, 1 )
|
|
@ -0,0 +1,4 @@
|
|||
[gd_resource type="SpatialMaterial" format=2]
|
||||
|
||||
[resource]
|
||||
albedo_color = Color( 0.937255, 0.756863, 0.282353, 1 )
|
|
@ -24,6 +24,11 @@ _global_script_classes=[ {
|
|||
"language": "GDScript",
|
||||
"path": "res://components/ColorComponent.gd"
|
||||
}, {
|
||||
"base": "Resource",
|
||||
"class": "HexCell",
|
||||
"language": "GDScript",
|
||||
"path": "res://addons/gdhexgrid/HexCell.gd"
|
||||
}, {
|
||||
"base": "Spatial",
|
||||
"class": "HexTile3D",
|
||||
"language": "GDScript",
|
||||
|
@ -34,6 +39,16 @@ _global_script_classes=[ {
|
|||
"language": "GDScript",
|
||||
"path": "res://scenes/Island.gd"
|
||||
}, {
|
||||
"base": "Node",
|
||||
"class": "IslandGenerator",
|
||||
"language": "GDScript",
|
||||
"path": "res://utils/IslandGenerator.gd"
|
||||
}, {
|
||||
"base": "Resource",
|
||||
"class": "IslandTile",
|
||||
"language": "GDScript",
|
||||
"path": "res://utils/IslandTile.gd"
|
||||
}, {
|
||||
"base": "Object",
|
||||
"class": "SpringDamper",
|
||||
"language": "GDScript",
|
||||
|
@ -48,8 +63,11 @@ _global_script_class_icons={
|
|||
"ClickableComponent": "",
|
||||
"CollisionLine": "",
|
||||
"ColorComponent": "",
|
||||
"HexCell": "",
|
||||
"HexTile3D": "",
|
||||
"Island": "",
|
||||
"IslandGenerator": "",
|
||||
"IslandTile": "",
|
||||
"SpringDamper": "",
|
||||
"TintedSpriteComponent": ""
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ var player_velocity = Vector3.ZERO
|
|||
var player_speed = 5
|
||||
var target_coordinate = Vector3.ZERO
|
||||
|
||||
|
||||
func _ready():
|
||||
for node in world.get_children():
|
||||
if node is Island:
|
||||
|
@ -27,20 +28,9 @@ func _process(delta):
|
|||
player_pos_label.text = "Pos: " + str(player.transform.origin)
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
var position_error = target_coordinate - player.transform.origin
|
||||
var error_length = position_error.length()
|
||||
|
||||
if error_length > 0.05:
|
||||
player_velocity = position_error / error_length * player_speed
|
||||
else:
|
||||
player_velocity = Vector3.ZERO
|
||||
|
||||
player.transform.origin += player_velocity * delta
|
||||
|
||||
|
||||
func on_island_tile_selected(island, tile):
|
||||
target_coordinate = tile.global_transform.origin
|
||||
player.set_movable_target(tile.global_transform.origin)
|
||||
var position_error = target_coordinate - player.transform.origin
|
||||
print ("clicked on tile " + str(target_coordinate) + " error: " + str(position_error))
|
||||
|
||||
|
|
|
@ -1,17 +1,20 @@
|
|||
[gd_scene load_steps=11 format=2]
|
||||
[gd_scene load_steps=12 format=2]
|
||||
|
||||
[ext_resource path="res://scenes/HexTile3D.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://entities/PlayerEntity.gd" type="Script" id=1]
|
||||
[ext_resource path="res://scenes/HexGrid3DTest.gd" type="Script" id=2]
|
||||
[ext_resource path="res://scenes/DebugCamera.gd" type="Script" id=3]
|
||||
[ext_resource path="res://scenes/Island.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://assets/water_diffuse.png" type="Texture" id=5]
|
||||
[ext_resource path="res://components/MovableComponent.tscn" type="PackedScene" id=6]
|
||||
|
||||
[sub_resource type="CapsuleMesh" id=4]
|
||||
radius = 0.2
|
||||
mid_height = 0.5
|
||||
radial_segments = 16
|
||||
|
||||
[sub_resource type="NoiseTexture" id=5]
|
||||
[sub_resource type="CapsuleShape" id=5]
|
||||
radius = 0.25
|
||||
height = 0.5
|
||||
|
||||
[sub_resource type="PlaneMesh" id=1]
|
||||
subdivide_width = 24
|
||||
|
@ -94,10 +97,10 @@ void fragment() {
|
|||
|
||||
[sub_resource type="ShaderMaterial" id=3]
|
||||
shader = SubResource( 2 )
|
||||
shader_param/amplitude = Vector2( 0.01, 0.011 )
|
||||
shader_param/amplitude = Vector2( 0.005, 0.005 )
|
||||
shader_param/frequency = Vector2( 50, 48 )
|
||||
shader_param/time_factor = Vector2( 7, 8 )
|
||||
shader_param/beer_factor = 0.5
|
||||
shader_param/beer_factor = 4.0
|
||||
shader_param/refraction = 0.01
|
||||
shader_param/uv_offset_scale = Vector2( 0.2, 0.2 )
|
||||
shader_param/uv_offset_time_scale = 0.1
|
||||
|
@ -108,9 +111,6 @@ shader_param/texturemap = ExtResource( 5 )
|
|||
[node name="HexGrid3DTest" type="Spatial"]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="HexTile3D" parent="." instance=ExtResource( 1 )]
|
||||
visible = false
|
||||
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
transform = Transform( 0.83729, 0.174005, 0.518332, -0.54676, 0.266466, 0.793757, 0, -0.948008, 0.318248, 0, 8.03448, 0 )
|
||||
shadow_enabled = true
|
||||
|
@ -156,7 +156,8 @@ __meta__ = {
|
|||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Player" type="Spatial" parent="."]
|
||||
[node name="Player" type="KinematicBody" parent="."]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Camera" type="Camera" parent="Player"]
|
||||
transform = Transform( 1, 0, 0, 0, 0.511698, 0.859165, 0, -0.859165, 0.511698, -4.76837e-07, 6.70866, 3.34822 )
|
||||
|
@ -169,30 +170,40 @@ transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.5,
|
|||
mesh = SubResource( 4 )
|
||||
material/0 = null
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="."]
|
||||
margin_right = 40.0
|
||||
margin_bottom = 40.0
|
||||
texture = SubResource( 5 )
|
||||
expand = true
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
[node name="CollisionShape" type="CollisionShape" parent="Player"]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.5, 0 )
|
||||
shape = SubResource( 5 )
|
||||
|
||||
[node name="Movable" parent="Player" instance=ExtResource( 6 )]
|
||||
max_speed = 3
|
||||
|
||||
[node name="World" type="Spatial" parent="."]
|
||||
|
||||
[node name="Scene" type="Spatial" parent="World"]
|
||||
|
||||
[node name="Navigation" type="Spatial" parent="World"]
|
||||
|
||||
[node name="Island" parent="World" instance=ExtResource( 4 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
|
||||
[node name="Island2" parent="World" instance=ExtResource( 4 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12.2668, 0, 0 )
|
||||
|
||||
[node name="Water" type="Spatial" parent="."]
|
||||
|
||||
[node name="Water" type="MeshInstance" parent="Water"]
|
||||
transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0 )
|
||||
transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, -0.1, 0 )
|
||||
mesh = SubResource( 1 )
|
||||
skeleton = NodePath("../..")
|
||||
material/0 = SubResource( 3 )
|
||||
|
||||
[node name="Water2" type="MeshInstance" parent="Water"]
|
||||
transform = Transform( -10, 0, 0, 0, 10, 0, 0, 0, 10, -20, 0, -0.01 )
|
||||
transform = Transform( -10, 0, 0, 0, 10, 0, 0, 0, 10, -20, -0.1, -0.01 )
|
||||
mesh = SubResource( 1 )
|
||||
skeleton = NodePath("../..")
|
||||
material/0 = SubResource( 3 )
|
||||
|
||||
[node name="Water3" type="MeshInstance" parent="Water"]
|
||||
transform = Transform( -10, 0, 0, 0, 10, 0, 0, 0, 10, 20, -0.1, -0.01 )
|
||||
mesh = SubResource( 1 )
|
||||
skeleton = NodePath("../..")
|
||||
material/0 = SubResource( 3 )
|
||||
|
|
|
@ -4,16 +4,24 @@ class_name HexTile3D
|
|||
onready var is_mouse_over = false
|
||||
onready var mesh = $Mesh
|
||||
var old_material_override = Material.new()
|
||||
export var hex = null setget set_hex, get_hex
|
||||
|
||||
signal tile_selected
|
||||
signal tile_mouse_entered
|
||||
|
||||
func set_hex(_hex):
|
||||
hex = _hex
|
||||
#var cube_coords = Vector3(0, 0, 0) setget set_cube_coords, get_cube_coords
|
||||
|
||||
func set_tiletype(type):
|
||||
var IslandTile = load("res://utils/IslandTile.gd").new()
|
||||
|
||||
var mesh = $Mesh
|
||||
|
||||
if type == IslandTile.TileType.Sand:
|
||||
mesh.set_surface_material(0, preload("res://materials/SandTile.tres"))
|
||||
elif type == IslandTile.TileType.Grass:
|
||||
mesh.set_surface_material(0, preload("res://materials/GrassTile.tres"))
|
||||
else:
|
||||
mesh.set_surface_material(0, preload("res://materials/DeepGrassTile.tres"))
|
||||
|
||||
func get_hex():
|
||||
return hex
|
||||
|
||||
func _on_Area_mouse_entered():
|
||||
is_mouse_over = true
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://scenes/HexTile3D.gd" type="Script" id=1]
|
||||
[ext_resource path="res://materials/DeepGrassTile.tres" type="Material" id=2]
|
||||
|
||||
[sub_resource type="CylinderMesh" id=6]
|
||||
top_radius = 0.5
|
||||
|
@ -9,9 +10,6 @@ height = 1.0
|
|||
radial_segments = 6
|
||||
rings = 1
|
||||
|
||||
[sub_resource type="SpatialMaterial" id=7]
|
||||
albedo_color = Color( 0.160784, 0.384314, 0.0901961, 1 )
|
||||
|
||||
[sub_resource type="CylinderShape" id=5]
|
||||
radius = 0.5
|
||||
height = 1.0
|
||||
|
@ -23,7 +21,7 @@ script = ExtResource( 1 )
|
|||
[node name="Mesh" type="MeshInstance" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0 )
|
||||
mesh = SubResource( 6 )
|
||||
material/0 = SubResource( 7 )
|
||||
material/0 = ExtResource( 2 )
|
||||
|
||||
[node name="Area" type="Area" parent="Mesh"]
|
||||
|
||||
|
|
137
scenes/Island.gd
137
scenes/Island.gd
|
@ -2,13 +2,14 @@ tool
|
|||
extends Spatial
|
||||
class_name Island
|
||||
|
||||
onready var IslandTile = preload("res://utils/IslandTile.gd")
|
||||
|
||||
export var generate: bool = false setget do_generate
|
||||
export var level_size: int = 10
|
||||
|
||||
signal island_tile_selected
|
||||
signal island_tile_hover
|
||||
|
||||
var tiles_by_offset = {}
|
||||
|
||||
func reset():
|
||||
var tiles = $Tiles
|
||||
|
@ -16,8 +17,6 @@ func reset():
|
|||
for node in tiles.get_children():
|
||||
tiles.remove_child(node)
|
||||
node.queue_free()
|
||||
|
||||
tiles_by_offset = {}
|
||||
|
||||
|
||||
func create_tile_for_hex(hex):
|
||||
|
@ -26,140 +25,28 @@ func create_tile_for_hex(hex):
|
|||
|
||||
var tile = HexTile3D.instance()
|
||||
var pos = hexgrid.get_hex_center_from_offset(hex.offset_coords)
|
||||
var hex_pos = hexgrid.get_hex_center_from_offset(hex.offset_coords)
|
||||
var height = 0.0
|
||||
var height = 0.0 if hex.type == IslandTile.TileType.Sand else 0.1 + rand_range(0.0, 0.05)
|
||||
|
||||
tile.set_tiletype(hex.type)
|
||||
tile.transform.origin = Vector3(pos.x, height, pos.y)
|
||||
tile.connect("tile_selected", self, "on_tile_selected")
|
||||
tile.connect("tile_mouse_entered", self, "on_tile_hover")
|
||||
|
||||
return tile
|
||||
|
||||
func generate_random_walk (length):
|
||||
var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new()
|
||||
var HexTile3D = preload("res://scenes/HexTile3D.tscn")
|
||||
var tiles = $Tiles
|
||||
|
||||
var cur_hex_coord = Vector2(0,0)
|
||||
var i = length
|
||||
while (i >= 0):
|
||||
var current_hex = hexgrid.get_hex_from_offset(cur_hex_coord)
|
||||
var tile = create_tile_for_hex(current_hex)
|
||||
tiles.add_child(tile)
|
||||
tiles_by_offset[cur_hex_coord] = tile
|
||||
|
||||
# var pos = hexgrid.get_hex_center_from_offset(cur_hex_coord)
|
||||
# var tile = HexTile3D.instance()
|
||||
# var height = 0.0
|
||||
# tile.transform.origin = Vector3(pos.x, height, pos.y)
|
||||
# tile.connect("tile_selected", self, "on_tile_selected")
|
||||
# tile.connect("tile_mouse_entered", self, "on_tile_hover")
|
||||
# tiles.add_child(tile)
|
||||
#
|
||||
# var current_hex_from_axial = hexgrid.get_hex_at(current_hex.axial_coords)
|
||||
#
|
||||
var neighbours = current_hex.get_all_adjacent()
|
||||
cur_hex_coord = neighbours[randi() %6].offset_coords
|
||||
# for neighbour in neighbours:
|
||||
# tile = create_tile_for_hex(neighbour)
|
||||
# tiles.add_child(tile)
|
||||
# var rand_idx = randi() % 6
|
||||
# cur_hex_coord = neighbours[rand_idx].offset_coords
|
||||
i = i - 1
|
||||
|
||||
|
||||
func extrude_island():
|
||||
var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new()
|
||||
var tiles = $Tiles
|
||||
|
||||
var old_tiles = tiles
|
||||
tiles = {}
|
||||
|
||||
var old_tiles_by_offset = tiles_by_offset
|
||||
|
||||
# for offset_coord in tiles_by_offset.keys():
|
||||
# var hex = hexgrid.get_hex_from_offset(offset_coord)
|
||||
# var neighbours = current_hex.get_all_adjacent()
|
||||
# cur_hex_coord = neighbours[randi() %6].offset_coords
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# for tile in old_tiles:
|
||||
# var hex_coord = Globals.WorldToHex(tile)
|
||||
# tiles[tile] = "Sand"
|
||||
# var neighbours = Globals.HexGrid.get_hex_at(hex_coord).get_all_adjacent()
|
||||
# for cell in neighbours:
|
||||
# var world_coord = Globals.HexToWorld(hex_coord + cell.axial_coords)
|
||||
# tiles[world_coord] = "Sand"
|
||||
#
|
||||
#
|
||||
#func mark_grass():
|
||||
# var old_tiles = tiles
|
||||
# tiles = {}
|
||||
#
|
||||
# for tile in old_tiles:
|
||||
# var hex_coord = Globals.WorldToHex(tile)
|
||||
#
|
||||
# var neighbours = Globals.HexGrid.get_hex_at(hex_coord).get_all_adjacent()
|
||||
# var is_center_cell = true
|
||||
# for cell in neighbours:
|
||||
# var world_coord = Globals.HexToWorld(hex_coord + cell.axial_coords)
|
||||
# if not world_coord in old_tiles.keys():
|
||||
# is_center_cell = false
|
||||
#
|
||||
# if is_center_cell:
|
||||
# tiles[tile] = "Grass"
|
||||
# else:
|
||||
# tiles[tile] = "Sand"
|
||||
#
|
||||
#
|
||||
#
|
||||
#func mark_deep_grass():
|
||||
# var old_tiles = tiles
|
||||
# tiles = {}
|
||||
#
|
||||
# for tile in old_tiles:
|
||||
# if old_tiles[tile] != "Grass":
|
||||
# tiles[tile] = old_tiles[tile]
|
||||
# continue
|
||||
#
|
||||
# var hex_coord = Globals.WorldToHex(tile)
|
||||
#
|
||||
# var neighbours = Globals.HexGrid.get_hex_at(hex_coord).get_all_adjacent()
|
||||
# var is_center_cell = true
|
||||
# for cell in neighbours:
|
||||
# var world_coord = Globals.HexToWorld(hex_coord + cell.axial_coords)
|
||||
# if world_coord in old_tiles.keys() and old_tiles[world_coord] != "Grass":
|
||||
# is_center_cell = false
|
||||
# break
|
||||
#
|
||||
# if is_center_cell:
|
||||
# tiles[tile] = "DeepGrass"
|
||||
# else:
|
||||
# tiles[tile] = "Grass"
|
||||
|
||||
func generate():
|
||||
var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new()
|
||||
var HexTile3D = preload("res://scenes/HexTile3D.tscn")
|
||||
var IslandGenerator = preload("res://utils/IslandGenerator.gd").new()
|
||||
|
||||
var tiles = $Tiles
|
||||
|
||||
reset()
|
||||
generate_random_walk(level_size)
|
||||
# extrude_island()
|
||||
# mark_grass()
|
||||
# mark_deep_grass()
|
||||
#
|
||||
var generated_tiles = IslandGenerator.random_walk(level_size)
|
||||
generated_tiles = IslandGenerator.extrude_tiles(generated_tiles)
|
||||
generated_tiles = IslandGenerator.mark_sand_tiles(generated_tiles)
|
||||
|
||||
# for i in range(-level_size / 2, level_size / 2):
|
||||
# for j in range (-level_size / 2, level_size / 2):
|
||||
# var pos = hexgrid.get_hex_center_from_offset(Vector2(i, j))
|
||||
# var tile = HexTile3D.instance()
|
||||
# var height = (sin(pos.y * 0.3) * sin(pos.y * 0.8) * 0.8 + cos ((pos.x) * 0.9) * 1.24) * 0.5 + 0.4 + rand_range(-0.3, 0.3)
|
||||
# tile.transform.origin = Vector3(pos.x, height, pos.y)
|
||||
# tile.connect("tile_selected", self, "on_tile_selected")
|
||||
# tile.connect("tile_mouse_entered", self, "on_tile_hover")
|
||||
# tiles.add_child(tile)
|
||||
for island_tile in generated_tiles.values():
|
||||
var scene_tile = create_tile_for_hex(island_tile)
|
||||
tiles.add_child(scene_tile)
|
||||
|
||||
print ("Generated island with " + str(tiles.get_child_count()) + " nodes")
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
[ext_resource path="res://scenes/Island.gd" type="Script" id=1]
|
||||
|
||||
[node name="Island" type="Spatial"]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 5.43195, 0, 0 )
|
||||
script = ExtResource( 1 )
|
||||
level_size = 200
|
||||
|
||||
[node name="Tiles" type="Spatial" parent="."]
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
class_name IslandGenerator
|
||||
extends Node
|
||||
|
||||
var IslandTile = preload("res://utils/IslandTile.gd")
|
||||
var HexCell = preload("res://addons/gdhexgrid/HexCell.gd")
|
||||
|
||||
func hex_cell_to_island_tile (hex: HexCell) -> IslandTile:
|
||||
var tile = IslandTile.new()
|
||||
tile.fromHexCell(hex)
|
||||
return tile
|
||||
|
||||
|
||||
func random_walk(walk_size):
|
||||
var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new()
|
||||
var tiles = {}
|
||||
|
||||
var current_offset_coordinate = Vector2(0, 0)
|
||||
var current_tile = hex_cell_to_island_tile(hexgrid.get_hex_from_offset(Vector2(0,0)))
|
||||
tiles[current_tile.offset_coords] = current_tile
|
||||
|
||||
for i in range(walk_size - 1):
|
||||
var neighbours = current_tile.get_all_adjacent()
|
||||
|
||||
var tile_exists = true
|
||||
while tile_exists and len(neighbours) > 0:
|
||||
var test_index = randi() % len(neighbours)
|
||||
var test_tile = hex_cell_to_island_tile(neighbours[test_index])
|
||||
if test_tile.offset_coords in tiles.keys():
|
||||
neighbours.remove(test_index)
|
||||
else:
|
||||
tile_exists = false
|
||||
current_tile = test_tile
|
||||
|
||||
if len(neighbours) == 0:
|
||||
break
|
||||
|
||||
tiles[current_tile.offset_coords] = current_tile
|
||||
|
||||
return tiles
|
||||
|
||||
func extrude_tiles(tiles):
|
||||
var old_tiles = tiles
|
||||
|
||||
tiles = {}
|
||||
for tile in old_tiles.values():
|
||||
if not tile.offset_coords in tiles.keys():
|
||||
tiles[tile.offset_coords] = tile
|
||||
|
||||
var neighbours = tile.get_all_adjacent()
|
||||
for neighbour in neighbours:
|
||||
if neighbour.offset_coords in tiles.keys():
|
||||
continue
|
||||
|
||||
neighbour = hex_cell_to_island_tile(neighbour)
|
||||
tiles[neighbour.offset_coords] = neighbour
|
||||
|
||||
return tiles
|
||||
|
||||
|
||||
func mark_sand_tiles(tiles):
|
||||
for tile in tiles.values():
|
||||
tile.type = IslandTile.TileType.Grass if randi() % 2 else IslandTile.TileType.DeepGrass
|
||||
var tile_neighbours = tile.get_all_adjacent()
|
||||
|
||||
for neighbour in tile_neighbours:
|
||||
if not neighbour.offset_coords in tiles.keys():
|
||||
tile.type = IslandTile.TileType.Sand
|
||||
break
|
||||
|
||||
return tiles
|
|
@ -0,0 +1,20 @@
|
|||
extends "res://addons/gdhexgrid/HexCell.gd"
|
||||
class_name IslandTile
|
||||
|
||||
enum TileType { Sand, Grass, DeepGrass, Rock }
|
||||
|
||||
var type = TileType.Sand
|
||||
|
||||
func _init(coords=null):
|
||||
# HexCells can be created with coordinates
|
||||
if coords:
|
||||
self.cube_coords = obj_to_coords(coords)
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
func fromHexCell (hex_cell: HexCell):
|
||||
cube_coords = hex_cell.cube_coords
|
||||
offset_coords = hex_cell.offset_coords
|
||||
axial_coords = hex_cell.axial_coords
|
|
@ -1,44 +0,0 @@
|
|||
tool
|
||||
extends Node
|
||||
|
||||
export var generate = false setget do_generate
|
||||
export var level_size = 10
|
||||
|
||||
func generate_level(level_node):
|
||||
var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new()
|
||||
var HexTile3D = preload("res://scenes/HexTile3D.tscn")
|
||||
|
||||
var num_tiles_x = level_size
|
||||
var num_tiles_z = level_size
|
||||
|
||||
for i in range(-num_tiles_x / 2, num_tiles_x / 2):
|
||||
for j in range (-num_tiles_z / 2, num_tiles_z / 2):
|
||||
var pos = hexgrid.get_hex_center_from_offset(Vector2(i, j))
|
||||
var tile = HexTile3D.instance()
|
||||
var height = (sin(pos.y * 0.3) * sin(pos.y * 0.8) * 0.8 + cos ((pos.x) * 0.9) * 1.24) * 0.5 + 0.4 + rand_range(-0.3, 0.3)
|
||||
tile.transform.origin = Vector3(pos.x, height, pos.y)
|
||||
tile.connect("tile_selected", self, "on_tile_selected")
|
||||
tile.connect("tile_mouse_entered", self, "on_tile_hover")
|
||||
level_node.add_child(tile)
|
||||
|
||||
var pos = hexgrid.get_hex_center3(Vector3(0, 0, 0))
|
||||
print (pos)
|
||||
|
||||
var hex = hexgrid.get_hex_at(pos)
|
||||
print (hex)
|
||||
|
||||
print ("Generated level with " + str(level_node.get_child_count()) + " nodes")
|
||||
|
||||
func do_generate(flag: bool):
|
||||
print ("flag: " + str(flag))
|
||||
var tiles = get_node("../Tiles")
|
||||
if tiles == null:
|
||||
print ("Cannot generate: node '../Tiles' not found!")
|
||||
return
|
||||
|
||||
for node in tiles.get_children():
|
||||
tiles.remove_child(node)
|
||||
node.queue_free()
|
||||
|
||||
generate_level(tiles)
|
||||
|
Loading…
Reference in New Issue