feat: change boat collision and improve overall code

This commit is contained in:
2025-03-22 20:43:05 +01:00
parent d0ad5f4fe5
commit ac556e3715
9 changed files with 108 additions and 91 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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