implement primitive parcel drawing
This commit is contained in:
parent
0cf64a4bc9
commit
e619b9a6df
8 changed files with 112 additions and 26 deletions
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=14 format=3 uid="uid://c5deq5s55q0ii"]
|
[gd_scene load_steps=15 format=3 uid="uid://c5deq5s55q0ii"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"]
|
[ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"]
|
||||||
[ext_resource type="Script" path="res://scripts/EventBus.gd" id="2_0j1ud"]
|
[ext_resource type="Script" path="res://scripts/EventBus.gd" id="2_0j1ud"]
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
[ext_resource type="Script" path="res://scripts/CameraMarker.gd" id="7_6krn1"]
|
[ext_resource type="Script" path="res://scripts/CameraMarker.gd" id="7_6krn1"]
|
||||||
[ext_resource type="Script" path="res://scripts/MapBackground.gd" id="8_ron2j"]
|
[ext_resource type="Script" path="res://scripts/MapBackground.gd" id="8_ron2j"]
|
||||||
[ext_resource type="Script" path="res://scripts/UILayer.gd" id="9_ebec0"]
|
[ext_resource type="Script" path="res://scripts/UILayer.gd" id="9_ebec0"]
|
||||||
|
[ext_resource type="Script" path="res://scripts/InfoLayer.gd" id="14_hbedy"]
|
||||||
|
|
||||||
[node name="Main" type="Node"]
|
[node name="Main" type="Node"]
|
||||||
script = ExtResource("1_ysxum")
|
script = ExtResource("1_ysxum")
|
||||||
|
@ -45,6 +46,10 @@ script = ExtResource("8_ron2j")
|
||||||
|
|
||||||
[node name="MainMenu" parent="EventBus" instance=ExtResource("2_wfpe2")]
|
[node name="MainMenu" parent="EventBus" instance=ExtResource("2_wfpe2")]
|
||||||
|
|
||||||
|
[node name="InfoLayer" type="Node2D" parent="EventBus"]
|
||||||
|
visible = false
|
||||||
|
script = ExtResource("14_hbedy")
|
||||||
|
|
||||||
[node name="UILayer" type="CanvasLayer" parent="EventBus"]
|
[node name="UILayer" type="CanvasLayer" parent="EventBus"]
|
||||||
process_mode = 1
|
process_mode = 1
|
||||||
visible = false
|
visible = false
|
||||||
|
|
|
@ -41,6 +41,9 @@ func set_camera_position(pos: Vector2) -> void:
|
||||||
|
|
||||||
|
|
||||||
func set_camera_limits() -> void:
|
func set_camera_limits() -> void:
|
||||||
|
if Globals.map_size < Globals.MAP_MIN_WIDTH:
|
||||||
|
push_error("Camera: implausible map size '" + str(Globals.map_size) + "' while setting camera limits:")
|
||||||
|
|
||||||
# set camera bounds to map size, with chunk_in_px room to go over
|
# set camera bounds to map size, with chunk_in_px room to go over
|
||||||
self.set_limit(SIDE_LEFT, -chunk_in_px.x)
|
self.set_limit(SIDE_LEFT, -chunk_in_px.x)
|
||||||
self.set_limit(SIDE_RIGHT, Globals.map_size*Globals.TILE_SIZE_X + chunk_in_px.x)
|
self.set_limit(SIDE_RIGHT, Globals.map_size*Globals.TILE_SIZE_X + chunk_in_px.x)
|
||||||
|
|
|
@ -16,7 +16,7 @@ var map_filenames:Array = [
|
||||||
"res://maps/tampere_256px.png",
|
"res://maps/tampere_256px.png",
|
||||||
"res://maps/tampere_10x10km_4096px.png"
|
"res://maps/tampere_10x10km_4096px.png"
|
||||||
]
|
]
|
||||||
var map_filename:String = map_filenames[3]
|
var map_filename:String = map_filenames[1]
|
||||||
var _world_generator:WorldGenerator
|
var _world_generator:WorldGenerator
|
||||||
|
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ func _unhandled_input(event) -> void:
|
||||||
node_camera.camera_reset_rotation()
|
node_camera.camera_reset_rotation()
|
||||||
|
|
||||||
if event.is_action_pressed("take_screenshot"):
|
if event.is_action_pressed("take_screenshot"):
|
||||||
node_camera.take_screenshot()
|
node_camera.camera_take_screenshot()
|
||||||
|
|
||||||
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
|
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
|
||||||
if !node_camera.get_camera_panning() and event.pressed:
|
if !node_camera.get_camera_panning() and event.pressed:
|
||||||
|
@ -153,6 +153,10 @@ func start_new_game():
|
||||||
node_game.set_visible(true)
|
node_game.set_visible(true)
|
||||||
node_uilayer.set_visible(true)
|
node_uilayer.set_visible(true)
|
||||||
|
|
||||||
|
var node_infolayer:InfoLayer
|
||||||
|
node_infolayer = find_child("InfoLayer")
|
||||||
|
node_infolayer.set_visible(true)
|
||||||
|
|
||||||
# set camera to center of the map
|
# set camera to center of the map
|
||||||
node_camera.camera_reset_rotation()
|
node_camera.camera_reset_rotation()
|
||||||
node_camera.set_camera_position(
|
node_camera.set_camera_position(
|
||||||
|
|
|
@ -5,6 +5,29 @@ extends Node
|
||||||
|
|
||||||
var chunks_loaded:int = 0
|
var chunks_loaded:int = 0
|
||||||
|
|
||||||
|
###################################
|
||||||
|
# VARIABLE GAME DATA, saved #
|
||||||
|
###################################
|
||||||
|
|
||||||
|
# map size is based on input image x*y pixel size
|
||||||
|
@export var map_size:int
|
||||||
|
|
||||||
|
# store terrain type (water, land, forest etc. for every map cell)
|
||||||
|
@export var map_terrain_data:Array[PackedInt32Array] = [[]]
|
||||||
|
|
||||||
|
# preprocess and store exact tile for every map cell to speed up setting tiles
|
||||||
|
@export var map_tile_data:Array[Array] = [[]]
|
||||||
|
|
||||||
|
# list of parcels the map is divided to
|
||||||
|
@export var map_parcel_data:Array[Array] = [[]]
|
||||||
|
|
||||||
|
# current camera zoom level
|
||||||
|
@export var CAMERA_ZOOM_LEVEL:float
|
||||||
|
@export var CAMERA_POSITION:Vector2i
|
||||||
|
|
||||||
|
# minimap texture, used also as save game's imagetexture
|
||||||
|
@export var minimap_texture:ImageTexture = null
|
||||||
|
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
# FILE PATHS #
|
# FILE PATHS #
|
||||||
|
@ -20,9 +43,9 @@ const SCRIPT_PATH:String = "res://scripts"
|
||||||
###################################
|
###################################
|
||||||
|
|
||||||
var minimap_colors:Dictionary = {
|
var minimap_colors:Dictionary = {
|
||||||
Globals.TILE_WATER : Color8(42, 31, 255),
|
Globals.TILE_WATER : Color8(42, 31, 255),
|
||||||
Globals.TILE_TERRAIN: Color8(148, 113, 71),
|
Globals.TILE_TERRAIN: Color8(148, 113, 71),
|
||||||
Globals.TILE_FOREST: Color8(0,123,19),
|
Globals.TILE_FOREST : Color8(0,123,19),
|
||||||
"default": Color8(255,0,255),
|
"default": Color8(255,0,255),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,34 +60,24 @@ const CHUNK_SIZE:Vector2i = Vector2i(32,32)
|
||||||
# tilemap tile types
|
# tilemap tile types
|
||||||
enum {TILE_WATER, TILE_TERRAIN, TILE_FOREST, TILE_BOG}
|
enum {TILE_WATER, TILE_TERRAIN, TILE_FOREST, TILE_BOG}
|
||||||
|
|
||||||
|
# parcel owner types
|
||||||
|
enum {PARCEL_CITY, PARCEL_STATE, PARCEL_PRIVATE}
|
||||||
|
|
||||||
# tilemap layers
|
# tilemap layers
|
||||||
enum {LAYER_TERRAIN, LAYER_BUILDINGS}
|
enum {LAYER_TERRAIN, LAYER_BUILDINGS}
|
||||||
const TILESET_TERRAIN:TileSet = preload("res://scenes/Chunk.tres")
|
const TILESET_TERRAIN:TileSet = preload("res://scenes/Chunk.tres")
|
||||||
|
|
||||||
# map size is based on input image x*y pixel size
|
|
||||||
var map_size:int = 0
|
|
||||||
|
|
||||||
# store terrain type (water, land, forest etc. for every map cell)
|
|
||||||
var map_terrain_data:Array[PackedInt32Array] = [[]]
|
|
||||||
|
|
||||||
# preprocess and store exact tile for every map cell to speed up setting tiles
|
|
||||||
var map_tile_data:Array[Array] = [[]]
|
|
||||||
|
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
# CAMERA SETTINGS #
|
# CAMERA SETTINGS #
|
||||||
###################################
|
###################################
|
||||||
|
|
||||||
|
# minimap camera marker sprite
|
||||||
var camera_marker:Sprite2D
|
var camera_marker:Sprite2D
|
||||||
|
|
||||||
# GAME WINDOW DEFAULT SIZE
|
# GAME WINDOW DEFAULT SIZE
|
||||||
const DEFAULT_X_RES:int = 1920
|
const DEFAULT_X_RES:int = 1920
|
||||||
const DEFAULT_Y_RES:int = 1080
|
const DEFAULT_Y_RES:int = 1080
|
||||||
|
|
||||||
# current camera zoom level
|
|
||||||
var CAMERA_ZOOM_LEVEL: float = 1.0
|
|
||||||
var CAMERA_POSITION:Vector2i
|
|
||||||
|
|
||||||
# camera movement settings
|
# camera movement settings
|
||||||
const CAMERA_MIN_ZOOM_LEVEL: float = 0.1
|
const CAMERA_MIN_ZOOM_LEVEL: float = 0.1
|
||||||
const CAMERA_MAX_ZOOM_LEVEL: float = 2.0
|
const CAMERA_MAX_ZOOM_LEVEL: float = 2.0
|
||||||
|
|
23
scripts/InfoLayer.gd
Normal file
23
scripts/InfoLayer.gd
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
class_name InfoLayer
|
||||||
|
extends Node2D
|
||||||
|
|
||||||
|
# displays various info layers of the game
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
pass # Replace with function body.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func _draw():
|
||||||
|
for y in 16:
|
||||||
|
for x in 64:
|
||||||
|
draw_rect(Rect2(x*16*16, y*64*16, 16*16, 64*16), Color8(200,25,25,220), false, 4.0)
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(_delta):
|
||||||
|
self.position = Vector2(0,0)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ extends Control
|
||||||
signal set_camera_position(pos:Vector2)
|
signal set_camera_position(pos:Vector2)
|
||||||
signal set_map_background_texture(texture, scaling)
|
signal set_map_background_texture(texture, scaling)
|
||||||
|
|
||||||
@onready var minimap_texture:ImageTexture = null
|
|
||||||
@onready var sprite:Sprite2D
|
@onready var sprite:Sprite2D
|
||||||
@onready var is_mouse_inside_minimap:bool = false
|
@onready var is_mouse_inside_minimap:bool = false
|
||||||
@onready var position_multiplier:float
|
@onready var position_multiplier:float
|
||||||
|
@ -15,7 +14,7 @@ var observe_mouse_inside_minimap:bool = false
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
self.minimap_texture = ImageTexture.new()
|
Globals.minimap_texture = ImageTexture.new()
|
||||||
|
|
||||||
|
|
||||||
func _draw():
|
func _draw():
|
||||||
|
@ -69,7 +68,7 @@ func generate_minimap() -> void:
|
||||||
|
|
||||||
image.set_pixel(x, y, color)
|
image.set_pixel(x, y, color)
|
||||||
|
|
||||||
minimap_texture = ImageTexture.create_from_image(image)
|
Globals.minimap_texture = ImageTexture.create_from_image(image)
|
||||||
|
|
||||||
|
|
||||||
func set_camera_marker() -> void:
|
func set_camera_marker() -> void:
|
||||||
|
@ -79,7 +78,7 @@ func set_camera_marker() -> void:
|
||||||
|
|
||||||
func set_minimap() -> void:
|
func set_minimap() -> void:
|
||||||
self.sprite = self.find_child("MinimapSprite")
|
self.sprite = self.find_child("MinimapSprite")
|
||||||
self.sprite.texture = minimap_texture
|
self.sprite.texture = Globals.minimap_texture
|
||||||
|
|
||||||
# The size of a sprite is determined from its texture
|
# The size of a sprite is determined from its texture
|
||||||
var texture_size = sprite.texture.get_size()
|
var texture_size = sprite.texture.get_size()
|
||||||
|
|
|
@ -3,8 +3,12 @@ extends CanvasLayer
|
||||||
|
|
||||||
@onready var node_minimap:Minimap
|
@onready var node_minimap:Minimap
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
node_minimap = find_child("Minimap")
|
node_minimap = find_child("Minimap")
|
||||||
|
|
||||||
|
|
||||||
func set_ready() -> void:
|
func set_ready() -> void:
|
||||||
node_minimap.set_ready()
|
node_minimap.set_ready()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -93,11 +93,46 @@ func generate_biomes() -> void:
|
||||||
Globals.map_terrain_data[y][x] = Globals.TILE_FOREST
|
Globals.map_terrain_data[y][x] = Globals.TILE_FOREST
|
||||||
# can add other tresholds here for other biomes
|
# can add other tresholds here for other biomes
|
||||||
|
|
||||||
|
# TODO move to globals later
|
||||||
|
var parcel_width = 16
|
||||||
|
var parcel_height = 64
|
||||||
|
|
||||||
|
# forests are not generated yet so can just compare water and terrain
|
||||||
|
func is_filled_with_water(coords:Vector2i) -> bool:
|
||||||
|
var terrain_tile_count:int = 0
|
||||||
|
|
||||||
|
for y in range(coords.y, coords.y + parcel_height):
|
||||||
|
for x in range(coords.x, coords.x + parcel_width):
|
||||||
|
if Globals.map_terrain_data[y][x] == Globals.TILE_TERRAIN:
|
||||||
|
terrain_tile_count += 1
|
||||||
|
|
||||||
|
# parcel is ok if it has at least one land
|
||||||
|
if terrain_tile_count > 0:
|
||||||
|
return false
|
||||||
|
return true
|
||||||
|
|
||||||
func generate_parcels() -> void:
|
func generate_parcels() -> void:
|
||||||
# divide the land area Cadastres / Parcels
|
# divide the land area Cadastres / Parcels
|
||||||
#print("generating parcels")
|
# TODO better solution, this is something my skills were able to handle at proto stage
|
||||||
pass
|
# should replace with a real/better algo when I am skilled enough to do it
|
||||||
|
Globals.map_parcel_data.resize(Globals.map_size / parcel_height)
|
||||||
|
|
||||||
|
for y in Globals.map_size / parcel_height:
|
||||||
|
Globals.map_parcel_data[y].resize(Globals.map_size / parcel_width)
|
||||||
|
for x in Globals.map_size / parcel_width:
|
||||||
|
# ignore parcels full fo water
|
||||||
|
if !is_filled_with_water(Vector2i(y,x)):
|
||||||
|
# 0 = top left corner, 1 = bottom right corner, 2 = owner
|
||||||
|
Globals.map_parcel_data[y][x] = [
|
||||||
|
Vector2i(y * parcel_height, x * parcel_width),
|
||||||
|
Vector2i(y * parcel_height + parcel_height, x * parcel_width + parcel_width),
|
||||||
|
Globals.PARCEL_STATE
|
||||||
|
]
|
||||||
|
|
||||||
|
#for row in Globals.map_parcel_data:
|
||||||
|
# print(row)
|
||||||
|
#for col in row:
|
||||||
|
# print(Globals.map_parcel_data[row][col])
|
||||||
|
|
||||||
|
|
||||||
func generate_world(filename) -> bool:
|
func generate_world(filename) -> bool:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue