Compare commits

...

3 Commits

Author SHA1 Message Date
67b228e60f Remote scene instantiation for projectiles WIP 2025-04-20 14:03:30 -07:00
590e786d83 Game resets on player death. 2025-04-20 09:10:08 -07:00
0ea4a45b06 Camera Fix 2025-04-18 21:14:59 -07:00
12 changed files with 121 additions and 60 deletions

View File

@ -1,5 +1,7 @@
[gd_scene load_steps=6 format=2] [gd_scene load_steps=9 format=2]
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=1]
[ext_resource path="res://src/Camera2D.gd" type="Script" id=2]
[ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4] [ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/Main.gd" type="Script" id=7] [ext_resource path="res://src/Main.gd" type="Script" id=7]
[ext_resource path="res://src/ui/lobby.tscn" type="PackedScene" id=9] [ext_resource path="res://src/ui/lobby.tscn" type="PackedScene" id=9]
@ -17,6 +19,9 @@ void vertex() {
shader = SubResource( 2 ) shader = SubResource( 2 )
shader_param/cam_offset = Vector2( 0, 0 ) shader_param/cam_offset = Vector2( 0, 0 )
[sub_resource type="RectangleShape2D" id=4]
extents = Vector2( 160, 90 )
[node name="Main" type="Node2D"] [node name="Main" type="Node2D"]
script = ExtResource( 7 ) script = ExtResource( 7 )
@ -37,3 +42,22 @@ render_target_update_mode = 3
[node name="Lobby" parent="ViewportContainer/Viewport" instance=ExtResource( 9 )] [node name="Lobby" parent="ViewportContainer/Viewport" instance=ExtResource( 9 )]
[node name="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )] [node name="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )]
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"]
unique_name_in_owner = true
position = Vector2( 160, 90 )
current = true
script = ExtResource( 2 )
tracking_node_path = NodePath("../CameraGuide")
[node name="CameraGuide" type="KinematicBody2D" parent="ViewportContainer/Viewport"]
unique_name_in_owner = true
position = Vector2( 160, 90 )
collision_layer = 0
collision_mask = 256
script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/CameraGuide"]
visible = false
shape = SubResource( 4 )
one_way_collision = true

View File

@ -6,7 +6,7 @@
[ext_resource path="res://lib/classes/animated_sprite_state_receiver.gd" type="Script" id=4] [ext_resource path="res://lib/classes/animated_sprite_state_receiver.gd" type="Script" id=4]
[ext_resource path="res://lib/classes/audiostreamplayer_state_receiver.gd" type="Script" id=5] [ext_resource path="res://lib/classes/audiostreamplayer_state_receiver.gd" type="Script" id=5]
[node name="Actor" type="KinematicBody2D"] [node name="Actor" type="KinematicBody2D" groups=["world"]]
collision_layer = 2 collision_layer = 2
script = ExtResource( 2 ) script = ExtResource( 2 )

View File

@ -11,7 +11,18 @@ onready var current_music_track :AudioStream
onready var viewport_container = get_node("/root/Main/ViewportContainer") #$ViewportContainer onready var viewport_container = get_node("/root/Main/ViewportContainer") #$ViewportContainer
onready var viewport = get_node("/root/Main/ViewportContainer/Viewport") # $ViewportContainer/Viewport onready var viewport = get_node("/root/Main/ViewportContainer/Viewport") # $ViewportContainer/Viewport
onready var camera_guide :CameraGuide = get_node("/root/Main/ViewportContainer/Viewport/World/CameraGuide") onready var camera_guide :CameraGuide = get_node("/root/Main/ViewportContainer/Viewport/CameraGuide")
func _ready():
NetworkManager.connect("game_started", self, "_on_game_started")
NetworkManager.connect("game_ended", self, "_on_game_ended")
func _on_game_started():
camera_guide.enable_tracking()
func _on_game_ended():
camera_guide.disable_tracking()
camera_guide.reset_position()
func change_music_track(_music_track :AudioStream ): func change_music_track(_music_track :AudioStream ):
if current_music_track != _music_track: if current_music_track != _music_track:

View File

@ -6,6 +6,7 @@ signal player_list_changed()
signal connection_failed() signal connection_failed()
signal connection_succeeded() signal connection_succeeded()
signal game_ended() signal game_ended()
signal game_started()
signal game_error(what) signal game_error(what)
# Default game server port. Can be any number between 1024 and 49151. # Default game server port. Can be any number between 1024 and 49151.
@ -68,7 +69,6 @@ func _connected_fail():
get_tree().set_network_peer(null) # Remove peer get_tree().set_network_peer(null) # Remove peer
emit_signal("connection_failed") emit_signal("connection_failed")
# Lobby management functions. # Lobby management functions.
remote func register_player(new_player_name): remote func register_player(new_player_name):
@ -82,12 +82,33 @@ func unregister_player(id):
players.erase(id) players.erase(id)
emit_signal("player_list_changed") emit_signal("player_list_changed")
remote func load_scene_on_all_clients(_scene :PackedScene, _node_path :NodePath, _global_position :Vector2 , _as_toplevel = true):
print("did I not get called others: ", players.size())
var new_scene = _scene.instance()
var _caller_id = get_tree().get_rpc_sender_id()
new_scene.set_network_master(_caller_id)
new_scene.set_as_toplevel(_as_toplevel)
new_scene.global_position = _global_position
get_node(_node_path).add_child(new_scene)
for _player in players:
rpc_id(_player, "load_scene_on_all_clients", _scene, _node_path, _global_position, _as_toplevel )
if new_scene.get_network_master() == _caller_id:
return new_scene
else:
return null
remote func pre_start_game(spawn_points): remote func pre_start_game(spawn_points):
# Change scene. # Change scene.
var world :Node = load("res://src/levels/TestBox.tscn").instance() var world :Node = load("res://src/levels/TestBox.tscn").instance()
var ui :Node = load("res://src/ui/HUD.tscn").instance() var ui :Node = load("res://src/ui/HUD.tscn").instance()
world.set_name("World") world.set_name("World")
world.add_to_group('world')
ui.add_to_group('world')
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(world) get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(world)
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(ui) get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(ui)
@ -130,7 +151,7 @@ remote func pre_start_game(spawn_points):
remote func post_start_game(): remote func post_start_game():
get_tree().set_pause(false) # Unpause and unleash the game! get_tree().set_pause(false) # Unpause and unleash the game!
emit_signal("game_started")
remote func ready_to_start(id): remote func ready_to_start(id):
assert(get_tree().is_network_server()) assert(get_tree().is_network_server())
@ -161,6 +182,8 @@ func join_game(ip, new_player_name):
func get_player_list(): func get_player_list():
return players.values() return players.values()
func get_player_ids():
return players.keys()
func get_player_name(): func get_player_name():
return player_name return player_name
@ -184,9 +207,10 @@ func begin_game():
func end_game(): func end_game():
if has_node("/root/Main/ViewportContainer/Viewport/World"): # Game is in progress. get_tree().call_group("world","queue_free")
# End it # if has_node("/root/Main/ViewportContainer/Viewport/World"): # Game is in progress.
get_node("/root/Main/ViewportContainer/Viewport/World").queue_free() # # End it
# get_node("/root/Main/ViewportContainer/Viewport/World").queue_free()
emit_signal("game_ended") emit_signal("game_ended")
players.clear() players.clear()

View File

@ -22,5 +22,7 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta): func _process(delta):
# pass debug_text = ''
for _player_id in NetworkManager.get_player_ids():
debug_text += str(_player_id) + '\n'

