mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-10-30 19:29:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
| class_name SpikeBall
 | |
| extends CharacterBody2D
 | |
| 
 | |
| var can_gravity := false
 | |
| const SPIKE_BALL_DESTRUCTION_PARTICLES = preload("uid://bk0arhpyyila6")
 | |
| func _physics_process(delta: float) -> void:
 | |
| 	handle_movement(delta)
 | |
| 	$Sprite.rotation_degrees += velocity.x * delta * 8
 | |
| 	handle_block_collision()
 | |
| 
 | |
| func handle_movement(delta: float) -> void:
 | |
| 	if can_gravity:
 | |
| 		velocity.y += (Global.entity_gravity / delta) * delta
 | |
| 	if is_on_floor():
 | |
| 		can_gravity = true
 | |
| 		velocity.x += get_floor_normal().x * 4
 | |
| 	if is_on_wall():
 | |
| 		destroy()
 | |
| 	if sign(get_floor_normal().x) != sign(velocity.x) and abs(get_floor_normal().x) > 0.2 and is_on_floor():
 | |
| 		velocity.y = (velocity.length() * get_floor_normal().y) + Global.entity_gravity
 | |
| 	move_and_slide()
 | |
| 
 | |
| func destroy() -> void:
 | |
| 	summon_particles()
 | |
| 	AudioManager.play_sfx("block_break", global_position)
 | |
| 	queue_free()
 | |
| 
 | |
| func handle_block_collision() -> void:
 | |
| 	for i in $Hitbox.get_overlapping_bodies():
 | |
| 		if i is Block:
 | |
| 			if global_position.y - 8 < i.global_position.y:
 | |
| 				i.shell_block_hit.emit(null)
 | |
| 
 | |
| func summon_particles() -> void:
 | |
| 	var particles = SPIKE_BALL_DESTRUCTION_PARTICLES.instantiate()
 | |
| 	particles.global_position = global_position
 | |
| 	add_sibling(particles)
 | |
| 
 | |
| func on_area_entered(area: Area2D) -> void:
 | |
| 	if area.owner is SpikeBall and area.owner != self:
 | |
| 		destroy()
 | |
| 	if area.owner is Enemy:
 | |
| 		if area.owner.has_node("ShellDetection"):
 | |
| 			area.owner.die_from_object(self)
 | |
| 	elif area.owner is Player:
 | |
| 		if area.owner.is_invincible or area.name == "HammerHitbox":
 | |
| 			destroy()
 | |
| 		else:
 | |
| 			area.owner.damage()
 | 
