You can now grab obstacles

main
Ervan Lefevre 2 years ago
parent e1855c4719
commit f2aa44de97
  1. 14
      nodes/obstacle/obstacle.gd
  2. 6
      nodes/obstacle/obstacle.tscn
  3. 68
      nodes/player/player.gd
  4. 3
      nodes/player/player.tscn
  5. 38
      project.godot
  6. 15
      scenes/poc.tscn

@ -0,0 +1,14 @@
extends RigidBody2D
class_name Obstacle
@onready var original_parent = get_parent()
func grabbed(by):
$shape.disabled = true
gravity_scale = 0
reparent(by)
func dropped():
$shape.disabled = false
gravity_scale = 1
reparent(original_parent)

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://clclsblongqty"]
[ext_resource type="Script" path="res://nodes/obstacle/obstacle.gd" id="1_g75rs"]
[node name="obstacle" type="RigidBody2D" groups=["obstacle"]]
script = ExtResource("1_g75rs")

@ -6,12 +6,12 @@ const SPEED = 100.0
const JUMP_VELOCITY = 200.0
const STATES= [
"spawn",
"idle",
"walk",
"climb",
"die",
"idle",
"jump",
"die"
"spawn",
"walk"
]
var use_gravity = {
@ -23,9 +23,23 @@ var use_gravity = {
"walk": true
}
var can_grab_obstacles = {
"climb": false,
"die": false,
"idle": true,
"jump": false,
"spawn": false,
"walk": true
}
@onready var grab_ray = get_node('grab_ray')
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var grabbed_obstacle = null
func _ready():
$fsm.set_states(STATES)
add_to_group("player")
@ -37,18 +51,18 @@ func on_enter_idle_state():
pass
func idle_state(_delta):
var direction = Input.get_axis("ui_left", "ui_right")
var direction = Input.get_axis("player_left", "player_right")
if is_on_floor():
velocity.x = 0
if direction:
$fsm.set_next_state("walk")
elif Input.is_action_just_pressed("ui_accept") and is_on_floor():
elif Input.is_action_just_pressed("player_jump") and is_on_floor():
$fsm.set_next_state("jump")
func walk_state(_delta):
var direction = Input.get_axis("ui_left", "ui_right")
var direction = Input.get_axis("player_left", "player_right")
if direction != 0:
velocity.x = direction * SPEED
@ -56,10 +70,10 @@ func walk_state(_delta):
velocity.x = 0
$fsm.set_next_state("idle")
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
if Input.is_action_just_pressed("player_jump") and is_on_floor():
$fsm.set_next_state("jump")
if is_on_wall() or (Input.is_action_pressed('ui_up') && is_on_ceiling()):
if is_on_wall() or (Input.is_action_pressed('player_up') && is_on_ceiling()):
velocity.y = 0
$fsm.set_next_state("climb")
@ -68,7 +82,7 @@ func on_enter_jump_state():
velocity.y = -JUMP_VELOCITY
func jump_state(_delta):
var direction = Input.get_axis("ui_left", "ui_right")
var direction = Input.get_axis("player_left", "player_right")
if(direction):
velocity.x = move_toward(velocity.x, direction * SPEED, SPEED)
@ -80,7 +94,7 @@ func jump_state(_delta):
velocity.x = 0
$fsm.set_next_state("idle")
if is_on_wall() || (is_on_ceiling() and Input.is_action_pressed("ui_up")):
if is_on_wall() || (is_on_ceiling() and Input.is_action_pressed("player_up")):
$fsm.set_next_state("climb")
func on_enter_climb_state():
@ -92,20 +106,20 @@ func on_exit_climb_state():
func climb_state(_delta):
if is_on_wall():
var direction = Input.get_axis("ui_up", "ui_down")
var direction = Input.get_axis("player_up", "player_down")
velocity = Vector2(0, direction * SPEED)
if is_on_ceiling():
var direction = Input.get_axis("ui_left", "ui_right")
var direction = Input.get_axis("player_left", "player_right")
velocity = Vector2(direction * SPEED, 0)
if Input.is_action_just_pressed("ui_accept") and is_on_wall():
if Input.is_action_just_pressed("player_jump") and is_on_wall():
var wall_position = get_slide_collision(0).get_normal().x
var jump_normal = Vector2(wall_position, -0.5).normalized()
velocity = jump_normal * JUMP_VELOCITY
$fsm.set_next_state("jump")
if is_on_ceiling() && Input.is_action_just_pressed("ui_down"):
if is_on_ceiling() && Input.is_action_just_pressed("player_down"):
velocity.y = 0
$fsm.set_next_state("idle")
@ -119,6 +133,30 @@ func after_state(delta):
if use_gravity[$fsm.current_state] == true:
velocity.y += gravity * delta
if can_grab_obstacles[$fsm.current_state] == true:
handle_grab()
func handle_grab():
if Input.is_action_just_pressed('player_action'):
if grabbed_obstacle == null:
var collision = grab_ray.get_collider()
print('collision', collision)
if collision:
var obstacle = collision
print('obstacle', obstacle)
if obstacle.is_in_group("obstacle"):
do_grab(obstacle)
else:
drop_obstacle()
func do_grab(obstacle):
grabbed_obstacle = obstacle
obstacle.grabbed(self)
func drop_obstacle():
grabbed_obstacle.dropped()
grabbed_obstacle = null
func die():
$fsm.set_next_state("die")

@ -25,3 +25,6 @@ metadata/_edit_group_ = true
[node name="camera" type="Camera2D" parent="."]
zoom = Vector2(5, 5)
[node name="grab_ray" type="RayCast2D" parent="."]
target_position = Vector2(24, 0)

@ -23,6 +23,44 @@ window/size/mode=2
window/size/initial_screen=1
window/stretch/mode="viewport"
[input]
player_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":113,"echo":false,"script":null)
]
}
player_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
player_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":122,"echo":false,"script":null)
]
}
player_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
player_action={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
player_jump={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)
]
}
[rendering]
renderer/rendering_method="gl_compatibility"

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save