Explorar el Código

:sparkles: added draggable survivors

Felix Bytow hace 10 meses
padre
commit
c4c18c2bbc

+ 32 - 5
assets/autoload/global_input.gd

@@ -5,10 +5,37 @@ const FULL_SCREEN_MODES: Array[DisplayServer.WindowMode] = [
 	DisplayServer.WINDOW_MODE_FULLSCREEN,
 ]
 
+var dragged_object: Node2D = null
+var drop_spot: Node2D = null
+
+func is_dragging() -> bool:
+	return dragged_object != null
+
+func start_dragging(object: Node2D):
+	assert(object != null)
+	stop_dragging()
+	dragged_object = object
+
+func stop_dragging():
+	if dragged_object != null:
+		if drop_spot != null:
+			drop_spot.drop(dragged_object)
+		dragged_object.position = Vector2.ZERO
+		dragged_object = null
+
+func set_drop_spot(spot: Node2D):
+	assert(spot == null || spot.has_method("drop"))
+	drop_spot = spot
+	
+func toggle_fullscreen():
+	var current_mode = DisplayServer.window_get_mode()
+	if current_mode in FULL_SCREEN_MODES:
+		DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
+	else:
+		DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
+
 func _input(event: InputEvent):
 	if event.is_action_pressed("toggle_fullscreen"):
-		var current_mode = DisplayServer.window_get_mode()
-		if current_mode in FULL_SCREEN_MODES:
-			DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
-		else:
-			DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
+		toggle_fullscreen()
+	elif event is InputEventMouseMotion && is_dragging():
+		dragged_object.global_position = event.global_position

+ 29 - 0
assets/scenes/demon.gd

@@ -0,0 +1,29 @@
+extends Area2D
+class_name Demon
+
+var is_being_dragged: bool = false
+
+func _on_mouse_entered():
+	if not GlobalInput.is_dragging():
+		# TODO: add custom cursor image
+		Input.set_custom_mouse_cursor(null, Input.CURSOR_MOVE)
+
+func _on_mouse_exited():
+	if not GlobalInput.is_dragging():
+		# TODO: add custom cursor image
+		Input.set_custom_mouse_cursor(null, Input.CURSOR_ARROW)
+
+func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int):
+	if event is InputEventMouseButton:
+		handle_click(event)
+
+func handle_click(event: InputEventMouseButton):
+	if event.button_index != MOUSE_BUTTON_LEFT:
+		return
+	
+	if event.pressed && not GlobalInput.is_dragging():
+		is_being_dragged = true
+		GlobalInput.start_dragging(self)
+	elif not event.pressed && is_being_dragged:
+		is_being_dragged = false
+		GlobalInput.stop_dragging()

+ 60 - 0
assets/scenes/demon.tscn

