diff --git a/Scene/TestScene.tscn b/Scene/TestScene.tscn index 2a8afb6..3682d58 100644 --- a/Scene/TestScene.tscn +++ b/Scene/TestScene.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://Scene/Player.tscn" type="PackedScene" id=1] [ext_resource path="res://Assets/Placeholder.png" type="Texture" id=2] -[ext_resource path="res://Scripts/GameManager.gd" type="Script" id=3] +[ext_resource path="res://Scene/Clopinette.tscn" type="PackedScene" id=3] +[ext_resource path="res://Scripts/GameManager.gd" type="Script" id=4] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 15.6178, 15.7669 ) @@ -28,14 +29,20 @@ shape = SubResource( 1 ) position = Vector2( 221.278, 126.847 ) [node name="GameManager" type="Node2D" parent="."] -script = ExtResource( 3 ) +script = ExtResource( 4 ) [node name="SpawnPoint" type="Node2D" parent="." groups=[ "spawn_point", ]] -position = Vector2( 272.415, 35.2101 ) +position = Vector2( 272.415, 34.2101 ) [node name="SpawnPoint2" type="Node2D" parent="." groups=[ "spawn_point", ]] position = Vector2( 65.7874, 32.4304 ) + +[node name="Clopinette" parent="." groups=[ +"bucket", +] instance=ExtResource( 3 )] +position = Vector2( 149.267, 34.1946 ) +scriptName = "res://Scripts/PaintEffects/Invisibility.gd" diff --git a/Scripts/Clopinette.gd b/Scripts/Clopinette.gd index 4b2418b..2ce6413 100644 --- a/Scripts/Clopinette.gd +++ b/Scripts/Clopinette.gd @@ -1,18 +1,19 @@ extends Node2D -var sprite; -var area; -var collider; +var sprite +var area +var collider +var loadedScript + +export(String, FILE, "*.gd") var scriptName # Called when the node enters the scene tree for the first time. func _ready(): sprite = get_node("Sprite") area = get_node("Area2D") + loadedScript = load(scriptName).new() area.connect("body_entered", self, "onBodyEntered") -func onBodyEntered(body : PhysicsBody2D): - queue_free() - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass +func onBodyEntered(body): + body.addCoroutine(loadedScript.StartEffect(body)) + queue_free() diff --git a/Scripts/PaintEffects/Invisibility.gd b/Scripts/PaintEffects/Invisibility.gd new file mode 100644 index 0000000..30a7106 --- /dev/null +++ b/Scripts/PaintEffects/Invisibility.gd @@ -0,0 +1,34 @@ +extends Node + +#The time, in seconds, it should take for the character to fade to FadeOutValue +export var FadeOutTime = 2.0 +export var InvisTime = 5.0 +export var FadeInTime = 2.0 + +#The alpha value we aim for when fading out +export var FadeOutValue = 0.05 + +func AlmostFadeOutRoutine(player, delta): + var sprite : Sprite = player.get_node("Sprite") + var elapsed = delta + var origin = sprite.get_modulate().a + while sprite.self_modulate.a > FadeOutValue: + var a = lerp(origin, FadeOutValue, elapsed / FadeOutTime) + sprite.self_modulate = Color(1,1,1, a) + elapsed += yield() + + elapsed -= FadeOutTime; + while elapsed < InvisTime: + elapsed += yield() + elapsed -= InvisTime; + + while sprite.self_modulate.a < origin: + var a = lerp(FadeOutValue, origin, elapsed / FadeInTime) + sprite.self_modulate = Color(1,1,1, a) + elapsed += yield() + + +func StartEffect(player): + var rout = AlmostFadeOutRoutine(player, 0) + return rout + diff --git a/Scripts/Player.gd b/Scripts/Player.gd index 8b9b1a8..e42847d 100644 --- a/Scripts/Player.gd +++ b/Scripts/Player.gd @@ -8,11 +8,14 @@ const MAX_LIFE = 30 var vel = Vector2.ZERO var curLife = MAX_LIFE +var coroutines = [] + #onready var animationPlayer = $AnimationPlayer #onready var animationTree = $AnimationTree #onready var animationState = animationTree.get("parameters/playback") func _process(delta): + updatePaintEffects(delta) curLife -= delta if curLife <= 0: #fin du game laul @@ -40,3 +43,21 @@ func _physics_process(delta): vel = vel.move_toward(Vector2.ZERO, FRICTION * delta) vel = move_and_slide(vel) + + +func updatePaintEffects(delta): + var sprite = get_node("Sprite") + var updated = [] + for rout in coroutines: + if rout != null && rout.is_valid(): + var new_rout = rout.resume(delta) + if new_rout != null && new_rout.is_valid(): + updated.append(new_rout) + coroutines.remove(coroutines.find(rout)) + + for rout in updated: + coroutines.append(rout) + + +func addCoroutine(routine): + coroutines.append(routine)