Fix Enemy Outline, Create Damage System

main
Luna Brovchuk 2023-10-01 14:47:37 +02:00
parent 0a15ff1634
commit 4417e48192
9 changed files with 143 additions and 51 deletions

19
res/shaders/colorize.tres Normal file
View File

@ -0,0 +1,19 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
[sub_resource type="Shader" id=3]
code = "shader_type canvas_item;
uniform bool active = false;
uniform vec4 color: hint_color = vec4(1, 1, 1, 1);
void fragment(){
COLOR = texture(TEXTURE, UV);
if (active) {
COLOR = vec4(COLOR.rgb + color.rgb * color.a, COLOR.a)
}
}"
[resource]
shader = SubResource( 3 )
shader_param/active = false
shader_param/color = Color( 1, 1, 1, 1 )

View File

@ -0,0 +1,11 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
[ext_resource path="res://res/shaders/outline.tres" type="Shader" id=1]
[resource]
shader = ExtResource( 1 )
shader_param/color = Color( 1, 0.870588, 0, 1 )
shader_param/width = 1.0
shader_param/pattern = 0
shader_param/inside = false
shader_param/add_margins = true

View File

@ -9,7 +9,7 @@ extents = Vector2( 4, 3 )
[sub_resource type="RectangleShape2D" id=2] [sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 6, 4 ) extents = Vector2( 6, 4 )
[node name="Bat" type="KinematicBody2D" groups=["enemy"]] [node name="Bat" type="KinematicBody2D" groups=["bat", "enemy"]]
collision_layer = 2 collision_layer = 2
collision_mask = 2 collision_mask = 2
script = ExtResource( 2 ) script = ExtResource( 2 )

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=5 format=2] [gd_scene load_steps=8 format=2]
[ext_resource path="res://src/models/player/sprite.png" type="Texture" id=1] [ext_resource path="res://src/models/player/sprite.png" type="Texture" id=1]
[ext_resource path="res://src/models/player/player.gd" type="Script" id=2] [ext_resource path="res://src/models/player/player.gd" type="Script" id=2]
[ext_resource path="res://res/shaders/colorize.tres" type="Material" id=3]
[sub_resource type="RectangleShape2D" id=1] [sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 4, 5.5 ) extents = Vector2( 4, 5.5 )
@ -9,10 +10,67 @@ extents = Vector2( 4, 5.5 )
[sub_resource type="RectangleShape2D" id=2] [sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 7, 11 ) extents = Vector2( 7, 11 )
[sub_resource type="Animation" id=4]
resource_name = "RESET"
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:material:shader_param/color")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:material:shader_param/active")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ false ]
}
[sub_resource type="Animation" id=3]
resource_name = "damage"
length = 0.9
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite:material:shader_param/active")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 2 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 1,
"values": [ true, false ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite:material:shader_param/color")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75, 0.9 ),
"transitions": PoolRealArray( 8, 8, 8, 8, 8, 8, 8 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[node name="Player" type="KinematicBody2D" groups=["player"]] [node name="Player" type="KinematicBody2D" groups=["player"]]
script = ExtResource( 2 ) script = ExtResource( 2 )
[node name="Sprite" type="Sprite" parent="."] [node name="Sprite" type="Sprite" parent="."]
material = ExtResource( 3 )
texture = ExtResource( 1 ) texture = ExtResource( 1 )
centered = false centered = false
@ -25,3 +83,10 @@ shape = SubResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyCollision"] [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyCollision"]
position = Vector2( 12, 12 ) position = Vector2( 12, 12 )
shape = SubResource( 2 ) shape = SubResource( 2 )
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
autoplay = "RESET"
anims/RESET = SubResource( 4 )
anims/damage = SubResource( 3 )
[connection signal="area_entered" from="EnemyCollision" to="." method="area_entered"]

View File

@ -1,17 +1,42 @@
extends KinematicBody2D extends KinematicBody2D
var velocity = Vector2.ZERO var outline_material = load("res://res/shaders/outline_material.tres")
var speed_multiplier: float = 1.0 var speed_multiplier: float = 1.0
var invincibility_timer = .0
var velocity = Vector2.ZERO
var invincible = false
var target: EnemyClass
var slowed = false var slowed = false
var target
var speed = 100 var speed = 100
func get_input(): func get_input():
var input_direction = Input.get_vector("left", "right", "up", "down") var input_direction = Input.get_vector("left", "right", "up", "down")
velocity = input_direction * speed velocity = input_direction * speed
func _physics_process(_delta): func choose_target():
var least_dist = 4000
var enemy_dist
var enemies = get_tree().get_nodes_in_group("enemy")
for enemy in enemies:
enemy.material = null
enemy_dist = global_position.distance_to(enemy.global_position)
if enemy_dist < least_dist:
least_dist = enemy_dist
target = enemy
func area_entered(area):
var parent = area.get_parent()
if parent.is_in_group("enemy") and not parent.is_in_group("bat") and not invincible:
$AnimationPlayer.play("damage")
Global.add_health(-1)
invincible = true
invincibility_timer = .0
func _physics_process(delta):
get_input() get_input()
invincibility_timer += delta
var areas = $EnemyCollision.get_overlapping_areas() var areas = $EnemyCollision.get_overlapping_areas()
slowed = false slowed = false
for area in areas: for area in areas:
@ -19,6 +44,9 @@ func _physics_process(_delta):
slowed = true slowed = true
break break
if invincible and invincibility_timer >= 0.9:
invincible = false
if slowed: if slowed:
speed_multiplier = 0.5 speed_multiplier = 0.5
else: else:
@ -26,17 +54,4 @@ func _physics_process(_delta):
velocity = move_and_slide(velocity * speed_multiplier) velocity = move_and_slide(velocity * speed_multiplier)
choose_target() choose_target()
target.material = outline_material
const SHADER = preload("res://res/shaders/outline.tres")
func choose_target():
var least_dist = 4000
var enemy_dist
var enemies = get_tree().get_nodes_in_group("enemy")
for enemy in enemies:
enemy_dist = global_position.distance_to(enemy.global_position)
if enemy_dist < least_dist:
least_dist = enemy_dist
target = enemy
#enemy.set_shader_param("width", 0)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=24 format=2] [gd_scene load_steps=20 format=2]
[ext_resource path="res://src/scenes/menu/background/background.png" type="Texture" id=1] [ext_resource path="res://src/scenes/menu/background/background.png" type="Texture" id=1]
[ext_resource path="res://src/scenes/game/sprites/background_houses.png" type="Texture" id=2] [ext_resource path="res://src/scenes/game/sprites/background_houses.png" type="Texture" id=2]
@ -15,7 +15,6 @@
[ext_resource path="res://src/models/enemies/trash_can/TrashCan.tscn" type="PackedScene" id=13] [ext_resource path="res://src/models/enemies/trash_can/TrashCan.tscn" type="PackedScene" id=13]
[ext_resource path="res://src/models/enemies/bat/Bat.tscn" type="PackedScene" id=14] [ext_resource path="res://src/models/enemies/bat/Bat.tscn" type="PackedScene" id=14]
[ext_resource path="res://src/models/enemies/ghost/Ghost.tscn" type="PackedScene" id=15] [ext_resource path="res://src/models/enemies/ghost/Ghost.tscn" type="PackedScene" id=15]
[ext_resource path="res://res/shaders/outline.tres" type="Shader" id=16]
[sub_resource type="RectangleShape2D" id=2] [sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 10, 60 ) extents = Vector2( 10, 60 )
@ -23,30 +22,6 @@ extents = Vector2( 10, 60 )
[sub_resource type="RectangleShape2D" id=3] [sub_resource type="RectangleShape2D" id=3]
extents = Vector2( 140, 10.125 ) extents = Vector2( 140, 10.125 )
[sub_resource type="ShaderMaterial" id=5]
shader = ExtResource( 16 )
shader_param/color = Color( 1, 0.870588, 0, 1 )
shader_param/width = 1.0
shader_param/pattern = 0
shader_param/inside = false
shader_param/add_margins = true
[sub_resource type="ShaderMaterial" id=6]
shader = ExtResource( 16 )
shader_param/color = Color( 1, 0.870588, 0, 1 )
shader_param/width = 1.0
shader_param/pattern = 0
shader_param/inside = false
shader_param/add_margins = true
[sub_resource type="ShaderMaterial" id=7]
shader = ExtResource( 16 )
shader_param/color = Color( 1, 0.870588, 0, 1 )
shader_param/width = 1.0
shader_param/pattern = 0
shader_param/inside = true
shader_param/add_margins = true
[sub_resource type="DynamicFont" id=1] [sub_resource type="DynamicFont" id=1]
size = 8 size = 8
font_data = ExtResource( 4 ) font_data = ExtResource( 4 )
@ -101,16 +76,13 @@ shape = SubResource( 3 )
[node name="TrashCan" parent="View/Enemies" instance=ExtResource( 13 )] [node name="TrashCan" parent="View/Enemies" instance=ExtResource( 13 )]
[node name="Bat" parent="View/Enemies" instance=ExtResource( 14 )] [node name="Bat" parent="View/Enemies" instance=ExtResource( 14 )]
material = SubResource( 5 )
z_index = 1 z_index = 1
[node name="Bat2" parent="View/Enemies" instance=ExtResource( 14 )] [node name="Bat2" parent="View/Enemies" instance=ExtResource( 14 )]
material = SubResource( 6 )
position = Vector2( 142, 54 ) position = Vector2( 142, 54 )
z_index = 1 z_index = 1
[node name="Ghost" parent="View/Enemies" instance=ExtResource( 15 )] [node name="Ghost" parent="View/Enemies" instance=ExtResource( 15 )]
material = SubResource( 7 )
position = Vector2( 509, 100 ) position = Vector2( 509, 100 )
[node name="Player" parent="View" instance=ExtResource( 5 )] [node name="Player" parent="View" instance=ExtResource( 5 )]

View File

@ -1,4 +1,5 @@
extends Node extends Node
func _ready(): func _ready():
Global.add_health(1) Global.health = 3
Global.add_health(0)

View File

@ -1,7 +1,7 @@
extends Node extends Node
func game_start(): func game_start():
get_tree().change_scene_to(Global.GAME_SCENE) Global.game_start()
func game_exit(): func game_exit():
get_tree().quit(0) get_tree().quit(0)

View File

@ -1,12 +1,21 @@
extends Node extends Node
var GAME_SCENE = preload("res://src/scenes/game/Game.tscn") var GAME_SCENE = preload("res://src/scenes/game/Game.tscn")
var MENU_SCENE = preload("res://src/scenes/menu/Menu.tscn")
var playing = true var playing = true
var health = 2 var health = 2
func game_start():
playing = true
get_tree().change_scene_to(GAME_SCENE)
func return_to_menu():
playing = false
get_tree().change_scene_to(MENU_SCENE)
func add_health(amount): func add_health(amount):
health = clamp(health + amount, 0, 3) health = clamp(health + amount, 0, 3)
get_tree().get_root().get_node("Game/UIWrapper/UI/Health/HealthSprite").frame = health get_tree().get_root().get_node("Game/UIWrapper/UI/Health/HealthSprite").frame = health
if health == 0: if health == 0:
pass # TODO endgame return_to_menu() # TODO endgame