| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- class_name NoteBlock
- extends Block
- var bodies: Array[CharacterBody2D] = []
- signal bounced
- var animating := false
- @export var play_sfx := true
- func bounce_up() -> void:
- if bouncing or animating:
- return
- bounced.emit()
- bouncing = true
- animating = true
- %Animations.play("BounceUp")
- dispense_item(-1)
- await %Animations.animation_finished
- bouncing = false
- animating = false
- func _physics_process(_delta: float) -> void:
- for i in %Area.get_overlapping_areas():
- if i.owner is CharacterBody2D:
- bounce_down(i.owner)
- func bounce_down(body: PhysicsBody2D) -> void:
- if bouncing or animating:
- return
- animating = true
- bounced.emit()
- if play_sfx:
- AudioManager.play_sfx("note_block", global_position)
- bodies.append(body)
- if body is Player:
- body.normal_state.jump_queued = false
- body.spring_bouncing = true
- %Animations.play("BounceDown")
- dispense_item(1)
- await %Animations.animation_finished
- animating = false
- bouncing = false
- func bounce_bodies() -> void:
- for i in bodies:
- if i is Player:
- i.spring_bouncing = false
- if Global.player_action_pressed("jump", i.player_id):
- i.jump_cancelled = false
- i.has_jumped = true
- i.velocity.y = -350
- i.gravity = i.JUMP_GRAVITY
- else:
- i.velocity.y = -300
- i.gravity = i.FALL_GRAVITY
- else:
- i.velocity.y = -200
- if i is Thwomp:
- i.velocity = Vector2.ZERO
- bodies.clear()
- func dispense_item(direction := -1) -> void:
- if item == null or item_amount <= 0:
- return
- item_amount -= 1
- var node = item.instantiate()
- node.global_position = global_position + Vector2(0, 8 * direction)
- node.set("velocity", Vector2(0, (100 if direction == 1 else -150)))
- add_sibling(node)
- AudioManager.play_sfx("item_appear", global_position)
|