Prototype tile placement

This commit is contained in:
effie 2025-06-18 23:38:20 +10:00
parent a476687fbf
commit 2c3fa47ac5
18 changed files with 155 additions and 16 deletions

1
build_enable_button.gd Normal file
View File

@ -0,0 +1 @@
extends CheckButton

View File

@ -0,0 +1 @@
uid://toyg8a6pv2i1

View File

@ -1,3 +1,21 @@
[gd_scene format=3 uid="uid://x8xo5b1b3q41"]
[gd_scene load_steps=2 format=3 uid="uid://x8xo5b1b3q41"]
[ext_resource type="PackedScene" uid="uid://0d1d5e1u2fys" path="res://map/map_manager.tscn" id="1_ig7tw"]
[node name="Main" type="Node"]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="CheckButton" type="CheckButton" parent="CanvasLayer"]
offset_left = 1008.0
offset_top = 18.0
offset_right = 1120.0
offset_bottom = 49.0
text = "Building"
[node name="MapManager" parent="." instance=ExtResource("1_ig7tw")]
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 18.064, 14.45, 9.456)
[connection signal="toggled" from="CanvasLayer/CheckButton" to="MapManager" method="_build_toggled"]

45
map/base_map/grid.gd Normal file
View File

@ -0,0 +1,45 @@
extends Node3D
var load_tile = preload("res://tiles/base_tile/tile.tscn")
var tiledict = {}
func _ready():
pass
func init_tile(float_build_start_pos, float_build_mouse_pos):
var build_start_pos: Vector3i = float_build_start_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var build_mouse_pos: Vector3i = float_build_mouse_pos.snapped(Vector3i(1.0, 1.0, 1.0))
var flat_pos = build_start_pos + build_mouse_pos
var distance = abs(build_start_pos - build_mouse_pos)
#var build_mouse_x = floor(build_mouse_pos.x)
#var build_mouse_z = floor(build_mouse_pos.z)
#
#var grid_x_count = max(1, build_mouse_pos.x - build_start_pos.x)
#var grid_z_count = max(1, build_mouse_pos.z - build_start_pos.z)
var crop_x = max(1, distance.x)
var crop_z = max(1, distance.z)
for x in crop_x:
for z in crop_z:
var id = flat_pos
var tile = load_tile.instantiate()
tile.position = build_start_pos + Vector3i(x, 0, z)
print("global", build_start_pos + Vector3i(x, 0, z))
if not tiledict.has(id):
print("global after", build_start_pos + Vector3i(x, 0, z))
print("x (global)", id)
print("global", tile.position)
tiledict[id] = tile
add_child(tile)

1
map/base_map/grid.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://n4vvqmlmq5fp

View File

@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"]
[ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://map/base_map/grid.gd" id="1_2j6sh"]
[node name="TestWorld" type="Node3D"]
script = ExtResource("1_2j6sh")
[node name="Grid" type="Node3D" parent="."]

40
map/map_manager.gd Normal file
View File

@ -0,0 +1,40 @@
extends Node3D
var load_map = preload("res://map/base_map/test_map.tscn")
var map = load_map.instantiate()
var build_enabled = false
var is_building = false
var build_start_pos = null
func _ready():
add_child(map)
func _input(event):
pass
func _build_toggled(toggled_on) -> void:
if toggled_on:
build_enabled = true
else:
build_enabled = false
func toggle_building(event):
if event.pressed:
is_building = true
if not event.pressed:
is_building = false
func _on_area_3d_input_event(_camera, event, event_position, _normal, _shade_id):
if event.is_action("select") && build_enabled:
is_building = true
build_start_pos = event_position
toggle_building(event)
if not event.is_action_pressed("select") && is_building:
var build_mouse_pos = event_position
map.init_tile(build_start_pos, build_mouse_pos)
pass # Replace with function body.

1
map/map_manager.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://d24sr2dat4lj0

22
map/map_manager.tscn Normal file
View File

@ -0,0 +1,22 @@
[gd_scene load_steps=4 format=3 uid="uid://0d1d5e1u2fys"]
[ext_resource type="Script" uid="uid://d24sr2dat4lj0" path="res://map/map_manager.gd" id="1_rcbs8"]
[sub_resource type="BoxShape3D" id="BoxShape3D_rcbs8"]
size = Vector3(256, 0, 256)
[sub_resource type="PrismMesh" id="PrismMesh_rcbs8"]
[node name="MapManager" type="Node3D"]
script = ExtResource("1_rcbs8")
[node name="Area3D" type="Area3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 128, 0, 128)
shape = SubResource("BoxShape3D_rcbs8")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Area3D"]
mesh = SubResource("PrismMesh_rcbs8")
[connection signal="input_event" from="Area3D" to="." method="_on_area_3d_input_event"]

View File

@ -11,9 +11,18 @@ config_version=5
[application]
config/name="Project Villain"
run/main_scene="uid://x8xo5b1b3q41"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[input]
select={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
[physics]
3d/default_gravity=0.0

6
tiles/base_tile/tile.gd Normal file
View File

@ -0,0 +1,6 @@
extends Node3D
var id = null
# tiles are 'buildable area' or not. non-buildable tiles are used as normal, but not chanegd by player
# buildable are tiles need five total faces. If a face doesn't exist, it's assumed to be open space.

View File

@ -1,7 +1,7 @@
[gd_scene load_steps=3 format=3 uid="uid://gs6yynwvvot2"]
[ext_resource type="Script" uid="uid://jqjcr7dxjnbt" path="res://world/base_world/base_tile/tile.gd" id="1_v7x5k"]
[ext_resource type="PlaneMesh" uid="uid://bis4hdushjnjm" path="res://world/base_world/base_tile/base_floor.tres" id="2_ipr02"]
[ext_resource type="Script" uid="uid://jqjcr7dxjnbt" path="res://tiles/base_tile/tile.gd" id="1_v7x5k"]
[ext_resource type="PlaneMesh" uid="uid://bis4hdushjnjm" path="res://tiles/base_tile/base_floor.tres" id="2_ipr02"]
[node name="Tile" type="Node3D"]
script = ExtResource("1_v7x5k")

View File

@ -1,5 +0,0 @@
extends Node3D
# tiles need five total faces. If a face doesn't exist, it's assumed to be open space.
#

View File

@ -1,5 +0,0 @@
[gd_scene format=3 uid="uid://bujuwgn3y42ek"]
[node name="TestWorld" type="Node3D"]
[node name="Grid" type="Node3D" parent="."]

View File

@ -1,3 +0,0 @@
[gd_scene format=3 uid="uid://0d1d5e1u2fys"]
[node name="WorldManager" type="Node3D"]