feat: thwomp indicator shader + code, portal art
This commit is contained in:
parent
6fab67bdec
commit
bb13843578
BIN
assets/Sprite-0001.png
Normal file
BIN
assets/Sprite-0001.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 325 B |
35
assets/Sprite-0001.png.import
Normal file
35
assets/Sprite-0001.png.import
Normal file
@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/Sprite-0001.png-301f2c522e57282b7df856433eb0ee72.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/Sprite-0001.png"
|
||||
dest_files=[ "res://.import/Sprite-0001.png-301f2c522e57282b7df856433eb0ee72.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_mode=0
|
||||
compress/bptc_ldr=0
|
||||
compress/normal_map=0
|
||||
flags/repeat=0
|
||||
flags/filter=false
|
||||
flags/mipmaps=false
|
||||
flags/anisotropic=false
|
||||
flags/srgb=2
|
||||
process/fix_alpha_border=false
|
||||
process/premult_alpha=false
|
||||
process/HDR_as_SRGB=false
|
||||
process/invert_color=false
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=false
|
||||
svg/scale=1.0
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 1.4 KiB |
@ -4385,7 +4385,7 @@ texture = SubResource( 62 )
|
||||
offset = Vector2( 1, 0 )
|
||||
hframes = 6
|
||||
vframes = 6
|
||||
frame = 8
|
||||
frame = 6
|
||||
__meta__ = {
|
||||
"_editor_description_": "YXNlcHJpdGVfd2l6YXJkX2NvbmZpZwpwbGF5ZXJ8PUJsb2JieVNwcml0ZS9CbG9iYnltYXRpb25QbGF5ZXIKc291cmNlfD1yZXM6Ly9hc3NldHMvYmxvYmJ5L2Jsb2JieS1zcHJpdGVzaGVldHQuYXNlcHJpdGUKbGF5ZXJ8PUJsb2JieQpvcF9leHB8PUZhbHNlCm9fZm9sZGVyfD0Kb19uYW1lfD0Kb25seV92aXNpYmxlfD1GYWxzZQpvX2V4X3B8PQo="
|
||||
}
|
||||
@ -4572,5 +4572,5 @@ one_shot = true
|
||||
[connection signal="got_grounded" from="BlobbyStateMachine" to="." method="_on_Blobby_got_grounded"]
|
||||
[connection signal="timeout" from="BlobbyStateMachine/JumpBufferTimer" to="BlobbyStateMachine" method="_on_JumpBufferTimer_timeout"]
|
||||
[connection signal="timeout" from="InvincibilityTimer" to="." method="_on_InvincibilityTimer_timeout"]
|
||||
[connection signal="timeout" from="PitfallTimer" to="." method="_on_PitfallTimer_timeout"]
|
||||
[connection signal="timeout" from="PitfallTimer" to="." method="die_for_real" binds= [ -1 ]]
|
||||
[connection signal="timeout" from="PitfallTimer" to="." method="_on_PitfallTimer_timeout"]
|
||||
|
||||
@ -603,7 +603,6 @@ wait_time = 0.3
|
||||
one_shot = true
|
||||
|
||||
[node name="JumpCollisionBody" type="KinematicBody2D" parent="."]
|
||||
visible = false
|
||||
collision_layer = 0
|
||||
collision_mask = 8
|
||||
|
||||
|
||||
@ -1088,9 +1088,6 @@ unique_name_in_owner = true
|
||||
[node name="UserInterface" parent="." instance=ExtResource( 5 )]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Timer" parent="UserInterface/HUD/HUDOverlay/GetBackTimer" index="0"]
|
||||
wait_time = 20.0
|
||||
|
||||
[node name="TransitionLayer" type="CanvasLayer" parent="."]
|
||||
visible = false
|
||||
|
||||
|
||||
@ -1137,9 +1137,6 @@ size_flags_vertical = 3
|
||||
[node name="UserInterface" parent="." instance=ExtResource( 3 )]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Timer" parent="UserInterface/HUD/HUDOverlay/GetBackTimer" index="0"]
|
||||
wait_time = 20.0
|
||||
|
||||
[node name="BlobbyCam" parent="." instance=ExtResource( 6 )]
|
||||
unique_name_in_owner = true
|
||||
drag_margin_top = 0.1
|
||||
@ -1151,7 +1148,7 @@ position = Vector2( -156, -51 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 5
|
||||
frame = 6
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 6 )
|
||||
@ -1185,6 +1182,7 @@ format = 1
|
||||
|
||||
[node name="ElevatorButton" parent="." instance=ExtResource( 11 )]
|
||||
position = Vector2( 1440, -64 )
|
||||
elevator_time = 5
|
||||
|
||||
[node name="Portal" parent="ElevatorButton" instance=ExtResource( 7 )]
|
||||
position = Vector2( 112, -8 )
|
||||
|
||||
@ -227,9 +227,6 @@ size_flags_vertical = 3
|
||||
[node name="UserInterface" parent="." instance=ExtResource( 7 )]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Timer" parent="UserInterface/HUD/HUDOverlay/GetBackTimer" index="0"]
|
||||
wait_time = 20.0
|
||||
|
||||
[node name="BlobbyCam" parent="." instance=ExtResource( 13 )]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
@ -239,6 +236,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( -180, 113 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 6 )
|
||||
|
||||
|
||||
@ -116,9 +116,6 @@ size_flags_vertical = 3
|
||||
[node name="UserInterface" parent="." instance=ExtResource( 13 )]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Timer" parent="UserInterface/HUD/HUDOverlay/GetBackTimer" index="0"]
|
||||
wait_time = 20.0
|
||||
|
||||
[node name="BlobbyCam" parent="." instance=ExtResource( 5 )]
|
||||
unique_name_in_owner = true
|
||||
drag_margin_bottom = 0.3
|
||||
@ -128,6 +125,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( -70, 1 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 5
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 6 )
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -3,6 +3,7 @@ const PhysicsFunc = preload("res://src/Utilities/Physic/PhysicsFunc.gd")
|
||||
|
||||
#Array of RayCast2D
|
||||
onready var trigger_rays = $FlyingLaserCutterBody/Triggers.get_children()
|
||||
onready var trigger_ray_textures = $FlyingLaserCutterBody/TriggerTextures.get_children()
|
||||
onready var body = $FlyingLaserCutterBody
|
||||
onready var local_facing: Vector2 = Vector2.RIGHT
|
||||
onready var global_facing: Vector2 = local_facing.rotated(transform.get_rotation())
|
||||
@ -11,6 +12,9 @@ onready var slide_friction = 1.5
|
||||
var flyoff_triggered = false
|
||||
var has_hit_player = false
|
||||
var halted = false
|
||||
var returning = false
|
||||
var initial_distance : float = 1.0
|
||||
|
||||
export(float) var velocity = 1
|
||||
export(float) var max_velocity = 200
|
||||
export(float) var acceleration_force = 1200
|
||||
@ -18,39 +22,51 @@ export(float) var mass = 10
|
||||
export(bool) var avoid_crushing = false
|
||||
export(bool) var fast_retrigger = false
|
||||
|
||||
# TODO Returing Laser cutter has broken collision and infinite inertia
|
||||
# Maybe keep returning paths free and crush player when in the way
|
||||
|
||||
func _ready() -> void:
|
||||
$FlyingLaserCutterBody/Sprite/AnimationPlayer.play("default")
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
update_trigger_ray_shader()
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
|
||||
if !flyoff_triggered:
|
||||
for ray in trigger_rays:
|
||||
|
||||
# When player has been hit on the way
|
||||
if (has_hit_player && body.position.x > 0):
|
||||
break
|
||||
|
||||
if ray.is_colliding() && (body.position.x < 1 || fast_retrigger):
|
||||
var collider = ray.get_collider()
|
||||
if collider.is_in_group("player"):
|
||||
flyoff_triggered = true
|
||||
body.set("motion/sync_to_physics", false)
|
||||
break
|
||||
|
||||
if body.position.x > 0:
|
||||
if halted && avoid_crushing:
|
||||
return
|
||||
returning = true
|
||||
velocity=1
|
||||
body.position.x += (max_velocity/3)*-1*delta
|
||||
|
||||
else:
|
||||
returning = false
|
||||
|
||||
elif body.position.x == 0:
|
||||
has_hit_player = false
|
||||
|
||||
if flyoff_triggered:
|
||||
returning = false
|
||||
velocity = PhysicsFunc.two_step_euler(
|
||||
velocity, acceleration_force, mass, delta
|
||||
)
|
||||
velocity = clamp(velocity, 0, max_velocity)
|
||||
|
||||
var collision = body.move_and_collide(velocity*global_facing*delta,true)
|
||||
|
||||
if collision != null:
|
||||
if !collision.collider.is_in_group("player"):
|
||||
body.set("motion/sync_to_physics", true)
|
||||
@ -58,6 +74,30 @@ func _physics_process(delta: float) -> void:
|
||||
has_hit_player = true
|
||||
flyoff_triggered = false
|
||||
|
||||
func update_trigger_ray_shader() -> void:
|
||||
for i in trigger_rays.size():
|
||||
var raycast: RayCast2D = trigger_rays[i]
|
||||
var ray_texture: Sprite = trigger_ray_textures[i]
|
||||
var distance: float = (raycast.position + body.position).distance_to(to_local(raycast.get_collision_point()))
|
||||
ray_texture.material.set_shader_param("total_distance", distance)
|
||||
if initial_distance <= 1.0:
|
||||
initial_distance = distance
|
||||
if flyoff_triggered || returning:
|
||||
var factor : float = distance/initial_distance
|
||||
ray_texture.material.set_shader_param("wave1", 0)
|
||||
ray_texture.material.set_shader_param("wave2", 0)
|
||||
ray_texture.material.set_shader_param("wave3", 1)
|
||||
var constant_ray_color: Color = ray_texture.material.get_shader_param("wave3_color")
|
||||
constant_ray_color.a = 1.2 - 1.0 * factor
|
||||
ray_texture.material.set_shader_param("wave3_color", constant_ray_color)
|
||||
else:
|
||||
ray_texture.material.set_shader_param("wave1", 1)
|
||||
ray_texture.material.set_shader_param("wave2", 0)
|
||||
ray_texture.material.set_shader_param("wave3", 0)
|
||||
var constant_ray_color: Color = ray_texture.material.get_shader_param("wave3_color")
|
||||
constant_ray_color.a = 0.01
|
||||
ray_texture.material.set_shader_param("wave3_color", constant_ray_color)
|
||||
|
||||
|
||||
func _on_BackArea_body_entered(body: Node) -> void:
|
||||
if(body.is_in_group("player")):
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
[gd_scene load_steps=7 format=2]
|
||||
[gd_scene load_steps=11 format=2]
|
||||
|
||||
[ext_resource path="res://assets/contraption/FlyingLaserCutterShaded.png" type="Texture" id=1]
|
||||
[ext_resource path="res://src/Platforms/FlyingLaserCutter.gd" type="Script" id=2]
|
||||
[ext_resource path="res://src/Platforms/FlyingLaserCutterTriggerRayShader.gshader.gdshader" type="Shader" id=3]
|
||||
[ext_resource path="res://assets/Sprite-0001.png" type="Texture" id=4]
|
||||
|
||||
[sub_resource type="Animation" id=2]
|
||||
length = 2.4
|
||||
@ -28,10 +30,51 @@ extents = Vector2( 3.067, 10 )
|
||||
[sub_resource type="RectangleShape2D" id=5]
|
||||
extents = Vector2( 0.5, 11 )
|
||||
|
||||
[sub_resource type="ShaderMaterial" id=6]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource( 3 )
|
||||
shader_param/bits = 1.0
|
||||
shader_param/pixel_offset = 0.0
|
||||
shader_param/total_distance = 100.0
|
||||
shader_param/wave1 = 1.0
|
||||
shader_param/wave2 = 0.0
|
||||
shader_param/wave3 = 0.0
|
||||
shader_param/wave1_color = Color( 1, 1, 1, 0.764706 )
|
||||
shader_param/wave2_color = Color( 0.945098, 0.392157, 0.121569, 0.141176 )
|
||||
shader_param/wave3_color = Color( 0.945098, 0.392157, 0.121569, 1 )
|
||||
shader_param/wave_frequency = 0.231
|
||||
shader_param/wave_amplitude = 0.041
|
||||
shader_param/wave_offset = 0.5
|
||||
shader_param/traveling = 1.0
|
||||
shader_param/travel_speed = -0.618
|
||||
shader_param/oscilating = 1.0
|
||||
shader_param/oscilation_speed = 0.2
|
||||
|
||||
[sub_resource type="ShaderMaterial" id=7]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource( 3 )
|
||||
shader_param/bits = 1.0
|
||||
shader_param/pixel_offset = 0.0
|
||||
shader_param/total_distance = 100.0
|
||||
shader_param/wave1 = 1.0
|
||||
shader_param/wave2 = 0.0
|
||||
shader_param/wave3 = 0.0
|
||||
shader_param/wave1_color = Color( 1, 1, 1, 0.764706 )
|
||||
shader_param/wave2_color = Color( 0.945098, 0.392157, 0.121569, 0.176471 )
|
||||
shader_param/wave3_color = Color( 0.945098, 0.392157, 0.121569, 1 )
|
||||
shader_param/wave_frequency = 0.231
|
||||
shader_param/wave_amplitude = 0.041
|
||||
shader_param/wave_offset = 0.5
|
||||
shader_param/traveling = 1.0
|
||||
shader_param/travel_speed = -0.618
|
||||
shader_param/oscilating = 1.0
|
||||
shader_param/oscilation_speed = 0.2
|
||||
|
||||
[node name="FlyingLaserCutter" type="Node2D"]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="FlyingLaserCutterBody" type="KinematicBody2D" parent="."]
|
||||
position = Vector2( 4, 0 )
|
||||
collision_layer = 32
|
||||
collision_mask = 57
|
||||
collision/safe_margin = 0.001
|
||||
@ -41,7 +84,7 @@ motion/sync_to_physics = true
|
||||
texture = ExtResource( 1 )
|
||||
hframes = 5
|
||||
vframes = 5
|
||||
frame = 21
|
||||
frame = 4
|
||||
__meta__ = {
|
||||
"_editor_description_": "YXNlcHJpdGVfd2l6YXJkX2NvbmZpZwpwbGF5ZXJ8PUZseWluZ0xhc2VyQ3V0dGVyQm9keS9TcHJpdGUvQW5pbWF0aW9uUGxheWVyCnNvdXJjZXw9cmVzOi8vYXNzZXRzL2NvbnRyYXB0aW9uL0ZseWluZ0xhc2VyQ3V0dGVyLmFzZXByaXRlCmxheWVyfD0Kb3BfZXhwfD1GYWxzZQpvX2ZvbGRlcnw9Cm9fbmFtZXw9Cm9ubHlfdmlzaWJsZXw9RmFsc2UKb19leF9wfD0K"
|
||||
}
|
||||
@ -75,24 +118,42 @@ position = Vector2( -1, 0 )
|
||||
shape = SubResource( 5 )
|
||||
|
||||
[node name="Triggers" type="Node2D" parent="FlyingLaserCutterBody"]
|
||||
visible = false
|
||||
position = Vector2( 0, 0.0077219 )
|
||||
|
||||
[node name="RayCast2D" type="RayCast2D" parent="FlyingLaserCutterBody/Triggers"]
|
||||
position = Vector2( 3.92072e-12, 8.99337 )
|
||||
position = Vector2( 9, 9 )
|
||||
rotation = -1.5708
|
||||
scale = Vector2( 1, 1000 )
|
||||
scale = Vector2( 1, 5000 )
|
||||
enabled = true
|
||||
cast_to = Vector2( 0, 1 )
|
||||
collision_mask = 9
|
||||
|
||||
[node name="RayCast2D2" type="RayCast2D" parent="FlyingLaserCutterBody/Triggers"]
|
||||
position = Vector2( 0, -8.95621 )
|
||||
position = Vector2( 9, -9 )
|
||||
rotation = -1.5708
|
||||
scale = Vector2( 1, 1000 )
|
||||
scale = Vector2( 1, 5000 )
|
||||
enabled = true
|
||||
cast_to = Vector2( 0, 1 )
|
||||
collision_mask = 9
|
||||
|
||||
[node name="TriggerTextures" type="Node2D" parent="FlyingLaserCutterBody"]
|
||||
z_index = -1
|
||||
|
||||
[node name="Texture" type="Sprite" parent="FlyingLaserCutterBody/TriggerTextures"]
|
||||
material = SubResource( 6 )
|
||||
position = Vector2( 82, 15 )
|
||||
scale = Vector2( 1, -1 )
|
||||
texture = ExtResource( 4 )
|
||||
offset = Vector2( 2430, 4 )
|
||||
region_rect = Rect2( 2106.25, 268.196, 8.5918, 0 )
|
||||
|
||||
[node name="Texture2" type="Sprite" parent="FlyingLaserCutterBody/TriggerTextures"]
|
||||
material = SubResource( 7 )
|
||||
position = Vector2( 82, -6 )
|
||||
scale = Vector2( 1, -1 )
|
||||
texture = ExtResource( 4 )
|
||||
offset = Vector2( 2430, 4 )
|
||||
region_rect = Rect2( 2106.25, 268.196, 8.5918, 0 )
|
||||
|
||||
[connection signal="body_entered" from="FlyingLaserCutterBody/BackArea" to="." method="_on_BackArea_body_entered"]
|
||||
[connection signal="body_exited" from="FlyingLaserCutterBody/BackArea" to="." method="_on_BackArea_body_exited"]
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
const float PI = 3.14159;
|
||||
|
||||
uniform float bits = 1.;
|
||||
uniform float pixel_offset = 0.5;
|
||||
|
||||
uniform float total_distance = 50.;
|
||||
|
||||
uniform float wave1 :hint_range(0.0, 1.0, 1.) = 1.;
|
||||
uniform float wave2 :hint_range(0.0, 1.0, 1.) = 1.;
|
||||
uniform float wave3 :hint_range(0.0, 1.0, 1.) = 1.;
|
||||
|
||||
uniform vec4 wave1_color : hint_color = vec4(0.0,1.0,0.0,1.);
|
||||
uniform vec4 wave2_color : hint_color = vec4(0.0,1.0,0.0,1.);
|
||||
uniform vec4 wave3_color : hint_color = vec4(1.,1.,1.,1.);
|
||||
|
||||
uniform float wave_frequency: hint_range(0.0, 10.) = 0.2;
|
||||
uniform float wave_amplitude: hint_range(0., 1.) = 0.3;
|
||||
uniform float wave_offset: hint_range(-1., 1.) = 0.5;
|
||||
|
||||
uniform float traveling : hint_range(0.,1., 1.) = 1.;
|
||||
uniform float travel_speed : hint_range(-100., 100.) = 0.618;
|
||||
|
||||
uniform float oscilating : hint_range(0.,1., 1.) = 1.;
|
||||
uniform float oscilation_speed : hint_range(-100., 100.) = 0.618;
|
||||
|
||||
float plot(vec2 st, float pct) {
|
||||
return smoothstep(pct - 0.03, pct, st.y) -
|
||||
smoothstep(pct, pct + 0.03, st.y);
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
// Adapt the size of pixel regions to the size of the texture
|
||||
float x_bits = bits / TEXTURE_PIXEL_SIZE.x;
|
||||
float y_bits = bits / TEXTURE_PIXEL_SIZE.y;
|
||||
// Segment the UV into pixels
|
||||
float pixelized_x = floor(UV.x * x_bits)/x_bits + pixel_offset/x_bits;
|
||||
float pixelized_y = floor(UV.y * y_bits)/y_bits + pixel_offset/y_bits;
|
||||
vec2 pixel_coord = vec2(pixelized_x, pixelized_y);
|
||||
|
||||
float freq = wave_frequency / TEXTURE_PIXEL_SIZE.x;
|
||||
|
||||
float travel_summand = (TIME * traveling * travel_speed);
|
||||
float oscilation_factor = (sin(TIME) * oscilating * oscilation_speed);
|
||||
|
||||
float y1 = sin(pixel_coord.x * freq + travel_summand) * (wave_amplitude/2. + wave_amplitude/2. * oscilation_factor) + wave_offset;
|
||||
float y2 = -1. * sin(pixel_coord.x * freq + travel_summand) * (wave_amplitude/2. + wave_amplitude/2. * oscilation_factor) + wave_offset;
|
||||
float y3 = 0. + wave_offset;
|
||||
float point1 = (plot(pixel_coord, y1));
|
||||
float point2 = (plot(pixel_coord, y2));
|
||||
float point3 = (plot(pixel_coord, y3));
|
||||
vec4 c = point1 * wave1 * wave1_color + point2 * wave2 * wave2_color + point3 * wave3 * wave3_color;
|
||||
|
||||
vec2 texture_coord = UV.xy / (TEXTURE_PIXEL_SIZE.xy);
|
||||
float dist = max(sign(total_distance - texture_coord.x), 0.);
|
||||
|
||||
COLOR = c * dist;
|
||||
}
|
||||
141
src/Platforms/FlyingLaserCutterTriggerRayShader.tres
Normal file
141
src/Platforms/FlyingLaserCutterTriggerRayShader.tres
Normal file
@ -0,0 +1,141 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
|
||||
|
||||
[sub_resource type="Shader" id=1]
|
||||
code = "/*
|
||||
Shader from Godot Shaders - the free shader library.
|
||||
godotshaders.com/shader/energy-beams
|
||||
|
||||
This shader is under CC0 license. Feel free to use, improve and
|
||||
change this shader according to your needs and consider sharing
|
||||
the modified result to godotshaders.com.
|
||||
*/
|
||||
|
||||
shader_type canvas_item;
|
||||
render_mode blend_add; // Remove this if you want to use HDR glow instead (use \"Glow\" and \"Outline Glow\" sliders)
|
||||
|
||||
uniform int beams = 2; // How many beams the energy field should have
|
||||
|
||||
uniform float energy = 3.0; // How much the beams will travel up and down
|
||||
uniform int roughness : hint_range(1, 10) = 3; // How compact the noise texture will be
|
||||
uniform int frequency = 10; // Amount of \"ripples\" in the beams
|
||||
|
||||
uniform float speed = 1.0; // Animation speed
|
||||
uniform float thickness : hint_range(0.0, 0.1) = 0.006; // Thickness of the main beam
|
||||
uniform float outline_thickness : hint_range(0.0, 0.1) = 0.03; //Thickness of the outline color
|
||||
uniform float beam_difference : hint_range(0.0, 1.0) = 0.0; // The thickness difference between the main beam and the other, if there are more than one beam. The closer to 1 the smaller the thickness difference.
|
||||
|
||||
uniform float glow : hint_range(0.0, 3.0) = 0.0; // Use together with WorldEnvironment's Glow feature
|
||||
uniform float outline_glow : hint_range(0.0, 3.0) = 0.0;
|
||||
|
||||
uniform vec4 color : hint_color = vec4(0.91, 1.0, 1.0, 1.0);
|
||||
uniform vec4 outline_color : hint_color = vec4(0.5, 1.0, 0.96, 1.0);
|
||||
|
||||
uniform float progress : hint_range(0.0, 1.0) = 1.0;
|
||||
|
||||
uniform float dist = 50.;
|
||||
|
||||
uniform float y_offset : hint_range (-0.5, 0.5) = 0.0; // Position of the beam
|
||||
uniform float fixed_edge_size : hint_range(0.0, 0.5) = 0.05; // How close to the edge should the beam be still before the animatino starts
|
||||
uniform vec2 noise_scale = vec2(1.0); // If the object (for example the ColorRect or Sprite node) is compressed use this to compensate for the noise texture being compressed.
|
||||
|
||||
float random(vec2 uv) {
|
||||
return fract(sin(dot(uv.xy,
|
||||
vec2(12.9898,78.233))) *
|
||||
43758.5453123);
|
||||
}
|
||||
|
||||
float noise(vec2 uv) {
|
||||
vec2 uv_index = floor(uv);
|
||||
vec2 uv_fract = fract(uv);
|
||||
|
||||
// Four corners in 2D of a tile
|
||||
float a = random(uv_index);
|
||||
float b = random(uv_index + vec2(1.0, 0.0));
|
||||
float c = random(uv_index + vec2(0.0, 1.0));
|
||||
float d = random(uv_index + vec2(1.0, 1.0));
|
||||
|
||||
vec2 blur = smoothstep(0.0, 1.0, uv_fract);
|
||||
|
||||
return mix(a, b, blur.x) +
|
||||
(c - a) * blur.y * (1.0 - blur.x) +
|
||||
(d - b) * blur.x * blur.y;
|
||||
}
|
||||
|
||||
float fbm(vec2 uv, float time) {
|
||||
int octaves = roughness;
|
||||
float amp = 0.01 * energy * progress;
|
||||
float freq = float(frequency);
|
||||
float value = 0.0;
|
||||
|
||||
for(int i = 0; i < octaves; i++) {
|
||||
value += amp * noise(freq * vec2(uv.x, uv.y + time));
|
||||
amp *= 0.5;
|
||||
freq *= 2.0;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
vec4 difference(vec4 base, vec4 blend){
|
||||
return abs(base - blend);
|
||||
}
|
||||
|
||||
vec4 bolt(vec2 uv, float time, float i)
|
||||
{
|
||||
// Setup the beam locking to the edges.
|
||||
float falloff = smoothstep(0.0, fixed_edge_size, uv.x) * smoothstep(0.0, fixed_edge_size, 1.0 - uv.x);
|
||||
|
||||
// Use Fractal Brownian Motion to create a \"cloud texture\" and use Difference blend mode to make the beam
|
||||
vec4 clouds = vec4(fbm((uv + vec2(i) ) * noise_scale, time * speed)) * falloff;
|
||||
vec4 diff_clouds = difference(clouds, vec4(uv.y - 0.5 + y_offset + (uv.y * falloff * 0.02 * energy * progress)));
|
||||
|
||||
// Create a new noise to mask the beams on low \"progress\" values. To make a \"turn-off\" effect more visually interesting.
|
||||
vec4 clouds2 = vec4(fbm((uv * 2.0) * noise_scale, time * 1.)) * 5.0;
|
||||
diff_clouds += smoothstep(0.0, 0.8, clouds2) * 0.1 * (1.-progress);
|
||||
|
||||
// Set thickness of the beams. First beam is the Thickness size and all following beams are sized with beam_difference
|
||||
float thickness2 = 1. - ( thickness / (min(i + beam_difference, 1.0) + (1.0-beam_difference))) * progress ;
|
||||
vec4 beam = clamp(smoothstep(thickness2, thickness2 + 0.005 * progress, 1.0 - diff_clouds), vec4(0.0), vec4(1.0));
|
||||
|
||||
//Set the beam outlines
|
||||
vec4 beam_outline;
|
||||
float outline = thickness2 - (outline_thickness * progress);
|
||||
beam_outline = clamp(smoothstep(outline, outline + 0.04, 1.0 - diff_clouds), 0.0, 1.0);
|
||||
beam_outline = clamp(beam_outline - beam, 0.0, 1.0);
|
||||
|
||||
// Merge the beam and the outline and return to the fragment function
|
||||
return (beam * (color + vec4(glow, glow, glow, 0.))) + (beam_outline * (outline_color + vec4(outline_glow, outline_glow, outline_glow, 0.)));
|
||||
}
|
||||
|
||||
void fragment()
|
||||
{
|
||||
vec4 beam = vec4(0.0);
|
||||
|
||||
for (int i = 0; i < beams; i++){
|
||||
beam = max(beam, bolt(UV, TIME, float(i)));
|
||||
}
|
||||
|
||||
vec2 coord = UV.xy / (TEXTURE_PIXEL_SIZE.xy);
|
||||
float over_dist = max(sign(dist - coord.x), 0.);
|
||||
|
||||
COLOR = beam * over_dist;
|
||||
}"
|
||||
|
||||
[resource]
|
||||
shader = SubResource( 1 )
|
||||
shader_param/beams = 2
|
||||
shader_param/energy = 10.0
|
||||
shader_param/roughness = 3
|
||||
shader_param/frequency = 20
|
||||
shader_param/speed = 1.0
|
||||
shader_param/thickness = 0.035
|
||||
shader_param/outline_thickness = 0.052
|
||||
shader_param/beam_difference = 0.049
|
||||
shader_param/glow = 0.0
|
||||
shader_param/outline_glow = 0.0
|
||||
shader_param/color = Color( 0.91, 1, 1, 1 )
|
||||
shader_param/outline_color = Color( 0.5, 1, 0.96, 1 )
|
||||
shader_param/progress = 0.731
|
||||
shader_param/dist = 1000.0
|
||||
shader_param/y_offset = -0.376
|
||||
shader_param/fixed_edge_size = 0.05
|
||||
shader_param/noise_scale = Vector2( 1, 1 )
|
||||
@ -41,7 +41,7 @@ resource_name = "LowPassFilter"
|
||||
cutoff_hz = 3000.0
|
||||
|
||||
[resource]
|
||||
bus/0/volume_db = -6.0206
|
||||
bus/0/volume_db = -3.74173
|
||||
bus/1/name = "Music"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
|
||||
@ -3,7 +3,8 @@ extends Control
|
||||
# Smart ist es die notwendigen Resourcen vor dem Skriptstart zu laden
|
||||
onready var current_scene := get_tree().get_current_scene()
|
||||
onready var pause_overlay: ColorRect = $HUDOverlay
|
||||
onready var timer: Label = $GetBackTimer
|
||||
onready var hud_timer: MarginContainer = $GetBackTimer
|
||||
onready var time_label: Label = $GetBackTimer/TimeLabel
|
||||
onready var currency: Label = $Currency
|
||||
onready var level_state := get_tree().root.get_child(4).get_node("%LevelState")
|
||||
onready var signal_manager := get_tree().root.get_child(4).get_node("%SignalManager")
|
||||
@ -16,11 +17,11 @@ func _ready():
|
||||
update_interface()
|
||||
|
||||
func _process(delta):
|
||||
if timer.visible:
|
||||
timer.text = String(round($GetBackTimer/Timer.time_left))
|
||||
if hud_timer.visible:
|
||||
time_label.text = String(round($GetBackTimer/Timer.time_left))
|
||||
|
||||
func start_timer(time):
|
||||
timer.visible = true
|
||||
hud_timer.visible = true
|
||||
$GetBackTimer/Timer.wait_time = time
|
||||
$GetBackTimer/Timer.start()
|
||||
$GetBackTimer/AnimationPlayer.play("Redlight")
|
||||
@ -29,8 +30,8 @@ func start_timer(time):
|
||||
|
||||
func _zoom_timer() -> void:
|
||||
var tween := create_tween()
|
||||
tween.parallel().tween_property(timer, "rect_position", Vector2(295, 0), 1.0)
|
||||
tween.parallel().tween_property(timer, "rect_scale", Vector2(1,1), 1.0)
|
||||
#tween.parallel().tween_property(hud_timer, "rect_position", Vector2(295, 0), 1.0)
|
||||
tween.parallel().tween_property(hud_timer, "rect_scale", Vector2(1,1), 1.0)
|
||||
|
||||
|
||||
func update_interface() -> void:
|
||||
|
||||
@ -1,8 +1,28 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
[gd_scene load_steps=10 format=2]
|
||||
|
||||
[ext_resource path="res://assets/meta/ui_theme.tres" type="Theme" id=1]
|
||||
[ext_resource path="res://assets/ui/sci-fi-godot-theme/sci-fi-theme.tres" type="Theme" id=2]
|
||||
[ext_resource path="res://src/UserInterface/Screens/HUD.gd" type="Script" id=5]
|
||||
|
||||
[sub_resource type="Gradient" id=8]
|
||||
interpolation_mode = 2
|
||||
offsets = PoolRealArray( 0, 0.8 )
|
||||
colors = PoolColorArray( 0, 0, 0, 0.635294, 0, 0, 0, 0 )
|
||||
|
||||
[sub_resource type="GradientTexture2D" id=7]
|
||||
gradient = SubResource( 8 )
|
||||
width = 70
|
||||
height = 40
|
||||
fill = 1
|
||||
fill_from = Vector2( 0.5, 0.5 )
|
||||
fill_to = Vector2( 0.95, 0.95 )
|
||||
|
||||
[sub_resource type="DynamicFontData" id=12]
|
||||
font_path = "res://assets/ui/fonts/Kenney Thick.ttf"
|
||||
|
||||
[sub_resource type="DynamicFont" id=13]
|
||||
font_data = SubResource( 12 )
|
||||
|
||||
[sub_resource type="Animation" id=1]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
@ -53,27 +73,44 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
color = Color( 0, 0, 0, 0 )
|
||||
|
||||
[node name="GetBackTimer" type="Label" parent="."]
|
||||
unique_name_in_owner = true
|
||||
[node name="GetBackTimer" type="MarginContainer" parent="."]
|
||||
visible = false
|
||||
anchor_left = 0.5
|
||||
anchor_right = 0.5
|
||||
margin_left = -140.0
|
||||
margin_right = -90.0
|
||||
margin_bottom = 21.0
|
||||
margin_left = -70.0
|
||||
margin_right = 70.0
|
||||
margin_bottom = 80.0
|
||||
rect_scale = Vector2( 2, 2 )
|
||||
theme = ExtResource( 2 )
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="GetBackTimer"]
|
||||
margin_right = 140.0
|
||||
margin_bottom = 80.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = SubResource( 7 )
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
|
||||
[node name="TimeLabel" type="Label" parent="GetBackTimer"]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 140.0
|
||||
margin_bottom = 80.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
rect_scale = Vector2( 5, 5 )
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
size_flags_horizontal = 15
|
||||
size_flags_vertical = 15
|
||||
custom_fonts/font = SubResource( 13 )
|
||||
text = "100"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="Timer" type="Timer" parent="GetBackTimer"]
|
||||
wait_time = 100.0
|
||||
one_shot = true
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="GetBackTimer"]
|
||||
root_node = NodePath("../TimeLabel")
|
||||
anims/RESET = SubResource( 1 )
|
||||
anims/Redlight = SubResource( 2 )
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user