75 lines
2.2 KiB
GDScript3
75 lines
2.2 KiB
GDScript3
|
|
extends Control
|
||
|
|
|
||
|
|
|
||
|
|
@export var planet_type: GlobalVariables.planets:
|
||
|
|
get:
|
||
|
|
return $planet_body.planet_type
|
||
|
|
set(value):
|
||
|
|
$planet_body.planet_type = value
|
||
|
|
@export var level_id: String:
|
||
|
|
get:
|
||
|
|
return $planet_body.level_id
|
||
|
|
set(value):
|
||
|
|
$planet_body.level_id = value
|
||
|
|
$level_name_text.text = value
|
||
|
|
@export var planet_speed = 100
|
||
|
|
@export var clockwise = true
|
||
|
|
|
||
|
|
# for collectible rotating
|
||
|
|
var rotation_speed_in_deg = 30
|
||
|
|
@export var collectibl_radius_margin = 40
|
||
|
|
var collectible_radius = 100
|
||
|
|
var collectable: PackedScene = preload("res://collectibles/collectible-icon.tscn")
|
||
|
|
var current_base_position_deg = 0
|
||
|
|
var collectable_list = []
|
||
|
|
|
||
|
|
func scale_locations(planet_radius):
|
||
|
|
$level_name_text.position[1] = planet_radius + 20
|
||
|
|
collectible_radius = planet_radius + collectibl_radius_margin
|
||
|
|
update_collectable_positions(0)
|
||
|
|
|
||
|
|
func _ready():
|
||
|
|
var number_collectibles = sum_array(GlobalVariables.collectibles[level_id])
|
||
|
|
for i in range (number_collectibles):
|
||
|
|
var base_degree = 360 * float(i)/number_collectibles
|
||
|
|
spawn_collectable(base_degree)
|
||
|
|
|
||
|
|
func sum_array(arr: Array) -> float:
|
||
|
|
var total = 0
|
||
|
|
for value in arr:
|
||
|
|
total += value
|
||
|
|
return floor(total)
|
||
|
|
|
||
|
|
func spawn_collectable(start_position_in_deg):
|
||
|
|
print("Spawning collectible at position " + str(start_position_in_deg) + " plus " + str(current_base_position_deg))
|
||
|
|
|
||
|
|
# Create instance
|
||
|
|
var collectable_instance = collectable.instantiate()
|
||
|
|
|
||
|
|
# Create a vector pointing to the right with length equal to collectible_radius
|
||
|
|
var offset = Vector2(collectible_radius, 0)
|
||
|
|
|
||
|
|
# Rotate it to the desired starting angle
|
||
|
|
var start_angle_rad = deg_to_rad(current_base_position_deg + start_position_in_deg)
|
||
|
|
offset = offset.rotated(start_angle_rad)
|
||
|
|
|
||
|
|
# Set position relative to the center
|
||
|
|
collectable_instance.position = offset
|
||
|
|
|
||
|
|
# Add to scene tree and list
|
||
|
|
add_child(collectable_instance)
|
||
|
|
collectable_list.append(collectable_instance)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
func _physics_process(delta: float) -> void:
|
||
|
|
update_collectable_positions(delta)
|
||
|
|
|
||
|
|
func update_collectable_positions(delta: float):
|
||
|
|
# Convert rotation speed to radians per frame
|
||
|
|
var angular_speed_rad = deg_to_rad(rotation_speed_in_deg) * delta
|
||
|
|
current_base_position_deg += rotation_speed_in_deg * delta
|
||
|
|
|
||
|
|
for i in collectable_list:
|
||
|
|
i.position = i.position.rotated(angular_speed_rad)
|