From 3e12c386c2f40e818160a956a2b2856a300c799f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Thu, 21 Aug 2025 10:59:50 +0200 Subject: [PATCH] game: use shader instead of sprite for xp orbs --- assets/shaders/xp_orb.gdshader | 24 ++++++++++++++++++++++++ assets/shaders/xp_orb.gdshader.uid | 1 + scenes/xp_orb.tscn | 24 +++++++++++++++++++----- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 assets/shaders/xp_orb.gdshader create mode 100644 assets/shaders/xp_orb.gdshader.uid diff --git a/assets/shaders/xp_orb.gdshader b/assets/shaders/xp_orb.gdshader new file mode 100644 index 0000000..5b02af5 --- /dev/null +++ b/assets/shaders/xp_orb.gdshader @@ -0,0 +1,24 @@ +shader_type canvas_item; + +uniform vec4 orb_color : source_color = vec4(0.2, 1.0, 0.5, 1.0); // base orb color +uniform float glow_strength : hint_range(0.0, 2.0) = 1.2; +uniform float pulse_speed : hint_range(0.0, 10.0) = 2.0; + +void fragment() { + // Centered UV (0,0 in middle, -1..1 range) + vec2 uv = (UV - vec2(0.5)) * 2.0; + float dist = length(uv); + + // Soft circular mask + float circle = smoothstep(0.8, 0.0, dist); + + // Glow falloff + float glow = smoothstep(0.5, 0.0, dist) * glow_strength; + + // Pulsing + float pulse = 0.5 + 0.5 * sin(TIME * pulse_speed); + + vec3 color = orb_color.rgb * (circle + glow * pulse); + + COLOR = vec4(color, circle); // alpha fades at edges +} diff --git a/assets/shaders/xp_orb.gdshader.uid b/assets/shaders/xp_orb.gdshader.uid new file mode 100644 index 0000000..befc454 --- /dev/null +++ b/assets/shaders/xp_orb.gdshader.uid @@ -0,0 +1 @@ +uid://ckjyt0mt0ngk diff --git a/scenes/xp_orb.tscn b/scenes/xp_orb.tscn index d809d3f..6bd7e29 100644 --- a/scenes/xp_orb.tscn +++ b/scenes/xp_orb.tscn @@ -1,17 +1,31 @@ -[gd_scene load_steps=4 format=3 uid="uid://du4dqne3o0d5b"] +[gd_scene load_steps=7 format=3 uid="uid://du4dqne3o0d5b"] [ext_resource type="Script" uid="uid://bx43us4qd2vpf" path="res://scenes/xp_orb.gd" id="1_me6n8"] -[ext_resource type="Texture2D" uid="uid://c0g255217x10l" path="res://assets/sprites/xp_orb_small.png" id="2_me6n8"] +[ext_resource type="Shader" uid="uid://ckjyt0mt0ngk" path="res://assets/shaders/xp_orb.gdshader" id="2_me6n8"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_pkphv"] +shader = ExtResource("2_me6n8") +shader_parameter/orb_color = Color(0.2, 1, 0.5, 1) +shader_parameter/glow_strength = 1.0 +shader_parameter/pulse_speed = 2.0 + +[sub_resource type="Gradient" id="Gradient_me6n8"] +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_hluwh"] +gradient = SubResource("Gradient_me6n8") +width = 12 +height = 12 [sub_resource type="CircleShape2D" id="CircleShape2D_me6n8"] -radius = 5.0 +radius = 4.0 [node name="XPOrb" type="Node2D" groups=["pickup", "xp_orb"]] script = ExtResource("1_me6n8") [node name="Sprite2D" type="Sprite2D" parent="."] -position = Vector2(-1, 1) -texture = ExtResource("2_me6n8") +material = SubResource("ShaderMaterial_pkphv") +texture = SubResource("GradientTexture2D_hluwh") [node name="Area2D" type="Area2D" parent="."] collision_layer = 9