From 5b090c35e5d741efe235ce84a2dd124828858863 Mon Sep 17 00:00:00 2001 From: Clifton Palmer Date: Mon, 24 Mar 2025 11:39:55 +0200 Subject: [PATCH] Added pieces. Needs proper collision handling --- piece/I-piece.tscn | 19 +++++++++++++++++++ piece/L-piece.tscn | 18 ++++++++++++++++++ piece/O-piece.tscn | 18 ++++++++++++++++++ piece/S-piece.tscn | 18 ++++++++++++++++++ piece/T-piece.tscn | 18 ++++++++++++++++++ piece/base-piece.tscn | 10 ++++++++++ scene/board.tscn | 9 +++++---- script/board.gd | 44 +++++++++++++++++++++---------------------- script/piece.gd | 28 +++++++++++++++++++++++++++ script/piece.gd.uid | 1 + 10 files changed, 157 insertions(+), 26 deletions(-) create mode 100644 piece/I-piece.tscn create mode 100644 piece/L-piece.tscn create mode 100644 piece/O-piece.tscn create mode 100644 piece/S-piece.tscn create mode 100644 piece/T-piece.tscn create mode 100644 piece/base-piece.tscn create mode 100644 script/piece.gd create mode 100644 script/piece.gd.uid diff --git a/piece/I-piece.tscn b/piece/I-piece.tscn new file mode 100644 index 0000000..afd6b58 --- /dev/null +++ b/piece/I-piece.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://baol0a7qqcn3x"] + +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="1_nd8nt"] +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_pu3h3"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_pu3h3") +piece_name = "I" + +[node name="Cell" parent="." instance=ExtResource("1_nd8nt")] + +[node name="Cell2" parent="." instance=ExtResource("1_nd8nt")] +position = Vector2(20, 0) + +[node name="Cell3" parent="." instance=ExtResource("1_nd8nt")] +position = Vector2(-20, 0) + +[node name="Cell4" parent="." instance=ExtResource("1_nd8nt")] +position = Vector2(-40, 0) diff --git a/piece/L-piece.tscn b/piece/L-piece.tscn new file mode 100644 index 0000000..9dcc6f7 --- /dev/null +++ b/piece/L-piece.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://dy0ckr6gerb0u"] + +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_vj3oe"] +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_ptex0"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_vj3oe") + +[node name="Cell" parent="." instance=ExtResource("2_ptex0")] +position = Vector2(-20, 0) + +[node name="Cell2" parent="." instance=ExtResource("2_ptex0")] +position = Vector2(-20, -20) + +[node name="Cell3" parent="." instance=ExtResource("2_ptex0")] + +[node name="Cell4" parent="." instance=ExtResource("2_ptex0")] +position = Vector2(-20, -40) diff --git a/piece/O-piece.tscn b/piece/O-piece.tscn new file mode 100644 index 0000000..578ae8f --- /dev/null +++ b/piece/O-piece.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://d0810r1cqtcgi"] + +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_pgu83"] +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_agi1u"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_pgu83") + +[node name="Cell" parent="." instance=ExtResource("2_agi1u")] + +[node name="Cell2" parent="." instance=ExtResource("2_agi1u")] +position = Vector2(0, -20) + +[node name="Cell3" parent="." instance=ExtResource("2_agi1u")] +position = Vector2(-20, 0) + +[node name="Cell4" parent="." instance=ExtResource("2_agi1u")] +position = Vector2(-20, -20) diff --git a/piece/S-piece.tscn b/piece/S-piece.tscn new file mode 100644 index 0000000..3adc475 --- /dev/null +++ b/piece/S-piece.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://cippodirvtoil"] + +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_c75fa"] +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_ymjp1"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_c75fa") + +[node name="Cell" parent="." instance=ExtResource("2_ymjp1")] +position = Vector2(-20, 0) + +[node name="Cell2" parent="." instance=ExtResource("2_ymjp1")] +position = Vector2(-20, -20) + +[node name="Cell3" parent="." instance=ExtResource("2_ymjp1")] + +[node name="Cell4" parent="." instance=ExtResource("2_ymjp1")] +position = Vector2(0, 20) diff --git a/piece/T-piece.tscn b/piece/T-piece.tscn new file mode 100644 index 0000000..781ad67 --- /dev/null +++ b/piece/T-piece.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://36g8xep7m4ly"] + +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_ad4jm"] +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_h7cue"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_ad4jm") + +[node name="Cell" parent="." instance=ExtResource("2_h7cue")] +position = Vector2(-20, 0) + +[node name="Cell2" parent="." instance=ExtResource("2_h7cue")] +position = Vector2(20, 0) + +[node name="Cell3" parent="." instance=ExtResource("2_h7cue")] + +[node name="Cell4" parent="." instance=ExtResource("2_h7cue")] +position = Vector2(0, 20) diff --git a/piece/base-piece.tscn b/piece/base-piece.tscn new file mode 100644 index 0000000..38edc52 --- /dev/null +++ b/piece/base-piece.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://dkiqoguo8ulrj"] + +[ext_resource type="Script" uid="uid://uhr6sr2hggfc" path="res://script/piece.gd" id="1_wls6v"] +[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_ayqon"] + +[node name="Piece" type="Node2D"] +script = ExtResource("1_wls6v") +piece_name = "I" + +[node name="Cell" parent="." instance=ExtResource("2_ayqon")] diff --git a/scene/board.tscn b/scene/board.tscn index 53a2437..732cbd0 100644 --- a/scene/board.tscn +++ b/scene/board.tscn @@ -1,18 +1,19 @@ -[gd_scene load_steps=4 format=3 uid="uid://4saff6435gux"] +[gd_scene load_steps=5 format=3 uid="uid://4saff6435gux"] [ext_resource type="Script" uid="uid://bex8wrsgbx63r" path="res://script/board.gd" id="1_b3264"] -[ext_resource type="PackedScene" uid="uid://cmdvtaiunt32k" path="res://piece/cell.tscn" id="2_32fhn"] +[ext_resource type="PackedScene" uid="uid://dkiqoguo8ulrj" path="res://piece/base-piece.tscn" id="2_rl6p6"] +[ext_resource type="PackedScene" uid="uid://baol0a7qqcn3x" path="res://piece/I-piece.tscn" id="3_cpyxj"] [ext_resource type="Texture2D" uid="uid://b6om08wjtci31" path="res://asset/grid.png" id="3_rl6p6"] [node name="Board" type="Control"] -custom_minimum_size = Vector2(200, 300) +custom_minimum_size = Vector2(200, 400) layout_mode = 3 anchors_preset = 5 anchor_left = 0.5 anchor_right = 0.5 grow_horizontal = 2 script = ExtResource("1_b3264") -cell_catalogue = Array[PackedScene]([ExtResource("2_32fhn")]) +piece_catalogue = Array[PackedScene]([ExtResource("2_rl6p6"), ExtResource("3_cpyxj")]) [node name="grid" type="TextureRect" parent="."] unique_name_in_owner = true diff --git a/script/board.gd b/script/board.gd index 5368ddd..6ee9e7a 100644 --- a/script/board.gd +++ b/script/board.gd @@ -2,17 +2,20 @@ extends Control class_name Board @export var block_size: int = 20 -@export var cell_catalogue: Array[PackedScene] +@export var piece_catalogue: Array[PackedScene] = [] var _grid_filled: Array[bool] = [] var _player_position: Vector2i = Vector2i.ZERO -var _player_cell: Cell = null +var _player_piece: Piece = null var _grid_final_y_row: int = 0 var _grid_final_x_row: int = 0 var _num_pieces: int = 0 func _ready() -> void: + assert(piece_catalogue.size() >= 1, "Expected at least one piece in catalogue") + + # calculate grid _grid_final_y_row = size.y / block_size _grid_final_x_row = size.x / block_size print("Grid is " + str(_grid_final_x_row) + " by " + str(_grid_final_y_row)) @@ -26,33 +29,32 @@ func _ready() -> void: func _input(event: InputEvent) -> void: if event.is_action_pressed("player_left"): - _move_cell(Vector2i(-1, 0)) + _move(Vector2i(-1, 0)) elif event.is_action_pressed("player_right"): - _move_cell(Vector2i(1, 0)) + _move(Vector2i(1, 0)) if event.is_action_pressed("player_up"): # TODO: rotate pass if event.is_action("player_down"): - _move_cell(Vector2i(0, 1)) + _move(Vector2i(0, 1)) -func _add_player_cell(): - var scene: PackedScene = cell_catalogue.pick_random() - var cell: Cell = scene.instantiate() - cell.block_size = block_size +func _add_player_piece(): + var scene: PackedScene = piece_catalogue.pick_random() + var piece: Piece = scene.instantiate() + piece.block_size = block_size _player_position = Vector2i(5, 0) - cell.position = _player_position * block_size - _player_cell = cell + piece.position = _player_position * block_size + _player_piece = piece - add_child(cell) + add_child(piece) _num_pieces += 1 - print("Added piece: " + str(_num_pieces)) -func _move_cell(v: Vector2i): +func _move(v: Vector2i): var new_player_position: Vector2i = _player_position + v if new_player_position.x < 0 or new_player_position.x >= _grid_final_x_row: @@ -67,31 +69,29 @@ func _move_cell(v: Vector2i): # update player position _player_position = new_player_position - if _player_cell: - _player_cell.position = _player_position * block_size + if _player_piece: + _player_piece.position = _player_position * block_size # if at the bottom of the grid, we're done if (_player_position.y == _grid_final_y_row - 1): _end_round() func _end_round(): - print("Time for a new piece!") # disconnect player controls from current piece - _player_cell = null + _player_piece = null # fill in collision grid with piece cells _set_grid_position(_player_position, true) - #_print_grid() # now start a new round _on_turn_timer_timeout() func _on_turn_timer_timeout() -> void: - if _player_cell == null: - _add_player_cell() + if _player_piece == null: + _add_player_piece() else: - _move_cell(Vector2i(0, 1)) + _move(Vector2i(0, 1)) %turnTimer.start() diff --git a/script/piece.gd b/script/piece.gd new file mode 100644 index 0000000..aa50f0a --- /dev/null +++ b/script/piece.gd @@ -0,0 +1,28 @@ +extends Node2D +class_name Piece + + +@export var piece_name: String = "" + +var cells: Array[Cell] = [] +var block_size: int = 0 + +var cell_grid: Array[Vector2i] = [] + +func _ready() -> void: + for c in self.get_children(): + if c is Cell: + cells.append(c) + + # all cells must have same block size + for c in cells: + if block_size == 0: + block_size = c.block_size + else: + assert(block_size == c.block_size, "All cells must have same block size") + + # build cell grid coordinates + for c in cells: + var pos_x: int = floori(c.position.x / block_size) + var pos_y: int = floori(c.position.y / block_size) + cell_grid.append(Vector2i(pos_x, pos_y)) diff --git a/script/piece.gd.uid b/script/piece.gd.uid new file mode 100644 index 0000000..db00f29 --- /dev/null +++ b/script/piece.gd.uid @@ -0,0 +1 @@ +uid://uhr6sr2hggfc -- 2.47.2