diff --git a/autoloads/stain_layer.gd b/autoloads/stain_layer.gd new file mode 100644 index 0000000..f2f4ce4 --- /dev/null +++ b/autoloads/stain_layer.gd @@ -0,0 +1,17 @@ +extends Light2D + + +onready var viewport: Viewport = $Viewport + + +func _process(delta: float) -> void: + var main_viewport = get_viewport() + if viewport.canvas_transform != main_viewport.canvas_transform: + viewport.canvas_transform = main_viewport.canvas_transform + transform = main_viewport.canvas_transform.inverse() + viewport.render_target_update_mode = Viewport.UPDATE_ONCE + + +func add_stain(stain: Node2D) -> void: + viewport.add_child(stain) + viewport.render_target_update_mode = Viewport.UPDATE_ONCE diff --git a/autoloads/stain_layer.tscn b/autoloads/stain_layer.tscn new file mode 100644 index 0000000..02ce9b8 --- /dev/null +++ b/autoloads/stain_layer.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://autoloads/stain_layer.gd" type="Script" id=1] + +[sub_resource type="ViewportTexture" id=1] +viewport_path = NodePath("Viewport") + +[node name="StainLight" type="Light2D" groups=["viewport_autoload"]] +texture = SubResource( 1 ) +offset = Vector2( 128, 96 ) +mode = 2 +range_item_cull_mask = 2 +script = ExtResource( 1 ) + +[node name="Viewport" type="Viewport" parent="."] +size = Vector2( 256, 192 ) +transparent_bg = true +disable_3d = true +usage = 1 +render_target_v_flip = true +render_target_update_mode = 1 diff --git a/objects/enemy/death_particles.gd b/objects/enemy/death_particles.gd index 232a39a..ea583bd 100644 --- a/objects/enemy/death_particles.gd +++ b/objects/enemy/death_particles.gd @@ -10,7 +10,7 @@ export var spray_velocity: float = 80 func _ready() -> void: for i in spray_ammount: - var spray: RigidBody2D = BloodSpray.instance() + var spray = BloodSpray.instance() spray.global_position = global_position - spray.linear_velocity = Vector2(spray_velocity, 0.0).rotated(randf() * TAU) + spray.velocity = Vector2(randf() * spray_velocity, 0.0).rotated(randf() * TAU) get_parent().add_child(spray) diff --git a/objects/environment/blood/blood_spray.gd b/objects/environment/blood/blood_spray.gd index 2688fc3..8813381 100644 --- a/objects/environment/blood/blood_spray.gd +++ b/objects/environment/blood/blood_spray.gd @@ -1,4 +1,4 @@ -extends RigidBody2D +extends Area2D const BloodStain := preload("res://objects/environment/blood/blood_stain.tscn") @@ -7,6 +7,9 @@ const BloodStain := preload("res://objects/environment/blood/blood_stain.tscn") export var color: Color = Color(0xf53342ff) +var velocity := Vector2.ZERO + + onready var sprite: Sprite = $Sprite @@ -15,15 +18,17 @@ func _ready() -> void: func _physics_process(delta: float) -> void: - sprite.global_rotation = linear_velocity.angle() + velocity.y += 98.0 * delta + position += velocity * delta + sprite.global_rotation = velocity.angle() func _on_body_entered(body: Node) -> void: if body.is_in_group("can_stain"): var stain = BloodStain.instance() - stain.color = color + stain.modulate = color stain.global_position = global_position - body.add_child(stain) + StainLayer.add_stain(stain) queue_free() elif body is TileMap: queue_free() diff --git a/objects/environment/blood/blood_spray.tscn b/objects/environment/blood/blood_spray.tscn index 0ac97ef..94c6567 100644 --- a/objects/environment/blood/blood_spray.tscn +++ b/objects/environment/blood/blood_spray.tscn @@ -4,11 +4,9 @@ [ext_resource path="res://objects/environment/blood/blood_spray.gd" type="Script" id=3] [sub_resource type="CircleShape2D" id=1] -radius = 1.0 +radius = 0.5 -[node name="BloodSpray" type="RigidBody2D"] -contacts_reported = 4 -contact_monitor = true +[node name="BloodSpray" type="Area2D"] script = ExtResource( 3 ) [node name="Sprite" type="Sprite" parent="."] diff --git a/objects/environment/blood/blood_stain.gd b/objects/environment/blood/blood_stain.gd index 9985e38..23247fe 100644 --- a/objects/environment/blood/blood_stain.gd +++ b/objects/environment/blood/blood_stain.gd @@ -1,4 +1,4 @@ -extends Light2D +extends Sprite func _ready() -> void: diff --git a/objects/environment/blood/blood_stain.tscn b/objects/environment/blood/blood_stain.tscn index de980e2..6fc0bdf 100644 --- a/objects/environment/blood/blood_stain.tscn +++ b/objects/environment/blood/blood_stain.tscn @@ -3,10 +3,7 @@ [ext_resource path="res://graphics/particles/dust.png" type="Texture" id=1] [ext_resource path="res://objects/environment/blood/blood_stain.gd" type="Script" id=2] -[node name="BloodStain" type="Light2D"] +[node name="BloodStain" type="Sprite"] light_mask = 3 texture = ExtResource( 1 ) -color = Color( 0.960784, 0.2, 0.258824, 1 ) -mode = 2 -range_item_cull_mask = 2 script = ExtResource( 2 ) diff --git a/objects/player/player.gd b/objects/player/player.gd index 9364eae..16c4955 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -277,9 +277,11 @@ func _on_Dead_state_entered() -> void: particles.emitting = true get_parent().add_child(particles) for i in 16: - var spray: RigidBody2D = BloodSpray.instance() - spray.global_position = global_position - spray.linear_velocity = Vector2(80.0, 0.0).rotated(randf() * TAU) + var spray = BloodSpray.instance() + spray.pause_mode = PAUSE_MODE_PROCESS + Physics2DServer.set_active(true) + spray.global_position = death_splatter_position.global_position + spray.velocity = Vector2(randf() * 80.0, 0.0).rotated(randf() * TAU) get_parent().add_child(spray) else: skip_blood = false diff --git a/project.godot b/project.godot index 8bba2b7..6bdb63b 100644 --- a/project.godot +++ b/project.godot @@ -81,6 +81,7 @@ TouchControls="*res://autoloads/touch_controls.tscn" SceneManager="*res://autoloads/scene_manager.tscn" Console="*res://autoloads/console.tscn" Fade="*res://autoloads/fade.tscn" +StainLayer="*res://autoloads/stain_layer.tscn" [debug]