71 lines
2.1 KiB
GDScript
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
|