BoatCoop/scripts/player.gd

71 lines
2.1 KiB
GDScript

extends CharacterBody2D
const SPEED = 300.0
@export var boat: Node2D
const TILE_SIZE = 128
var relative_position_on_boat = Vector2(0, 0)
var is_on_boat = true
var last_boat_rotation = 0.0
func _ready():
if boat:
relative_position_on_boat = position - boat.position
last_boat_rotation = boat.rotation
func _physics_process(_delta):
# Tourner le joueur vers la souris
var mouse_position = get_global_mouse_position()
look_at(mouse_position)
if boat:
is_on_boat = get_on_boat()
if is_on_boat:
# Calculer la diff de rotation entre deux appels
var delta_rotation = boat.rotation - last_boat_rotation
# Ajuster la position du joueur en fonvtion de la rotation du bateau
relative_position_on_boat = relative_position_on_boat.rotated(delta_rotation)
position = boat.position + relative_position_on_boat # Set player position relative to the boat's position
# On autorise le joueur à bouger lorsqu'il est sur le bateau
velocity.x = Input.get_axis("ui_left", "ui_right") * SPEED
velocity.y = Input.get_axis("ui_up", "ui_down") * SPEED
move_and_slide()
# Mettre à jour la position relative
relative_position_on_boat = position - boat.position
last_boat_rotation = boat.rotation
else:
# 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
move_and_slide()
# Mettre à jour la position relative meme hors du bateau
relative_position_on_boat = position - boat.position
last_boat_rotation = boat.rotation
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
return false