Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | AshTheKindra |
So I’m trying to make a 2D platformer that plays like Super Meat Boy and I have done fairly well wen it comes to movement except for wall jumping. I tried following several tutorials but none of them really helped. So I was able to get a wall slide to work, but I’m still not able to jump off of said wall. Any kind of help is appreciated. Here is my code:
extends Actor
const TYPE = ("Beepo")
const types = ("Beepo")
const Wall_Slide_Acceleration = 10
const Max_Wall_Slide_Speed = 120
const Max_Speed = 575
var facing_right = true
var on_ground = false
var can_jump = false
var jump_was_pressed = false
onready var sprite = $AnimatedSprite
func _on_Saw_Blade_Detector_body_entered(body: PhysicsBody2D) -> void:
queue_free()
get_tree().reload_current_scene()
func _physics_process(delta: float) -> void:
if Input.is_action_pressed("move_right"):
$AnimatedSprite.play("Run")
elif Input.is_action_pressed("move_left"):
$AnimatedSprite.play("Run")
else:
if on_ground == true:
$AnimatedSprite.play("Idle")
var is_jump_interrupted = Input.is_action_just_released("jump") and velocity.y < 0.0
var direction: = get_direction()
velocity = calculate_move_velocity(velocity, direction, speed, is_jump_interrupted)
velocity = move_and_slide(velocity, FLOOR_NORMAL)
if Input.is_action_pressed("jump"):
if can_jump == true:
if is_on_wall() && Input.is_action_pressed("move_right"):
velocity.x = Max_Speed
elif is_on_wall() && Input.is_action_pressed("move_left"):
velocity.x = -Max_Speed
if is_on_floor():
on_ground = true
else:
on_ground = false
if velocity.y < 0:
$AnimatedSprite.play("Jump")
else:
$AnimatedSprite.play("Fall")
if facing_right and velocity.x < 0:
flip()
if !facing_right and velocity.x > 0:
flip()
if is_on_wall() && (Input.is_action_pressed("move_right") || Input.is_action_pressed("move_left")):
can_jump = true
if velocity.y >= 0:
velocity.y = min(velocity.y + Wall_Slide_Acceleration, Max_Wall_Slide_Speed)
$AnimatedSprite.play("Wall Slide")
else:
velocity.y += gravity
if !is_on_floor() && is_on_wall():
pass
func flip():
facing_right = !facing_right
sprite.flip_h = !sprite.flip_h
func get_direction() -> Vector2:
return Vector2(
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
-1.0 if Input.is_action_just_pressed("jump") and is_on_floor() else 1.0
)
func calculate_move_velocity(
linear_velocity: Vector2,
direction: Vector2,
speed : Vector2,
is_jump_interrupted: bool
) -> Vector2:
var velolin: = linear_velocity
velolin.x = speed.x * direction.x
velolin.y += gravity * get_physics_process_delta_time()
if direction.y == -1.0:
velolin.y = speed.y * direction.y
if is_jump_interrupted:
velolin.y = 0.0
return velolin
I’d recommend to change your player movement into a state machine because it is becoming more complex and any attempt to add features will result in more bugs.
After that , it is easy to implement the wall jump by simply changing the player’s state
Mrpaolosarino | 2021-07-06 06:57
Maybe this Game Endeavor video on wall jumping will help?
Ertain | 2021-07-06 09:37