OpticTraveler/Florian/Player/cool_camera.gd

108 lines
3.2 KiB
GDScript3
Raw Normal View History

extends Node3D
2025-09-18 20:01:22 +02:00
#@onready var label: Label = $Control/Label
@export var player : PlayerRB = null
2025-09-18 20:01:22 +02:00
@onready var flash_camera: AudioStreamPlayer = $"Flash-camera"
func _input(event: InputEvent) -> void:
if event.is_action_pressed("take_picture"):
_take_picture()
func _take_picture():
2025-09-18 20:01:22 +02:00
flash_camera.play()
_calculate_points()
2025-09-18 20:01:22 +02:00
await get_tree().create_timer(0.1).timeout
PictureTakeablesArray.calcualtion_finished.emit()
pass
var points_string = ""
var total_points = 0
var total_points_multipliers = 1
func _calculate_points():
points_string = ""
total_points = 0
total_points_multipliers = 1
print("Taking Picture!!!")
_calculate_picture_objects()
_calculate_picture_spots()
2025-09-18 20:01:22 +02:00
PictureTakeablesArray.points = total_points
#label.text = "%s\nTotal points: %d x %.2f = %.2f" % [points_string, total_points, total_points_multipliers, total_points * total_points_multipliers]
2025-09-17 18:36:54 +02:00
var acceptable_length = 1
2025-09-17 17:13:49 +02:00
func _calculate_picture_objects():
var duplicates: Dictionary = {}
for takeable in PictureTakeablesArray.picture_takables:
if not takeable:
continue
2025-09-17 17:13:49 +02:00
#print("Checking takeable")
if takeable.picture_taken():
2025-09-17 17:13:49 +02:00
var raycast = RayCast3D.new()
raycast.top_level = true
add_child(raycast)
raycast.global_position = get_viewport().get_camera_3d().global_position
raycast.target_position = takeable.global_position - self.global_position
raycast.force_raycast_update()
raycast.collide_with_bodies = true
raycast.debug_shape_thickness = 2
if raycast.is_colliding():
#print("raycast hit")
2025-09-17 17:13:49 +02:00
var raycast_hit = raycast.get_collision_point()
#print(str((raycast_hit - takeable.global_position).length()))
2025-09-17 18:36:54 +02:00
if (raycast_hit - takeable.global_position).length() > acceptable_length:
#print("Not in range!")
2025-09-17 17:13:49 +02:00
raycast.queue_free()
continue
raycast.queue_free()
2025-09-16 18:28:52 +02:00
var points = takeable.points_worth
2025-09-18 20:01:22 +02:00
var label = Label3D.new()
label.billboard = BaseMaterial3D.BILLBOARD_ENABLED
label.fixed_size = true
2025-09-19 12:32:22 +02:00
label.top_level = true
2025-09-19 14:48:09 +02:00
label.no_depth_test = true
2025-09-19 12:32:22 +02:00
label.global_position = takeable.global_position
2025-09-18 20:01:22 +02:00
label.font_size = 100
label.pixel_size = 0.001
if duplicates.get(takeable.points_name):
2025-09-18 16:54:50 +02:00
points = int(points * 0.2)
2025-09-18 20:01:22 +02:00
#points_string += "Duplicate: {name} {points}\n".format(
# {"name" : takeable.points_name, "points": points}
# )
else:
duplicates[takeable.points_name] = true
2025-09-18 20:01:22 +02:00
label.font_size = 150
label.modulate = "#ffff00"
#points_string += "{name} {points}\n".format(
# {"name" : takeable.points_name, "points": points}
# )
if takeable.points_multiplier != 1:
label.text = "{points} + X{mult}".format(
{"points": points, "mult":takeable.points_multiplier}
)
else:
label.text = "{points}".format(
{"points": points}
)
takeable.add_child(label)
label.position += Vector3(0, 1, 0)
total_points += points
total_points_multipliers *= takeable.points_multiplier
2025-09-19 14:48:09 +02:00
#takeable.show_red_cicle()
func _calculate_picture_spots():
for spot in PictureTakeablesArray.picture_spots:
if not spot:
return
if spot.picture_taken(player):
points_string += "{name} {points}\n".format(
{"name" : spot.points_name, "points": spot.points_worth}
)
total_points += spot.points_worth
total_points_multipliers *= spot.points_multiplier