View File

@ -34,11 +34,6 @@ _global_script_classes=[ {
"language": "GDScript", "language": "GDScript",
"path": "res://lib/classes/collision_shape2D_state_receiver.gd" "path": "res://lib/classes/collision_shape2D_state_receiver.gd"
}, { }, {
"base": "",
"class": "GitAPI",
"language": "NativeScript",
"path": "res://addons/godot-git-plugin/git_api.gdns"
}, {
"base": "Node", "base": "Node",
"class": "HealthComponent", "class": "HealthComponent",
"language": "GDScript", "language": "GDScript",
@ -160,7 +155,6 @@ _global_script_class_icons={
"AudioStreamPlayer_StateReceiver": "", "AudioStreamPlayer_StateReceiver": "",
"CameraGuide": "", "CameraGuide": "",
"CollisionShape2D_StateReceiver": "", "CollisionShape2D_StateReceiver": "",
"GitAPI": "",
"HealthComponent": "", "HealthComponent": "",
"HealthPickup": "", "HealthPickup": "",
"Interactable": "", "Interactable": "",

View File

@ -32,6 +32,5 @@ collision_mask = 256
script = ExtResource( 1 ) script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraGuide"] [node name="CollisionShape2D" type="CollisionShape2D" parent="CameraGuide"]
visible = false
shape = SubResource( 1 ) shape = SubResource( 1 )
one_way_collision = true one_way_collision = true

View File

@ -200,3 +200,4 @@ func _on_Movement_StateMachine_state_changed(old_state_name, new_state):
func _on_Health_Component_health_depleted(): func _on_Health_Component_health_depleted():
movement_state_machine.change_to_known_state('death') movement_state_machine.change_to_known_state('death')
NetworkManager.end_game()

View File

@ -37,7 +37,6 @@
[sub_resource type="Resource" id=3] [sub_resource type="Resource" id=3]
resource_local_to_scene = true resource_local_to_scene = true
resource_name = "hurt"
script = ExtResource( 18 ) script = ExtResource( 18 )
debug_state = false debug_state = false
timeout_seconds = 2.0 timeout_seconds = 2.0
@ -50,7 +49,6 @@ jerk_factor = 0.0
animation_sequence = [ "hurt" ] animation_sequence = [ "hurt" ]
[sub_resource type="Resource" id=4] [sub_resource type="Resource" id=4]
resource_name = "move_0"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "move" state_name = "move"
frame_number = 0 frame_number = 0
@ -58,7 +56,6 @@ sound_effect_type = 0
sound = ExtResource( 25 ) sound = ExtResource( 25 )
[sub_resource type="Resource" id=5] [sub_resource type="Resource" id=5]
resource_name = "move_4"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "move" state_name = "move"
frame_number = 4 frame_number = 4
@ -66,7 +63,6 @@ sound_effect_type = 0
sound = ExtResource( 25 ) sound = ExtResource( 25 )
[sub_resource type="Resource" id=6] [sub_resource type="Resource" id=6]
resource_name = "land_0"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "land" state_name = "land"
frame_number = 0 frame_number = 0

View File

@ -12,14 +12,21 @@ var _is_tracking :bool = true
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
pass # Replace with function body. ## Do not track until told to
disable_tracking()
func enable_tracking() -> void: func enable_tracking() -> void:
##TODO: add extra collission checks here to make sure we aren't stuck maybe? ##TODO: add extra collission checks here to make sure we aren't stuck maybe?
_is_tracking = true _is_tracking = true
self.set_physics_process(true)
func disable_tracking() -> void: func disable_tracking() -> void:
_is_tracking = false _is_tracking = false
self.set_physics_process(false)
func reset_position() -> void:
## Set to half screen
global_position = game_size / 2
var flip_tracker = 0.0 var flip_tracker = 0.0
var stuck_check: bool var stuck_check: bool
@ -29,40 +36,41 @@ func _physics_process(delta):
#pos = lerp(pos, PlayerInfo.player_position, delta ) #pos = lerp(pos, PlayerInfo.player_position, delta )
var dir_to = Vector2(0,0) var dir_to = Vector2(0,0)
var player_position = PlayerInfo.get_player_data(0).player_position if (PlayerInfo.get_player_data(0)):
var player_position = PlayerInfo.get_player_data(0).player_position
# Calculate how far the player is from object # Calculate how far the player is from object
var diff_to = (player_position - pos) var diff_to = (player_position - pos)
var dist_to = (player_position - pos).length() var dist_to = (player_position - pos).length()
# Determine the chase direction of player is past the threshold # Determine the chase direction of player is past the threshold
# Try to prevent bounce # Try to prevent bounce
if (is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.x) > 10: if (is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.x) > 10:
dir_to = pos.direction_to(player_position) dir_to = pos.direction_to(player_position)
elif !(is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.y) > 10: elif !(is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.y) > 10:
dir_to = pos.direction_to(player_position) dir_to = pos.direction_to(player_position)
# UiManager.debug_text = ( UiManager.debug_text + # UiManager.debug_text = ( UiManager.debug_text +
# # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) + # # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) +
# "\n" + str(is_on_ceiling()) + str(is_on_floor()) + str(is_on_wall()) + # "\n" + str(is_on_ceiling()) + str(is_on_floor()) + str(is_on_wall()) +
# "\nPP: {0}, {1}".format({"0":"%7.2f" % PlayerInfo.player_position.x, "1":"%7.2f" % PlayerInfo.player_position.y}) + # "\nPP: {0}, {1}".format({"0":"%7.2f" % PlayerInfo.player_position.x, "1":"%7.2f" % PlayerInfo.player_position.y}) +
# #"\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) + # #"\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) +
# "\nKB: {0}, {1}".format({"0":"%7.2f" % global_position.x, "1":"%7.2f" % global_position.y}) + # "\nKB: {0}, {1}".format({"0":"%7.2f" % global_position.x, "1":"%7.2f" % global_position.y}) +
# "\nDir to: {0}, {1}".format({"0":"%7.2f" % dir_to.x, "1":"%7.2f" % dir_to.y}) + # "\nDir to: {0}, {1}".format({"0":"%7.2f" % dir_to.x, "1":"%7.2f" % dir_to.y}) +
# "\nPoint to: {0}, {1}".format({"0":"%7.2f" % diff_to.x, "1":"%7.2f" % diff_to.y}) # "\nPoint to: {0}, {1}".format({"0":"%7.2f" % diff_to.x, "1":"%7.2f" % diff_to.y})
# #"\nDT: %7.2f" % dist_to # #"\nDT: %7.2f" % dist_to
# ) # )
# "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) # "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114})
#"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}") #"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}")
move_and_slide(dir_to * 180.0 ) move_and_slide(dir_to * 180.0 )
# flip_tracker += delta # flip_tracker += delta
# if flip_tracker < 10: # if flip_tracker < 10:
# move_and_slide(Vector2(60.2,0)) # move_and_slide(Vector2(60.2,0))
# elif flip_tracker < 20: # elif flip_tracker < 20:
# move_and_slide(Vector2(-60.2,0)) # move_and_slide(Vector2(-60.2,0))
# else: # else:
# flip_tracker = 0.0 # flip_tracker = 0.0

View File

@ -2,7 +2,7 @@ extends Position2D
## Represents a weapon that spawns and shoots bullets. ## Represents a weapon that spawns and shoots bullets.
## The Cooldown timer controls the cooldown duration between shots. ## The Cooldown timer controls the cooldown duration between shots.
export var scene_path :Resource export var scene_path :PackedScene
export var pew_cooldown_time :float = 1.0 export var pew_cooldown_time :float = 1.0
const BULLET_VELOCITY = 350 const BULLET_VELOCITY = 350
@ -48,19 +48,21 @@ func shoot(direction = 1):
# position.x = position.x * direction #shifting position before fire was unreliable # position.x = position.x * direction #shifting position before fire was unreliable
if not timer.is_stopped(): if not timer.is_stopped():
return false return false
var bullet = loaded_scene.instance() #var bullet = loaded_scene.instance()
var bullet = NetworkManager.load_scene_on_all_clients(loaded_scene, self.get_path(), global_position , true)
# if (direction > 0): # if (direction > 0):
# bullet.global_position = global_position # bullet.global_position = global_position
# else: # else:
# bullet.global_position = global_position - Vector2(position.x * 2, 0) # bullet.global_position = global_position - Vector2(position.x * 2, 0)
if bullet is Projectile: if bullet is Projectile:
bullet.global_position = global_position print ("i'm a projectile")
# bullet.global_position = global_position
bullet.direction_normal = normal_vector bullet.direction_normal = normal_vector
#bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0) #bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0)
bullet.set_as_toplevel(true) bullet.set_as_toplevel(true)
add_child(bullet) # add_child(bullet)
# sound_shoot.play() # sound_shoot.play()
timer.start() timer.start()
return true return true

View File

@ -7,7 +7,7 @@
radius = 6.0 radius = 6.0
height = 2.0 height = 2.0
[node name="MushroomPew" instance=ExtResource( 1 )] [node name="MushroomPew" groups=["world"] instance=ExtResource( 1 )]
velocity_pps = 300.0 velocity_pps = 300.0
lifespan = 0.5 lifespan = 0.5