From ac556e3715e984e8276a66889822fcf539c72e4b Mon Sep 17 00:00:00 2001 From: Zacharie Guet Date: Sat, 22 Mar 2025 20:43:05 +0100 Subject: [PATCH] feat: change boat collision and improve overall code --- game.tscn | 11 +++++--- project.godot | 5 ++++ scenes/barrier.tscn | 30 ++++----------------- scenes/boat.tscn | 8 +++++- scenes/player.tscn | 12 ++++++++- scenes/tile.tscn | 1 + scripts/boat.gd | 65 ++++++++++++++++++++++++--------------------- scripts/game.gd | 24 ++++++++--------- scripts/player.gd | 43 ++++++++++++++++++------------ 9 files changed, 108 insertions(+), 91 deletions(-) diff --git a/game.tscn b/game.tscn index c92ae6f..893f530 100644 --- a/game.tscn +++ b/game.tscn @@ -8,8 +8,11 @@ position = Vector2(568, 324) script = ExtResource("1_41a5u") -[node name="Player" parent="." instance=ExtResource("1_geqht")] -position = Vector2(-812, -518) - [node name="Boat" parent="." instance=ExtResource("2_qmvsn")] -position = Vector2(-865, -442) +position = Vector2(-15, 40) + +[node name="Player" parent="." node_paths=PackedStringArray("boat") instance=ExtResource("1_geqht")] +position = Vector2(-67, 6) +boat = NodePath("../Boat") + +[connection signal="is_dead" from="Player" to="Boat" method="_on_player_is_dead"] diff --git a/project.godot b/project.godot index 158af30..2b59817 100644 --- a/project.godot +++ b/project.godot @@ -54,3 +54,8 @@ ui_down={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } + +[layer_names] + +2d_physics/layer_1="Barrière" +2d_physics/layer_2="Joueur" diff --git a/scenes/barrier.tscn b/scenes/barrier.tscn index 3c76899..5b43e6e 100644 --- a/scenes/barrier.tscn +++ b/scenes/barrier.tscn @@ -1,27 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://crxp1lat0mj1n"] +[gd_scene load_steps=2 format=3 uid="uid://crxp1lat0mj1n"] -[sub_resource type="Gradient" id="Gradient_7c5k4"] -offsets = PackedFloat32Array(0, 0.00371747, 0.736059, 0.754647, 1) -colors = PackedColorArray(0, 0, 0, 1, 0.94902, 0.0509804, 0.0509804, 1, 0.15042, 0.503262, 0.834652, 1, 0.117488, 0.521912, 0.866968, 1, 0.94902, 0.0509804, 0.0509804, 1) +[sub_resource type="RectangleShape2D" id="RectangleShape2D_exqad"] +size = Vector2(128, 128) -[sub_resource type="GradientTexture2D" id="GradientTexture2D_eesv4"] -gradient = SubResource("Gradient_7c5k4") -fill_from = Vector2(1, 0) -fill_to = Vector2(0, 1) - -[sub_resource type="SegmentShape2D" id="SegmentShape2D_dliv6"] -a = Vector2(9.78128e-07, 0.256411) -b = Vector2(9.78128e-07, 33.0769) - -[node name="Barrier" type="StaticBody2D"] - -[node name="Sprite2D" type="Sprite2D" parent="."] -position = Vector2(5.96046e-08, 0) -scale = Vector2(0.203125, 2.01563) -texture = SubResource("GradientTexture2D_eesv4") - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(-3.8147e-06, -65) -scale = Vector2(3.9, 3.9) -shape = SubResource("SegmentShape2D_dliv6") -one_way_collision_margin = 51.0 +[node name="Barrier" type="CollisionShape2D"] +shape = SubResource("RectangleShape2D_exqad") diff --git a/scenes/boat.tscn b/scenes/boat.tscn index 4615887..5f284ab 100644 --- a/scenes/boat.tscn +++ b/scenes/boat.tscn @@ -3,5 +3,11 @@ [ext_resource type="Script" uid="uid://bvejqjdvu7eb1" path="res://scripts/boat.gd" id="1_brclq"] [node name="Boat" type="Node2D"] -position = Vector2(-1, 0) script = ExtResource("1_brclq") + +[node name="Area2D" type="Area2D" parent="."] +unique_name_in_owner = true + +[node name="StaticBody2D" type="StaticBody2D" parent="."] + +[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] diff --git a/scenes/player.tscn b/scenes/player.tscn index ab21ef5..05c0721 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=3 uid="uid://dy71gkll44btc"] +[gd_scene load_steps=5 format=3 uid="uid://dy71gkll44btc"] [ext_resource type="Script" uid="uid://ceijb6ltpgsy1" path="res://scripts/player.gd" id="1_jlots"] [ext_resource type="Texture2D" uid="uid://s4iiumvei5wc" path="res://assets/triangle.svg" id="2_jjceo"] @@ -6,11 +6,15 @@ [sub_resource type="CircleShape2D" id="CircleShape2D_g2els"] radius = 6.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_qhqgy"] + [node name="Player" type="CharacterBody2D"] +collision_layer = 2 motion_mode = 1 script = ExtResource("1_jlots") [node name="Sprite2D2" type="Sprite2D" parent="."] +z_index = 100 position = Vector2(5, 0) rotation = -1.5708 scale = Vector2(0.230709, 0.642787) @@ -18,3 +22,9 @@ texture = ExtResource("2_jjceo") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_g2els") + +[node name="Area2D" type="Area2D" parent="."] +collision_layer = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] +shape = SubResource("CircleShape2D_qhqgy") diff --git a/scenes/tile.tscn b/scenes/tile.tscn index 9048b2d..7b27644 100644 --- a/scenes/tile.tscn +++ b/scenes/tile.tscn @@ -5,6 +5,7 @@ [node name="Tile" type="Node2D"] [node name="Sprite2D" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0.337255) position = Vector2(0, 2.28882e-05) scale = Vector2(0.074, 0.0740913) texture = ExtResource("1_bgcjk") diff --git a/scripts/boat.gd b/scripts/boat.gd index a8f2b42..8274f55 100644 --- a/scripts/boat.gd +++ b/scripts/boat.gd @@ -17,9 +17,9 @@ func _ready(): func spawn_boat_tiles(): tiles.clear() - for y in range(boatSize): + for x in range(boatSize): var row = [] - for x in range(boatSize): + for y in range(boatSize): if test_broken_tiles && randf() < 0.7 || (x == floor(boatSize/2) && y == floor(boatSize/2)): # 70% de chance de spawn une tuile pour tester les bateaux incomplets var tile = tile_scene.instantiate() add_child(tile) @@ -29,6 +29,13 @@ func spawn_boat_tiles(): (x - ((boatSize - 1) * 0.5)) * tile_size, (y - ((boatSize - 1) * 0.5)) * tile_size ) + + var collision_shape = barrier_scene.instantiate() + $Area2D.add_child(collision_shape) + collision_shape.position = Vector2( + (x - ((boatSize - 1) * 0.5)) * tile_size, + (y - ((boatSize - 1) * 0.5)) * tile_size + ) row.append(tile) else: @@ -37,35 +44,31 @@ func spawn_boat_tiles(): func spawn_boat_barriers(): - for x in range(tiles.size()): - for y in range(tiles[x].size()): - if tiles[x][y]: - var x_pos = [null,null,null,null]; - var y_pos = [null,null,null,null]; - var rotations = [90, 180, 270, 360] - if x == 0 || !tiles[x-1][y]: - x_pos[0] = tiles[x][y].position.x - y_pos[0] = tiles[x][y].position.y - (tile_size/2) - barrierOffset - if y == 0 || !tiles[x][y-1]: - x_pos[1] = tiles[x][y].position.x - (tile_size/2) - barrierOffset - y_pos[1] = tiles[x][y].position.y - if x == tiles.size()-1 || !tiles[x+1][y]: - x_pos[2] = tiles[x][y].position.x - y_pos[2] = tiles[x][y].position.y + (tile_size/2) + barrierOffset - if y == tiles[x].size()-1 || !tiles[x][y+1]: - x_pos[3] = tiles[x][y].position.x + (tile_size/2) + barrierOffset - y_pos[3] = tiles[x][y].position.y - for z in range(4): - if x_pos[z] != null && y_pos[z] != null: - var barrier = barrier_scene.instantiate() - add_child(barrier) - barrier.position = Vector2( - x_pos[z], - y_pos[z] - ) - # On applique la rotation à la barrière - barrier.rotation = deg_to_rad(rotations[z]) - + var collider_range = range(tiles.size()) + collider_range.append_array([-1, boatSize]) + for x in collider_range: + for y in collider_range: + if not has_tile(x, y): + var barrier = barrier_scene.instantiate() + $StaticBody2D.add_child(barrier) + barrier.position = Vector2( + (x - ((boatSize - 1) * 0.5)) * tile_size, + (y - ((boatSize - 1) * 0.5)) * tile_size + ) + +func has_tile(x : int, y : int): + if x >= 0 and y >= 0 and x < boatSize and y < boatSize: + return tiles[x][y] != null + else : return false + func _physics_process(delta): #Just spinning rotation += delta/6 + + +func _on_player_is_dead(): + print("Est mort") + + +func _on_area_2d_body_entered(body): + pass # Replace with function body. diff --git a/scripts/game.gd b/scripts/game.gd index 630aa38..28dc234 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -6,22 +6,22 @@ extends Node2D var player_instance: CharacterBody2D var boat_instance: Node2D -func _ready(): +#func _ready(): # On enlève les scènes par défaut - var default_boat = $Boat - var default_player = $Player - if default_boat: - default_boat.queue_free() - if default_player: - default_player.queue_free() + #var default_boat = $Boat + #var default_player = $Player + #if default_boat: + #default_boat.queue_free() + #if default_player: + #default_player.queue_free() # On instancie les scènes que l'on veut garder - boat_instance = boat_scene.instantiate() - player_instance = player_scene.instantiate() + #boat_instance = boat_scene.instantiate() + #player_instance = player_scene.instantiate() # On ajoue les scènes essentielles à la scène principale - add_child(boat_instance) - add_child(player_instance) + #add_child(boat_instance) + #add_child(player_instance) # Et on assigne le bateau au joueur - player_instance.boat = boat_instance + #player_instance.boat = boat_instance diff --git a/scripts/player.gd b/scripts/player.gd index f73eb92..3025bbe 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -8,6 +8,8 @@ var relative_position_on_boat = Vector2(0, 0) var is_on_boat = true var last_boat_rotation = 0.0 +signal is_dead + func _ready(): if boat: relative_position_on_boat = position - boat.position @@ -38,6 +40,7 @@ func _physics_process(_delta): last_boat_rotation = boat.rotation else: + emit_signal("is_dead") # Pour l'instant, hors du bateau, le joueur nage 4 * moins vite qu'il ne court velocity.x = Input.get_axis("ui_left", "ui_right") * SPEED / 4 velocity.y = Input.get_axis("ui_up", "ui_down") * SPEED / 4 @@ -50,21 +53,27 @@ func _physics_process(_delta): var debug_positions = [] func get_on_boat(): - var node_pos = boat.to_local(position) - var tile_size = 128.0 - - for x in range(boat.tiles.size()): - for y in range(boat.tiles[x].size()): - var tile = boat.tiles[x][y] - if tile: - var tile_pos = tile.global_position - var relative_tile_pos = tile_pos - boat.global_position - relative_tile_pos = relative_tile_pos.rotated(-boat.rotation) - - if ( - abs(relative_tile_pos.x) <= tile_size / 2 and - abs(relative_tile_pos.y) <= tile_size / 2 - ): - return true - + + for area in $Area2D.get_overlapping_areas(): + if area in boat.get_children(): + return true return false + + #var node_pos = boat.to_local(position) + #var tile_size = 128.0 +# + #for x in range(boat.tiles.size()): + #for y in range(boat.tiles[x].size()): + #var tile = boat.tiles[x][y] + #if tile: + #var tile_pos = tile.global_position + #var relative_tile_pos = tile_pos - boat.global_position + #relative_tile_pos = relative_tile_pos.rotated(-boat.rotation) +# + #if ( + #abs(relative_tile_pos.x) <= tile_size / 2 and + #abs(relative_tile_pos.y) <= tile_size / 2 + #): + #return true +# + #return false