]> Untitled Git - catris.git/commitdiff
Added pieces. Needs proper collision handling
authorClifton Palmer <clifton.james.palmer@protonmail.com>
Mon, 24 Mar 2025 09:39:55 +0000 (11:39 +0200)
committerClifton Palmer <clifton.james.palmer@protonmail.com>
Mon, 24 Mar 2025 11:14:55 +0000 (13:14 +0200)
piece/I-piece.tscn [new file with mode: 0644]
piece/L-piece.tscn [new file with mode: 0644]
piece/O-piece.tscn [new file with mode: 0644]
piece/S-piece.tscn [new file with mode: 0644]
piece/T-piece.tscn [new file with mode: 0644]
piece/base-piece.tscn [new file with mode: 0644]
scene/board.tscn
script/board.gd
script/piece.gd [new file with mode: 0644]
script/piece.gd.uid [new file with mode: 0644]

diff --git a/piece/I-piece.tscn b/piece/I-piece.tscn
new file mode 100644 (file)
index 0000000..afd6b58
--- /dev/null
@@ -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 (file)
index 0000000..9dcc6f7
--- /dev/null
@@ -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 (file)
index 0000000..578ae8f
--- /dev/null
@@ -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 (file)
index 0000000..3adc475
--- /dev/null
@@ -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 (file)
index 0000000..781ad67
--- /dev/null
@@ -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 (file)
index 0000000..38edc52
--- /dev/null
@@ -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")]
index 53a2437e268a68f8f7837a879810a91689868043..732cbd093bff37587e196bfeb81a4b37aef7c687 100644 (file)
@@ -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
index 5368ddd9fde2d16c4149cbd8eccbd4f9680381e7..6ee9e7ad49ac3648b8230f39d9b5225dd4a242d3 100644 (file)
@@ -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 (file)
index 0000000..aa50f0a
--- /dev/null
@@ -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 (file)
index 0000000..db00f29
--- /dev/null
@@ -0,0 +1 @@
+uid://uhr6sr2hggfc