@@ -0,0 +1,60 @@
+[gd_scene load_steps=9 format=3 uid="uid://gq6u7iesbchb"]
+
+[ext_resource type="Texture2D" uid="uid://dl8yyrdb8o001" path="res://assets/textures/survivors/purple/demon_idle.png" id="1_efcu4"]
+[ext_resource type="Script" path="res://assets/scenes/demon.gd" id="1_h64o5"]
+[ext_resource type="Texture2D" uid="uid://bf3ayj1blr6bk" path="res://assets/textures/survivors/purple/demon_shoot_1.png" id="2_yw5ej"]
+[ext_resource type="Texture2D" uid="uid://c3kee723fcojn" path="res://assets/textures/survivors/purple/demon_shoot_2.png" id="3_nvdqw"]
+[ext_resource type="Texture2D" uid="uid://gg4oygilqclm" path="res://assets/textures/survivors/purple/demon_shoot_3.png" id="4_g3y15"]
+[ext_resource type="Texture2D" uid="uid://b23076s18srxm" path="res://assets/textures/survivors/purple/demon_shoot_4.png" id="5_50e2m"]
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_nbhay"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("1_efcu4")
+}],
+"loop": true,
+"name": &"idle",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("2_yw5ej")
+}, {
+"duration": 1.0,
+"texture": ExtResource("3_nvdqw")
+}, {
+"duration": 1.0,
+"texture": ExtResource("4_g3y15")
+}, {
+"duration": 1.0,
+"texture": ExtResource("5_50e2m")
+}],
+"loop": true,
+"name": &"shoot",
+"speed": 5.0
+}]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_d3lxi"]
+size = Vector2(246.529, 258.823)
+
+[node name="Demon" type="Area2D" groups=["drag", "survivor"]]
+z_index = 4096
+z_as_relative = false
+scale = Vector2(0.17, 0.17)
+collision_layer = 128
+collision_mask = 64
+script = ExtResource("1_h64o5")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
+position = Vector2(0, -117.647)
+sprite_frames = SubResource("SpriteFrames_nbhay")
+animation = &"shoot"
+
+[node name="DragShape" type="CollisionShape2D" parent="."]
+scale = Vector2(1, 1)
+shape = SubResource("RectangleShape2D_d3lxi")
+
+[connection signal="input_event" from="." to="." method="_on_input_event"]
+[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"]
+[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"]

+ 38 - 0
assets/scenes/player_spawn_zone.gd

@@ -0,0 +1,38 @@
+extends Area2D
+
+@onready var shape: CollisionShape2D = $CollisionShape2D
+@onready var markers: Node2D = $Markers
+
+const DEMON_SCENE: PackedScene = preload("res://assets/scenes/demon.tscn")
+
+func _ready():
+	add_survivor()
+	add_survivor()
+
+func add_survivor() -> void:
+	var spot = find_first_free_spot()
+	if spot == null:
+		return
+	var demon = DEMON_SCENE.instantiate()
+	spot.add_child(demon)
+
+func find_first_free_spot() -> Node2D:
+	for marker in markers.get_children():
+		if marker.get_child_count() == 0:
+			return marker
+	return null
+
+func is_occupied() -> bool:
+	return find_first_free_spot() == null
+
+func drop(object: Node2D) -> void:
+	object.reparent(find_first_free_spot())
+
+func _on_mouse_entered() -> void:
+	var da = GlobalInput.dragged_object
+	if da != null && da.is_in_group("survivor") && not is_occupied():
+		GlobalInput.set_drop_spot(self)
+
+func _on_mouse_exited() -> void:
+	if GlobalInput.drop_spot == self:
+		GlobalInput.set_drop_spot(null)

+ 46 - 0
assets/scenes/player_spawn_zone.tscn

@@ -0,0 +1,46 @@
+[gd_scene load_steps=3 format=3 uid="uid://bw0opjv1ewa8b"]
+
+[ext_resource type="Script" path="res://assets/scenes/player_spawn_zone.gd" id="1_rjl45"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_3lwyv"]
+size = Vector2(202, 162)
+
+[node name="PlayerSpawnZone" type="Area2D" groups=["spawn_zone"]]
+collision_layer = 64
+collision_mask = 128
+script = ExtResource("1_rjl45")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_3lwyv")
+debug_color = Color(0.444279, 0.596696, 0.0917906, 0.42)
+
+[node name="Markers" type="Node2D" parent="."]
+
+[node name="Marker2D" type="Marker2D" parent="Markers"]
+position = Vector2(-69, -50)
+
+[node name="Marker2D2" type="Marker2D" parent="Markers"]
+position = Vector2(0, -50)
+
+[node name="Marker2D3" type="Marker2D" parent="Markers"]
+position = Vector2(69, -50)
+
+[node name="Marker2D4" type="Marker2D" parent="Markers"]
+position = Vector2(-69, 0)
+
+[node name="Marker2D5" type="Marker2D" parent="Markers"]
+
+[node name="Marker2D6" type="Marker2D" parent="Markers"]
+position = Vector2(69, 0)
+
+[node name="Marker2D7" type="Marker2D" parent="Markers"]
+position = Vector2(-69, 50)
+
+[node name="Marker2D8" type="Marker2D" parent="Markers"]
+position = Vector2(0, 50)
+
+[node name="Marker2D9" type="Marker2D" parent="Markers"]
+position = Vector2(69, 50)
+
+[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"]
+[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"]

+ 12 - 2
assets/scenes/survivor_spot.gd

@@ -15,9 +15,19 @@ var highlighted: bool = false:
 		else:
 			sprite.texture = STATES[0]
 
+func is_occupied():
+	return get_children().any(func (child): child.is_in_group("survivor"))
+
+func drop(object: Node2D):
+	object.reparent(self)
 
 func _on_mouse_entered():
-	highlighted = true
+	var da = GlobalInput.dragged_object
+	if da != null && da.is_in_group("survivor") && not is_occupied():
+		highlighted = true
+		GlobalInput.set_drop_spot(self)
 
 func _on_mouse_exited():
-	highlighted = false
+	if GlobalInput.drop_spot == self:
+		highlighted = false
+		GlobalInput.set_drop_spot(null)

BIN
assets/textures/survivors/purple/demon_idle.png


+ 34 - 0
assets/textures/survivors/purple/demon_idle.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dl8yyrdb8o001"
+path="res://.godot/imported/demon_idle.png-cd5da67601628a4099f6e907d3dcda3a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/survivors/purple/demon_idle.png"
+dest_files=["res://.godot/imported/demon_idle.png-cd5da67601628a4099f6e907d3dcda3a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
assets/textures/survivors/purple/demon_shoot_1.png


+ 34 - 0
assets/textures/survivors/purple/demon_shoot_1.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bf3ayj1blr6bk"
+path="res://.godot/imported/demon_shoot_1.png-d84fc9f340b331600b8ab9c5be84b9e5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/survivors/purple/demon_shoot_1.png"
+dest_files=["res://.godot/imported/demon_shoot_1.png-d84fc9f340b331600b8ab9c5be84b9e5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
assets/textures/survivors/purple/demon_shoot_2.png


+ 34 - 0
assets/textures/survivors/purple/demon_shoot_2.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3kee723fcojn"
+path="res://.godot/imported/demon_shoot_2.png-5c7ae87d8c8a82fcf8d1d089ec06c8f9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/survivors/purple/demon_shoot_2.png"
+dest_files=["res://.godot/imported/demon_shoot_2.png-5c7ae87d8c8a82fcf8d1d089ec06c8f9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
assets/textures/survivors/purple/demon_shoot_3.png


+ 34 - 0
assets/textures/survivors/purple/demon_shoot_3.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gg4oygilqclm"
+path="res://.godot/imported/demon_shoot_3.png-54f701a5507890268c518c3a2d712526.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/survivors/purple/demon_shoot_3.png"
+dest_files=["res://.godot/imported/demon_shoot_3.png-54f701a5507890268c518c3a2d712526.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
assets/textures/survivors/purple/demon_shoot_4.png


+ 34 - 0
assets/textures/survivors/purple/demon_shoot_4.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b23076s18srxm"
+path="res://.godot/imported/demon_shoot_4.png-bfc8b4fd10f45cca63b2cb46e2e06aa5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/survivors/purple/demon_shoot_4.png"
+dest_files=["res://.godot/imported/demon_shoot_4.png-bfc8b4fd10f45cca63b2cb46e2e06aa5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

+ 3 - 3
screens/game.gd

@@ -9,9 +9,9 @@ extends Node2D
 @onready var bot_scene: PackedScene = load("res://assets/scenes/bot.tscn")
 
 @onready var spawn_points: Array[Marker2D] = [
-	$EnemySpawn_1,
-	$EnemySpawn_2,
-	$EnemySpawn_3,
+	$EnemySpawns/EnemySpawn_1,
+	$EnemySpawns/EnemySpawn_2,
+	$EnemySpawns/EnemySpawn_3,
 ]
 
 func _ready() -> void:

+ 21 - 13
screens/game.tscn

@@ -1,4 +1,4 @@
-[gd_scene load_steps=9 format=3 uid="uid://c483fkssc36s"]
+[gd_scene load_steps=10 format=3 uid="uid://c483fkssc36s"]
 
 [ext_resource type="Script" path="res://screens/game.gd" id="1_4dd0q"]
 [ext_resource type="Texture2D" uid="uid://ceelbowk0q0rl" path="res://assets/textures/room/Light_Overlay.png" id="2_px5xi"]
@@ -6,6 +6,7 @@
 [ext_resource type="PackedScene" uid="uid://c27ceu18q8eyr" path="res://assets/scenes/room.tscn" id="3_hm7l7"]
 [ext_resource type="PackedScene" uid="uid://ce8cu4romympf" path="res://assets/scenes/transition.tscn" id="4_yc6k4"]
 [ext_resource type="PackedScene" uid="uid://cbmr1tbvbheda" path="res://assets/scenes/survivor_spot.tscn" id="6_c1csp"]
+[ext_resource type="PackedScene" uid="uid://bw0opjv1ewa8b" path="res://assets/scenes/player_spawn_zone.tscn" id="7_k4x0x"]
 
 [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_yhw6y"]
 blend_mode = 1
@@ -46,40 +47,47 @@ collision_mask = 12
 position = Vector2(639, 509)
 shape = SubResource("RectangleShape2D_p2163")
 
-[node name="EnemySpawn_1" type="Marker2D" parent="." groups=["spawner"]]
+[node name="PlayerSpawnZone" parent="." instance=ExtResource("7_k4x0x")]
+position = Vector2(635, 572)
+
+[node name="EnemySpawns" type="Node2D" parent="."]
+
+[node name="EnemySpawn_1" type="Marker2D" parent="EnemySpawns" groups=["spawner"]]
 position = Vector2(48, 426)
 
-[node name="EnemySpawn_2" type="Marker2D" parent="." groups=["spawner"]]
+[node name="EnemySpawn_2" type="Marker2D" parent="EnemySpawns" groups=["spawner"]]
 position = Vector2(1234, 424)
 
-[node name="EnemySpawn_3" type="Marker2D" parent="." groups=["spawner"]]
+[node name="EnemySpawn_3" type="Marker2D" parent="EnemySpawns" groups=["spawner"]]
 position = Vector2(641, 207)
 
-[node name="SurvivorSpot" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpots" type="Node2D" parent="."]
+
+[node name="SurvivorSpot" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(497, 451)
 
-[node name="SurvivorSpot7" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot7" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(575, 451)
 
-[node name="SurvivorSpot8" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot8" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(637, 451)
 
-[node name="SurvivorSpot9" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot9" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(701, 451)
 
-[node name="SurvivorSpot2" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot2" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(497, 511)
 
-[node name="SurvivorSpot3" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot3" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(497, 570)
 
-[node name="SurvivorSpot4" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot4" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(778, 451)
 
-[node name="SurvivorSpot5" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot5" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(778, 511)
 
-[node name="SurvivorSpot6" parent="." instance=ExtResource("6_c1csp")]
+[node name="SurvivorSpot6" parent="SurvivorSpots" instance=ExtResource("6_c1csp")]
 position = Vector2(778, 570)
 
 [connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]