From c96994ee88b3992a25938cc7d2947776d417baa9 Mon Sep 17 00:00:00 2001 From: Thomas Lavocat Date: Sat, 29 Apr 2023 15:43:02 +0200 Subject: [PATCH] =?UTF-8?q?coleaumur:=20d=C3=A9tecte=20la=20plateforme=20a?= =?UTF-8?q?vec=20un=20RayCast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uniquement se reposer sur is_on_wall() ne fonctionne pas, car move_and_slide() parfois ne nous indique pas qu'une collision avec un mur a eu lieu. ça doit être à cause d'un pixel de décalage ou un truc du genre. Pour palier au soucis, j'utilise deux RayCast, un à gauche et un à droite. si ils sont trigger, alors ça veut dire qu'un mur est dans le coin. Ils sont uniquement sensibles aux plateformes. Voilà voilà, maintenant s'accrocher au mur ne nécessite plus de maintenir la touche de direction dans le bon sens. --- princesse.gd | 12 ++++++++---- princesse.tscn | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/princesse.gd b/princesse.gd index 13f2df2..312fa33 100644 --- a/princesse.gd +++ b/princesse.gd @@ -5,7 +5,8 @@ extends CharacterBody2D @export var action_suffix := "" var gravity: int = ProjectSettings.get("physics/2d/default_gravity") -@onready var platform_detector := $PlatformDetector as RayCast2D +@onready var wall_detect_left := $wall_detect_left as RayCast2D +@onready var wall_detect_right := $wall_detect_right as RayCast2D @onready var animation := $AnimatedSprite2D as AnimatedSprite2D @onready var camera := $Camera2D as Camera2D var _double_jump_charged := false @@ -165,7 +166,7 @@ func end_jump(): jump_key_counter = 0 func _physics_process(delta: float) -> void: - pressing_wall = is_on_wall_only() + pressing_wall = wall_detect_left.is_colliding() or wall_detect_right.is_colliding() grab_wall = pressing_wall and Input.is_action_pressed("grab" + action_suffix) if Input.is_action_just_pressed("jump" + action_suffix): @@ -210,8 +211,11 @@ func _physics_process(delta: float) -> void: else: animation.scale.x = -1.0 - if grab_wall and not jumping: - animation.scale.x *= -1 + if grab_wall: + if wall_detect_left.is_colliding(): + animation.scale.x = 1 + elif wall_detect_right.is_colliding(): + animation.scale.x = -1 #floor_stop_on_slope = not platform_detector.is_colliding() var collision = move_and_slide() diff --git a/princesse.tscn b/princesse.tscn index 89f8c4a..450a686 100644 --- a/princesse.tscn +++ b/princesse.tscn @@ -208,11 +208,11 @@ WALK_INCR_AIR = 6 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] sprite_frames = SubResource("SpriteFrames_q52wx") -animation = &"walk" -frame_progress = 0.153163 +animation = &"idle" -[node name="PlatformDetector" type="RayCast2D" parent="."] -collision_mask = 8 +[node name="wall_detect_left" type="RayCast2D" parent="."] +target_position = Vector2(-10, 0) +collision_mask = 16 [node name="Camera2D" type="Camera2D" parent="."] zoom = Vector2(2, 2) @@ -220,3 +220,7 @@ zoom = Vector2(2, 2) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2(2, 0) shape = SubResource("CapsuleShape2D_6r7th") + +[node name="wall_detect_right" type="RayCast2D" parent="."] +target_position = Vector2(14, 0) +collision_mask = 16