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/Main.gd" type="Script" id=7]
[ext_resource path="res://src/ui/lobby.tscn" type="PackedScene" id=9]
@ -17,6 +19,9 @@ void vertex() {
shader = SubResource( 2 )
shader_param/cam_offset = Vector2( 0, 0 )
[sub_resource type="RectangleShape2D" id=4]
extents = Vector2( 160, 90 )
[node name="Main" type="Node2D"]
script = ExtResource( 7 )
@ -37,3 +42,22 @@ render_target_update_mode = 3
[node name="Lobby" parent="ViewportContainer/Viewport" instance=ExtResource( 9 )]
[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/audiostreamplayer_state_receiver.gd" type="Script" id=5]
[node name="Actor" type="KinematicBody2D"]
[node name="Actor" type="KinematicBody2D" groups=["world"]]
collision_layer = 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 = 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 ):
if current_music_track != _music_track:

View File

@ -6,6 +6,7 @@ signal player_list_changed()
signal connection_failed()
signal connection_succeeded()
signal game_ended()
signal game_started()
signal game_error(what)
# 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
emit_signal("connection_failed")
# Lobby management functions.
remote func register_player(new_player_name):
@ -82,12 +82,33 @@ func unregister_player(id):
players.erase(id)
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):
# Change scene.
var world :Node = load("res://src/levels/TestBox.tscn").instance()
var ui :Node = load("res://src/ui/HUD.tscn").instance()
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(ui)
@ -130,7 +151,7 @@ remote func pre_start_game(spawn_points):
remote func post_start_game():
get_tree().set_pause(false) # Unpause and unleash the game!
emit_signal("game_started")
remote func ready_to_start(id):
assert(get_tree().is_network_server())
@ -161,6 +182,8 @@ func join_game(ip, new_player_name):
func get_player_list():
return players.values()
func get_player_ids():
return players.keys()
func get_player_name():
return player_name
@ -184,9 +207,10 @@ func begin_game():
func end_game():
if has_node("/root/Main/ViewportContainer/Viewport/World"): # Game is in progress.
# End it
get_node("/root/Main/ViewportContainer/Viewport/World").queue_free()
get_tree().call_group("world","queue_free")
# if has_node("/root/Main/ViewportContainer/Viewport/World"): # Game is in progress.
# # End it
# get_node("/root/Main/ViewportContainer/Viewport/World").queue_free()
emit_signal("game_ended")
players.clear()

View File

@ -22,5 +22,7 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _process(delta):
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",
"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",
"class": "HealthComponent",
"language": "GDScript",
@ -160,7 +155,6 @@ _global_script_class_icons={
"AudioStreamPlayer_StateReceiver": "",
"CameraGuide": "",
"CollisionShape2D_StateReceiver": "",
"GitAPI": "",
"HealthComponent": "",
"HealthPickup": "",
"Interactable": "",

View File

@ -32,6 +32,5 @@ collision_mask = 256
script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraGuide"]
visible = false
shape = SubResource( 1 )
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():
movement_state_machine.change_to_known_state('death')
NetworkManager.end_game()

View File

@ -37,7 +37,6 @@
[sub_resource type="Resource" id=3]
resource_local_to_scene = true
resource_name = "hurt"
script = ExtResource( 18 )
debug_state = false
timeout_seconds = 2.0
@ -50,7 +49,6 @@ jerk_factor = 0.0
animation_sequence = [ "hurt" ]
[sub_resource type="Resource" id=4]
resource_name = "move_0"
script = ExtResource( 24 )
state_name = "move"
frame_number = 0
@ -58,7 +56,6 @@ sound_effect_type = 0
sound = ExtResource( 25 )
[sub_resource type="Resource" id=5]
resource_name = "move_4"
script = ExtResource( 24 )
state_name = "move"
frame_number = 4
@ -66,7 +63,6 @@ sound_effect_type = 0
sound = ExtResource( 25 )
[sub_resource type="Resource" id=6]
resource_name = "land_0"
script = ExtResource( 24 )
state_name = "land"
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.
func _ready():
pass # Replace with function body.
## Do not track until told to
disable_tracking()
func enable_tracking() -> void:
##TODO: add extra collission checks here to make sure we aren't stuck maybe?
_is_tracking = true
self.set_physics_process(true)
func disable_tracking() -> void:
_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 stuck_check: bool
@ -29,40 +36,41 @@ func _physics_process(delta):
#pos = lerp(pos, PlayerInfo.player_position, delta )
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
var diff_to = (player_position - pos)
var dist_to = (player_position - pos).length()
# Calculate how far the player is from object
var diff_to = (player_position - pos)
var dist_to = (player_position - pos).length()
# Determine the chase direction of player is past the threshold
# Try to prevent bounce
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)
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)
# Determine the chase direction of player is past the threshold
# Try to prevent bounce
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)
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)
# UiManager.debug_text = ( UiManager.debug_text +
# # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) +
# "\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}) +
# #"\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}) +
# "\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})
# #"\nDT: %7.2f" % dist_to
# )
# UiManager.debug_text = ( UiManager.debug_text +
# # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) +
# "\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}) +
# #"\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}) +
# "\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})
# #"\nDT: %7.2f" % dist_to
# )
# "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114})
#"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}")
# "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114})
#"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
# if flip_tracker < 10:
# move_and_slide(Vector2(60.2,0))
# elif flip_tracker < 20:
# move_and_slide(Vector2(-60.2,0))
# else:
# flip_tracker = 0.0
# flip_tracker += delta
# if flip_tracker < 10:
# move_and_slide(Vector2(60.2,0))
# elif flip_tracker < 20:
# move_and_slide(Vector2(-60.2,0))
# else:
# flip_tracker = 0.0

View File

@ -2,7 +2,7 @@ extends Position2D
## Represents a weapon that spawns and shoots bullets.
## 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
const BULLET_VELOCITY = 350
@ -48,19 +48,21 @@ func shoot(direction = 1):
# position.x = position.x * direction #shifting position before fire was unreliable
if not timer.is_stopped():
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):
# bullet.global_position = global_position
# else:
# bullet.global_position = global_position - Vector2(position.x * 2, 0)
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.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0)
bullet.set_as_toplevel(true)
add_child(bullet)
# add_child(bullet)
# sound_shoot.play()
timer.start()
return true

View File

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