Compare commits
17 Commits
c17289f385
...
a0d94d6354
| Author | SHA1 | Date | |
|---|---|---|---|
| a0d94d6354 | |||
| 08b49022ff | |||
| 5ba9c972e6 | |||
| 07e98d0736 | |||
| 33a9848524 | |||
| 6dc98d7993 | |||
| 67b228e60f | |||
| 590e786d83 | |||
| 0ea4a45b06 | |||
| bde9492c63 | |||
| 032d2583e6 | |||
| 9283a3263f | |||
| 0248be637d | |||
| 8a29cc5be3 | |||
| ae3da7a468 | |||
| 8acc796245 | |||
| 3ab3f33abd |
50
Main.tscn
50
Main.tscn
|
|
@ -1,13 +1,10 @@
|
||||||
[gd_scene load_steps=12 format=2]
|
[gd_scene load_steps=9 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://src/Camera2D.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=3]
|
|
||||||
[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/classes/camera_guide.gd" type="Script" id=5]
|
|
||||||
[ext_resource path="res://src/Camera2D.gd" type="Script" id=6]
|
|
||||||
[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://assets/items/mushroom_icon.png" type="Texture" id=8]
|
[ext_resource path="res://src/ui/lobby.tscn" type="PackedScene" id=9]
|
||||||
|
|
||||||
[sub_resource type="Shader" id=2]
|
[sub_resource type="Shader" id=2]
|
||||||
code = "shader_type canvas_item;
|
code = "shader_type canvas_item;
|
||||||
|
|
@ -22,7 +19,7 @@ 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=1]
|
[sub_resource type="RectangleShape2D" id=4]
|
||||||
extents = Vector2( 160, 90 )
|
extents = Vector2( 160, 90 )
|
||||||
|
|
||||||
[node name="Main" type="Node2D"]
|
[node name="Main" type="Node2D"]
|
||||||
|
|
@ -42,41 +39,26 @@ size = Vector2( 320, 180 )
|
||||||
handle_input_locally = false
|
handle_input_locally = false
|
||||||
render_target_update_mode = 3
|
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="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )]
|
||||||
|
|
||||||
[node name="TestBox" parent="ViewportContainer/Viewport" instance=ExtResource( 2 )]
|
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"]
|
||||||
__meta__ = {
|
unique_name_in_owner = true
|
||||||
"_edit_lock_": true
|
position = Vector2( 160, 90 )
|
||||||
}
|
current = true
|
||||||
|
script = ExtResource( 2 )
|
||||||
[node name="PlayerE" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )]
|
tracking_node_path = NodePath("../CameraGuide")
|
||||||
position = Vector2( 112, 56 )
|
|
||||||
|
|
||||||
[node name="PlayerE2" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )]
|
|
||||||
position = Vector2( 112, 56 )
|
|
||||||
player_number = 2
|
|
||||||
|
|
||||||
[node name="UI_Layer" parent="ViewportContainer/Viewport" instance=ExtResource( 3 )]
|
|
||||||
|
|
||||||
[node name="CameraGuide" type="KinematicBody2D" parent="ViewportContainer/Viewport"]
|
[node name="CameraGuide" type="KinematicBody2D" parent="ViewportContainer/Viewport"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
position = Vector2( 160, 90 )
|
position = Vector2( 160, 90 )
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
collision_mask = 256
|
collision_mask = 256
|
||||||
script = ExtResource( 5 )
|
script = ExtResource( 1 )
|
||||||
|
debug_camera_guide = true
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/CameraGuide"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/CameraGuide"]
|
||||||
visible = false
|
visible = false
|
||||||
shape = SubResource( 1 )
|
shape = SubResource( 4 )
|
||||||
one_way_collision = true
|
one_way_collision = true
|
||||||
|
|
||||||
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"]
|
|
||||||
unique_name_in_owner = true
|
|
||||||
position = Vector2( 160, 90 )
|
|
||||||
current = true
|
|
||||||
script = ExtResource( 6 )
|
|
||||||
tracking_node_path = NodePath("../CameraGuide")
|
|
||||||
|
|
||||||
[node name="MushroomIcon" type="Sprite" parent="ViewportContainer/Viewport"]
|
|
||||||
position = Vector2( 60, 160 )
|
|
||||||
texture = ExtResource( 8 )
|
|
||||||
|
|
|
||||||
|
|
@ -1,67 +1,49 @@
|
||||||
class_name Actor
|
class_name Actor
|
||||||
extends KinematicBody2D
|
extends KinematicBody2D
|
||||||
|
|
||||||
#var velocity = Vector2(0,0)
|
|
||||||
#var direction = Vector2(-1,0)
|
|
||||||
|
|
||||||
export(String, "Player", "Enemy", "NPC", "Object") var actor_type
|
export(String, "Player", "Enemy", "NPC", "Object") var actor_type
|
||||||
#export var sprite_facing_right: bool = true
|
#export var sprite_facing_right: bool = true
|
||||||
export var debug_actor: bool = false
|
export var debug_actor: bool = false
|
||||||
|
|
||||||
|
|
||||||
#onready var movement_animations: AnimatedSprite = $AnimatedSprite
|
|
||||||
|
|
||||||
onready var sound_effect_player: AudioStreamPlayer = $AudioStreamPlayer_StateReceiver
|
onready var sound_effect_player: AudioStreamPlayer = $AudioStreamPlayer_StateReceiver
|
||||||
|
|
||||||
#onready var movement_component: MovementComponent = $movement_component
|
|
||||||
onready var movement_component: Movement_StateReceiver = $Movement_StateReceiver
|
onready var movement_component: Movement_StateReceiver = $Movement_StateReceiver
|
||||||
|
|
||||||
#onready var movement_state_machine: StateMachineAnimatedActor = $movement_state_machine
|
|
||||||
onready var movement_state_machine: StateMachine = $Movement_StateMachine
|
onready var movement_state_machine: StateMachine = $Movement_StateMachine
|
||||||
|
|
||||||
|
onready var animated_sprite : AnimatedSprite = $AnimatedSprite_StateReceiver
|
||||||
|
|
||||||
|
## Multiplayer Variables
|
||||||
|
puppet var puppet_pos = Vector2()
|
||||||
|
puppet var puppet_transform: Transform2D
|
||||||
|
|
||||||
##TODO:
|
|
||||||
# Can't seem to implement the ready and process node functions
|
|
||||||
# without causing a double run somehow. Not sure why.
|
|
||||||
# not a huge deal because this is mostly to help with
|
|
||||||
# interfaces for the state machines.
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
pass
|
puppet_transform = transform
|
||||||
#movement_state_machine.init_animated_actor(self)
|
|
||||||
#movement_component.attack_function = funcref(self, "attack")
|
|
||||||
# movement_component.player_number = player_number
|
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if is_network_master():
|
||||||
if actor_type == "Player":
|
if actor_type == "Player":
|
||||||
movement_component.process_input(event)
|
movement_component.process_unhandled_input(event)
|
||||||
#movement_state_machine.process_input(event)
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
# Input based or polling input is not done in _unhandled_input
|
# Input based or polling input is not done in _unhandled_input
|
||||||
# gives us the ability to turn off polling this way
|
# gives us the ability to turn off polling this way
|
||||||
|
if is_network_master():
|
||||||
if actor_type == "Player":
|
if actor_type == "Player":
|
||||||
movement_component.process_physics_input(delta)
|
movement_component.process_physics_input(delta)
|
||||||
movement_component.process_physics(delta)
|
movement_component.process_physics(delta)
|
||||||
#movement_state_machine.process_physics(delta)
|
rset("puppet_pos", position)
|
||||||
#
|
rset("puppet_transform", transform)
|
||||||
#func _process(delta: float) -> void:
|
else:
|
||||||
# if actor_type == "NPC" or actor_type == "Enemy":
|
position = puppet_pos
|
||||||
# movement_component.process(delta)
|
transform = puppet_transform
|
||||||
# movement_state_machine.process_frame(delta)
|
|
||||||
## PlayerInfo.player_position = global_position
|
func _process(delta: float) -> void:
|
||||||
# #play_sound_frame(movement_animations.animation , movement_animations.frame)
|
if actor_type == "NPC" or actor_type == "Enemy":
|
||||||
|
if is_network_master():
|
||||||
|
movement_component.process(delta)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func attack():
|
|
||||||
#print(self.name, ": It's not inheritence, it's funcrefs")
|
|
||||||
# if movement_state_machine.current_state.name != 'attack':
|
|
||||||
# if($movement_state_machine/attack):
|
|
||||||
# movement_state_machine.change_state($movement_state_machine/attack)
|
|
||||||
# if ($Hitbox_Component/CollisionShape2D):
|
|
||||||
# #print(self.name, ": Found a hitbox")
|
|
||||||
# var hit_box = $Hitbox_Component
|
|
||||||
# hit_box.set_hitbox(true)
|
|
||||||
pass
|
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ func process(delta):
|
||||||
call('_state_process_' + current_state.name)
|
call('_state_process_' + current_state.name)
|
||||||
|
|
||||||
# For event based input polling (Hadouken?)
|
# For event based input polling (Hadouken?)
|
||||||
func process_input(event: InputEvent):
|
func process_unhandled_input(event: InputEvent):
|
||||||
# Reset desired movement vector
|
# Reset desired movement vector
|
||||||
desired_movement_vector = Vector2(0,0)
|
desired_movement_vector = Vector2(0,0)
|
||||||
if has_method('_state_process_input_' + current_state.name):
|
if has_method('_state_process_input_' + current_state.name):
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,9 @@ func change_state(new_state: State) -> void:
|
||||||
current_state = new_state
|
current_state = new_state
|
||||||
current_state.enter()
|
current_state.enter()
|
||||||
|
|
||||||
|
#puppet puppet_change_state(new_state: State) -> void:
|
||||||
|
# pass
|
||||||
|
|
||||||
# Seems like I don't have to do this every state change!
|
# Seems like I don't have to do this every state change!
|
||||||
# if(state_modifiers.size() > 0):
|
# if(state_modifiers.size() > 0):
|
||||||
# print("Active Modifiers:")
|
# print("Active Modifiers:")
|
||||||
|
|
@ -90,7 +93,7 @@ func change_state(new_state: State) -> void:
|
||||||
|
|
||||||
emit_signal("state_changed",current_state_name,current_state)
|
emit_signal("state_changed",current_state_name,current_state)
|
||||||
|
|
||||||
func change_to_known_state(new_state_name: String) -> void:
|
puppet func puppet_change_to_known_state(new_state_name: String) -> void:
|
||||||
if new_state_name.empty() == false:
|
if new_state_name.empty() == false:
|
||||||
if states_index.has(new_state_name):
|
if states_index.has(new_state_name):
|
||||||
change_state(states_index[new_state_name])
|
change_state(states_index[new_state_name])
|
||||||
|
|
@ -98,6 +101,16 @@ func change_to_known_state(new_state_name: String) -> void:
|
||||||
push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name)
|
push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name)
|
||||||
change_state(states_index["default"])
|
change_state(states_index["default"])
|
||||||
|
|
||||||
|
func change_to_known_state(new_state_name: String) -> void:
|
||||||
|
if is_network_master():
|
||||||
|
if new_state_name.empty() == false:
|
||||||
|
if states_index.has(new_state_name):
|
||||||
|
change_state(states_index[new_state_name])
|
||||||
|
else:
|
||||||
|
push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name)
|
||||||
|
change_state(states_index["default"])
|
||||||
|
rpc("puppet_change_to_known_state", new_state_name)
|
||||||
|
|
||||||
#func check_parent_before_state_change(new_state_name: String) -> bool:
|
#func check_parent_before_state_change(new_state_name: String) -> bool:
|
||||||
# ##TODO: Make this a verifiable funcref or something
|
# ##TODO: Make this a verifiable funcref or something
|
||||||
# if get_parent().has_method("check_state_change"):
|
# if get_parent().has_method("check_state_change"):
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,17 @@ onready var viewport_container = get_node("/root/Main/ViewportContainer") #$View
|
||||||
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/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:
|
||||||
current_music_track = _music_track
|
current_music_track = _music_track
|
||||||
|
|
@ -38,20 +49,27 @@ func change_level(_level_name :String, _position_name :String):
|
||||||
var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance()
|
var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance()
|
||||||
#print (get_tree().get_root().get_children())
|
#print (get_tree().get_root().get_children())
|
||||||
|
|
||||||
for l in get_node("/root/Main/ViewportContainer/Viewport").get_children():
|
for l in viewport.get_children():
|
||||||
#print (get_node("/root/Main").get_children())
|
#print (get_node("/root/Main").get_children())
|
||||||
if l is Level:
|
if l is Level:
|
||||||
camera_guide.disable_tracking()
|
camera_guide.disable_tracking()
|
||||||
SceneTransition.transition_dissolve("foo")
|
##TODO: Disabled signal based yield because I think it was taking too long
|
||||||
yield(SceneTransition,"done")
|
# No more errors but I'd like to know how to do this.
|
||||||
|
#SceneTransition.transition_dissolve("foo")
|
||||||
|
#yield(SceneTransition,"done")
|
||||||
|
yield(SceneTransition.transition_dissolve(), "completed")
|
||||||
print(l)
|
print(l)
|
||||||
get_node("/root/Main/ViewportContainer/Viewport").remove_child(l)
|
viewport.remove_child(l)
|
||||||
get_node("/root/Main/ViewportContainer/Viewport").add_child(new_level)
|
viewport.add_child(new_level)
|
||||||
get_node("/root/Main/ViewportContainer/Viewport").move_child(new_level,1)
|
##TODO: make this right below scene transition
|
||||||
|
viewport.move_child(new_level,2)
|
||||||
|
#get_node("/root/Main/ViewportContainer/Viewport/World").remove_child(l)
|
||||||
|
#get_node("/root/Main/ViewportContainer/Viewport/World").add_child(new_level)
|
||||||
|
#get_node("/root/Main/ViewportContainer/Viewport/World").move_child(new_level,1)
|
||||||
##TODO: Probably set start position
|
##TODO: Probably set start position
|
||||||
if new_level.entrances.has(_position_name):
|
if new_level.entrances.has(_position_name):
|
||||||
player_start_position = new_level.entrances[_position_name].transform.origin
|
player_start_position = new_level.entrances[_position_name].transform.origin
|
||||||
print (get_node("/root/Main/ViewportContainer/Viewport").get_children())
|
#print (get_node("/root/Main/ViewportContainer/Viewport").get_children())
|
||||||
#get_node("/root/Main/ViewportContainer/Viewport/CameraGuide").global_position = Vector2(160,90)
|
#get_node("/root/Main/ViewportContainer/Viewport/CameraGuide").global_position = Vector2(160,90)
|
||||||
SceneTransition.reset()
|
SceneTransition.reset()
|
||||||
camera_guide.transform.origin = Vector2(160,90)
|
camera_guide.transform.origin = Vector2(160,90)
|
||||||
|
|
|
||||||
236
lib/singleton_autoloads/NetworkManager.gd
Normal file
236
lib/singleton_autoloads/NetworkManager.gd
Normal file
|
|
@ -0,0 +1,236 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
|
||||||
|
# Signals to let lobby GUI know what's going on.
|
||||||
|
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.
|
||||||
|
# Not on the list of registered or common ports as of November 2020:
|
||||||
|
# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
|
||||||
|
const DEFAULT_PORT = 10567
|
||||||
|
|
||||||
|
# Max number of players.
|
||||||
|
const MAX_PEERS = 4
|
||||||
|
|
||||||
|
var peer = null
|
||||||
|
|
||||||
|
# Name for my player.
|
||||||
|
var player_name = "The Warrior"
|
||||||
|
|
||||||
|
# Names for remote players in id:name format.
|
||||||
|
var players = {}
|
||||||
|
var players_ready = []
|
||||||
|
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
get_tree().connect("network_peer_connected", self, "_player_connected")
|
||||||
|
get_tree().connect("network_peer_disconnected", self,"_player_disconnected")
|
||||||
|
get_tree().connect("connected_to_server", self, "_connected_ok")
|
||||||
|
get_tree().connect("connection_failed", self, "_connected_fail")
|
||||||
|
get_tree().connect("server_disconnected", self, "_server_disconnected")
|
||||||
|
|
||||||
|
|
||||||
|
# Callback from SceneTree.
|
||||||
|
func _player_connected(id):
|
||||||
|
# Registration of a client beings here, tell the connected player that we are here.
|
||||||
|
rpc_id(id, "register_player", player_name)
|
||||||
|
|
||||||
|
|
||||||
|
# Callback from SceneTree.
|
||||||
|
func _player_disconnected(id):
|
||||||
|
##TODO: Need better way to determine a game is running
|
||||||
|
if has_node("/root/Main/ViewportContainer/Viewport/1"): # Game is in progress.
|
||||||
|
if get_tree().is_network_server():
|
||||||
|
emit_signal("game_error", "Player " + players[id] + " disconnected")
|
||||||
|
end_game()
|
||||||
|
else: # Game is not in progress.
|
||||||
|
# Unregister this player.
|
||||||
|
unregister_player(id)
|
||||||
|
|
||||||
|
|
||||||
|
# Callback from SceneTree, only for clients (not server).
|
||||||
|
func _connected_ok():
|
||||||
|
# We just connected to a server
|
||||||
|
emit_signal("connection_succeeded")
|
||||||
|
|
||||||
|
|
||||||
|
# Callback from SceneTree, only for clients (not server).
|
||||||
|
func _server_disconnected():
|
||||||
|
emit_signal("game_error", "Server disconnected")
|
||||||
|
end_game()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Callback from SceneTree, only for clients (not server).
|
||||||
|
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):
|
||||||
|
var id = get_tree().get_rpc_sender_id()
|
||||||
|
print(id)
|
||||||
|
players[id] = new_player_name
|
||||||
|
emit_signal("player_list_changed")
|
||||||
|
|
||||||
|
|
||||||
|
func unregister_player(id):
|
||||||
|
players.erase(id)
|
||||||
|
emit_signal("player_list_changed")
|
||||||
|
|
||||||
|
func instance_on_peer_players(_scene :Resource, _node_path :NodePath, _global_position :Vector2 , _as_toplevel = true):
|
||||||
|
# print ("Scene Path: ", _scene.resource_path,
|
||||||
|
# " Instance At: ", _node_path,
|
||||||
|
# " Position : ", _global_position)
|
||||||
|
|
||||||
|
## was going to create local instance here but, lets see if I don't have to.
|
||||||
|
## makes me thing that node name and path must be very important for multiplayer
|
||||||
|
rpc("load_scene_on_all_clients", _scene.resource_path, _node_path, _global_position, _as_toplevel)
|
||||||
|
|
||||||
|
## remote means only runs on peers, remotesync goes both here and in peers
|
||||||
|
## because I want the node I load in two steps
|
||||||
|
remote func load_scene_on_all_clients(_scene :String, _node_path :NodePath, _global_position :Vector2 , _as_toplevel = true):
|
||||||
|
print ( "-- Remote Scene Call -- \n",
|
||||||
|
" Scene Path: ", _scene,
|
||||||
|
" Instance At: ", _node_path,
|
||||||
|
" Position : ", _global_position)
|
||||||
|
|
||||||
|
var new_scene = load(_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)
|
||||||
|
|
||||||
|
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport/Lobby").hide()
|
||||||
|
|
||||||
|
## Clear the PlayerInfo table in case this is a restart.
|
||||||
|
PlayerInfo.reset()
|
||||||
|
var player_scene = load("res://src/actors/players/playerE/PlayerE.tscn")
|
||||||
|
|
||||||
|
|
||||||
|
for p_id in spawn_points:
|
||||||
|
#var spawn_pos = world.get_node("SpawnPoints/" + str(spawn_points[p_id])).position
|
||||||
|
var player = player_scene.instance()
|
||||||
|
|
||||||
|
player.set_name(str(p_id)) # Use unique ID as node name.
|
||||||
|
#player.position=spawn_pos
|
||||||
|
player.set_network_master(p_id) #set unique id as master.
|
||||||
|
|
||||||
|
# We don't yet use a player name like a node yet
|
||||||
|
# if p_id == get_tree().get_network_unique_id():
|
||||||
|
# # If node for this peer id, set name.
|
||||||
|
# player.set_player_name(player_name)
|
||||||
|
# else:
|
||||||
|
# # Otherwise set name from peer.
|
||||||
|
# player.set_player_name(players[p_id])
|
||||||
|
|
||||||
|
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(player)
|
||||||
|
#world.get_node("Players").add_child(player)
|
||||||
|
|
||||||
|
# # Set up score.
|
||||||
|
# world.get_node("Score").add_player(get_tree().get_network_unique_id(), player_name)
|
||||||
|
# for pn in players:
|
||||||
|
# world.get_node("Score").add_player(pn, players[pn])
|
||||||
|
|
||||||
|
if not get_tree().is_network_server():
|
||||||
|
# Tell server we are ready to start.
|
||||||
|
rpc_id(1, "ready_to_start", get_tree().get_network_unique_id())
|
||||||
|
elif players.size() == 0:
|
||||||
|
post_start_game()
|
||||||
|
|
||||||
|
|
||||||
|
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())
|
||||||
|
|
||||||
|
if not id in players_ready:
|
||||||
|
players_ready.append(id)
|
||||||
|
|
||||||
|
if players_ready.size() == players.size():
|
||||||
|
for p in players:
|
||||||
|
rpc_id(p, "post_start_game")
|
||||||
|
post_start_game()
|
||||||
|
|
||||||
|
|
||||||
|
func host_game(new_player_name):
|
||||||
|
player_name = new_player_name
|
||||||
|
peer = NetworkedMultiplayerENet.new()
|
||||||
|
peer.create_server(DEFAULT_PORT, MAX_PEERS)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
|
||||||
|
func join_game(ip, new_player_name):
|
||||||
|
player_name = new_player_name
|
||||||
|
peer = NetworkedMultiplayerENet.new()
|
||||||
|
peer.create_client(ip, DEFAULT_PORT)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
|
||||||
|
func get_player_list():
|
||||||
|
return players.values()
|
||||||
|
|
||||||
|
func get_player_ids():
|
||||||
|
return players.keys()
|
||||||
|
|
||||||
|
func get_player_name():
|
||||||
|
return player_name
|
||||||
|
|
||||||
|
|
||||||
|
func begin_game():
|
||||||
|
assert(get_tree().is_network_server())
|
||||||
|
|
||||||
|
# Create a dictionary with peer id and respective spawn points, could be improved by randomizing.
|
||||||
|
var spawn_points = {}
|
||||||
|
spawn_points[1] = 0 # Server in spawn point 0.
|
||||||
|
var spawn_point_idx = 1
|
||||||
|
for p in players:
|
||||||
|
spawn_points[p] = spawn_point_idx
|
||||||
|
spawn_point_idx += 1
|
||||||
|
# Call to pre-start game with the spawn points.
|
||||||
|
for p in players:
|
||||||
|
rpc_id(p, "pre_start_game", spawn_points)
|
||||||
|
|
||||||
|
pre_start_game(spawn_points)
|
||||||
|
|
||||||
|
func end_game():
|
||||||
|
rpc("end_clients_game")
|
||||||
|
|
||||||
|
remotesync func end_clients_game():
|
||||||
|
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()
|
||||||
|
|
@ -27,6 +27,9 @@ func get_player_data(index :int) -> PlayerData:
|
||||||
else:
|
else:
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
func reset():
|
||||||
|
_player_data.clear()
|
||||||
|
|
||||||
# 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
|
# pass
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,6 @@ 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'
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
@ -114,6 +109,11 @@ _global_script_classes=[ {
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://lib/classes/sound_effect_state_frame.gd"
|
"path": "res://lib/classes/sound_effect_state_frame.gd"
|
||||||
}, {
|
}, {
|
||||||
|
"base": "CanvasLayer",
|
||||||
|
"class": "SceneTransitions",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://src/classes/scene_transition.gd"
|
||||||
|
}, {
|
||||||
"base": "Node",
|
"base": "Node",
|
||||||
"class": "StaminaComponent",
|
"class": "StaminaComponent",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
|
|
@ -160,7 +160,6 @@ _global_script_class_icons={
|
||||||
"AudioStreamPlayer_StateReceiver": "",
|
"AudioStreamPlayer_StateReceiver": "",
|
||||||
"CameraGuide": "",
|
"CameraGuide": "",
|
||||||
"CollisionShape2D_StateReceiver": "",
|
"CollisionShape2D_StateReceiver": "",
|
||||||
"GitAPI": "",
|
|
||||||
"HealthComponent": "",
|
"HealthComponent": "",
|
||||||
"HealthPickup": "",
|
"HealthPickup": "",
|
||||||
"Interactable": "",
|
"Interactable": "",
|
||||||
|
|
@ -176,6 +175,7 @@ _global_script_class_icons={
|
||||||
"PlayerData": "",
|
"PlayerData": "",
|
||||||
"Projectile": "",
|
"Projectile": "",
|
||||||
"SE_StateFrame": "",
|
"SE_StateFrame": "",
|
||||||
|
"SceneTransitions": "",
|
||||||
"StaminaComponent": "",
|
"StaminaComponent": "",
|
||||||
"State": "",
|
"State": "",
|
||||||
"StateAnimatedActor": "",
|
"StateAnimatedActor": "",
|
||||||
|
|
@ -205,6 +205,7 @@ animation/layers/only_include_visible_layers_by_default=true
|
||||||
PlayerInfo="*res://lib/singleton_autoloads/PlayerInfo.gd"
|
PlayerInfo="*res://lib/singleton_autoloads/PlayerInfo.gd"
|
||||||
UiManager="*res://lib/singleton_autoloads/UIManager.gd"
|
UiManager="*res://lib/singleton_autoloads/UIManager.gd"
|
||||||
LevelInfo="*res://lib/singleton_autoloads/LevelInfo.gd"
|
LevelInfo="*res://lib/singleton_autoloads/LevelInfo.gd"
|
||||||
|
NetworkManager="*res://lib/singleton_autoloads/NetworkManager.gd"
|
||||||
|
|
||||||
[debug]
|
[debug]
|
||||||
|
|
||||||
|
|
|
||||||
36
src/World.tscn
Normal file
36
src/World.tscn
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=2]
|
||||||
|
[ext_resource path="res://src/Camera2D.gd" type="Script" id=3]
|
||||||
|
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=4]
|
||||||
|
[ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=5]
|
||||||
|
|
||||||
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
extents = Vector2( 160, 90 )
|
||||||
|
|
||||||
|
[node name="World" type="Node2D"]
|
||||||
|
|
||||||
|
[node name="UI_Layer" parent="." instance=ExtResource( 4 )]
|
||||||
|
|
||||||
|
[node name="TestBox" parent="." instance=ExtResource( 5 )]
|
||||||
|
|
||||||
|
[node name="PlayerE" parent="." instance=ExtResource( 2 )]
|
||||||
|
|
||||||
|
[node name="Camera2D" type="Camera2D" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
position = Vector2( 160, 90 )
|
||||||
|
current = true
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
tracking_node_path = NodePath("../CameraGuide")
|
||||||
|
|
||||||
|
[node name="CameraGuide" type="KinematicBody2D" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
position = Vector2( 160, 90 )
|
||||||
|
collision_layer = 0
|
||||||
|
collision_mask = 256
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraGuide"]
|
||||||
|
shape = SubResource( 1 )
|
||||||
|
one_way_collision = true
|
||||||
|
|
@ -15,7 +15,7 @@ func _ready():
|
||||||
#func _process(delta):
|
#func _process(delta):
|
||||||
# pass
|
# pass
|
||||||
|
|
||||||
func _on_state_change_hurt():
|
#func _on_state_change_hurt():
|
||||||
print ("<---- Hey you called me to get hurt. Bruh.")
|
# print ("<---- Hey you called me to get hurt. Bruh.")
|
||||||
transform = transform.translated(Vector2(-10,10))
|
# transform = transform.translated(Vector2(-10,10))
|
||||||
pass
|
# pass
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,15 @@ const state_damage_amount :Dictionary = {
|
||||||
var player_info_index :int
|
var player_info_index :int
|
||||||
var player_data :PlayerData
|
var player_data :PlayerData
|
||||||
|
|
||||||
|
|
||||||
# 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():
|
||||||
# PlayerInfo.player_health = health_component.health
|
# PlayerInfo.player_health = health_component.health
|
||||||
PlayerInfo.player_inventory = player_inventory
|
PlayerInfo.player_inventory = player_inventory
|
||||||
# PlayerInfo.player_stamina = stamina_component.stamina
|
# PlayerInfo.player_stamina = stamina_component.stamina
|
||||||
|
|
||||||
|
# I think we only want to do this for network master players now
|
||||||
|
if is_network_master():
|
||||||
player_info_index = PlayerInfo.register_player()
|
player_info_index = PlayerInfo.register_player()
|
||||||
print ("Registered as player: ", player_info_index)
|
print ("Registered as player: ", player_info_index)
|
||||||
player_data = PlayerInfo.get_player_data(player_info_index)
|
player_data = PlayerInfo.get_player_data(player_info_index)
|
||||||
|
|
@ -41,6 +44,8 @@ func _ready():
|
||||||
print ("My health is: ", player_data.player_health)
|
print ("My health is: ", player_data.player_health)
|
||||||
player_data.player_inventory = player_inventory
|
player_data.player_inventory = player_inventory
|
||||||
player_data.player_stamina = stamina_component.stamina
|
player_data.player_stamina = stamina_component.stamina
|
||||||
|
else:
|
||||||
|
$Hurtbox_Component.hurtbox_entered_function = ''
|
||||||
|
|
||||||
# Set initial player position in world.
|
# Set initial player position in world.
|
||||||
global_position = LevelInfo.player_start_position
|
global_position = LevelInfo.player_start_position
|
||||||
|
|
@ -50,12 +55,11 @@ func _ready():
|
||||||
|
|
||||||
movement_component.state_stamina_cost = state_stamina_cost
|
movement_component.state_stamina_cost = state_stamina_cost
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#var stamina_recovery :float = 0.0
|
#var stamina_recovery :float = 0.0
|
||||||
|
|
||||||
# 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):
|
||||||
|
if is_network_master():
|
||||||
#PlayerInfo.player_position = global_position.round()
|
#PlayerInfo.player_position = global_position.round()
|
||||||
player_data.player_position = global_position.round()
|
player_data.player_position = global_position.round()
|
||||||
# stamina_recovery += delta
|
# stamina_recovery += delta
|
||||||
|
|
@ -84,6 +88,8 @@ func _process(delta):
|
||||||
if _selected_item:
|
if _selected_item:
|
||||||
print("Switched Secondary item to: ", _selected_item.name)
|
print("Switched Secondary item to: ", _selected_item.name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func hit_Receiver(damage):
|
func hit_Receiver(damage):
|
||||||
$Hurtbox_Component.set_hurtbox(false)
|
$Hurtbox_Component.set_hurtbox(false)
|
||||||
health_component.take_damage(damage)
|
health_component.take_damage(damage)
|
||||||
|
|
@ -194,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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ var entrances:Dictionary
|
||||||
|
|
||||||
# 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():
|
||||||
|
add_to_group("world")
|
||||||
LevelInfo.player_start_position = player_start.transform.origin
|
LevelInfo.player_start_position = player_start.transform.origin
|
||||||
if music_track:
|
if music_track:
|
||||||
LevelInfo.change_music_track(music_track)
|
LevelInfo.change_music_track(music_track)
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,49 @@
|
||||||
class_name CameraGuide
|
class_name CameraGuide
|
||||||
extends KinematicBody2D
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
export var debug_camera_guide :bool = false
|
||||||
|
|
||||||
# Declare member variables here. Examples:
|
var game_size :Vector2
|
||||||
# var a = 2
|
onready var window_scale :float
|
||||||
# var b = "text"
|
onready var viewport = $"%Viewport"
|
||||||
var game_size := Vector2(320,180)
|
|
||||||
onready var window_scale :float = (OS.window_size / game_size).x
|
|
||||||
|
|
||||||
var _is_tracking :bool = true
|
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.
|
game_size = viewport.size
|
||||||
|
window_scale = (OS.window_size / game_size).x
|
||||||
|
assert(game_size != Vector2(0,0), str(get_path()) + " : No game_size set.")
|
||||||
|
if debug_camera_guide:
|
||||||
|
print(get_path(), "\n",
|
||||||
|
"\tSize:", game_size,
|
||||||
|
"\tScale:", window_scale)
|
||||||
|
## 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
|
||||||
func _physics_process(delta):
|
func _physics_process(_delta):
|
||||||
var pos = global_position
|
var pos = global_position
|
||||||
#pos = pos.move_toward(PlayerInfo.player_position, delta)
|
#pos = pos.move_toward(PlayerInfo.player_position, 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)
|
||||||
|
|
||||||
|
if (PlayerInfo.get_player_data(0)):
|
||||||
var player_position = PlayerInfo.get_player_data(0).player_position
|
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
|
||||||
|
|
|
||||||
|
|
@ -10,23 +10,32 @@ extends Area2D
|
||||||
export var velocity_pps :float = 1
|
export var velocity_pps :float = 1
|
||||||
export var lifespan :float = -1
|
export var lifespan :float = -1
|
||||||
var direction_normal := Vector2(0,0)
|
var direction_normal := Vector2(0,0)
|
||||||
|
puppet var puppet_direction_normal :Vector2
|
||||||
|
puppet var puppet_position
|
||||||
|
|
||||||
var time_alive :float = 0.0
|
var time_alive :float = 0.0
|
||||||
# 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.
|
puppet_direction_normal = direction_normal
|
||||||
|
puppet_position = global_position
|
||||||
|
|
||||||
# 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):
|
||||||
|
if is_network_master():
|
||||||
|
position += direction_normal * velocity_pps * delta
|
||||||
|
rset("puppet_position", global_position)
|
||||||
|
else:
|
||||||
|
global_position = puppet_position
|
||||||
|
|
||||||
if lifespan != -1:
|
if lifespan != -1:
|
||||||
time_alive += delta
|
time_alive += delta
|
||||||
if time_alive > lifespan:
|
if time_alive > lifespan:
|
||||||
queue_free()
|
queue_free()
|
||||||
rotate(delta * 10)
|
rotate(delta * 10)
|
||||||
position += direction_normal * velocity_pps * delta
|
|
||||||
|
|
||||||
|
|
||||||
|
##TODO: Haven't determined if I want to create a receiver for projectiles or just inherit from an
|
||||||
|
## interactable for projectiles.
|
||||||
func _on_body_entered(body):
|
func _on_body_entered(body):
|
||||||
var colliding_node = body
|
var colliding_node = body
|
||||||
if colliding_node.has_node("Projectile_Receiver"):
|
if colliding_node.has_node("Projectile_Receiver"):
|
||||||
|
|
|
||||||
31
src/classes/scene_transition.gd
Normal file
31
src/classes/scene_transition.gd
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
class_name SceneTransitions
|
||||||
|
extends CanvasLayer
|
||||||
|
|
||||||
|
signal done
|
||||||
|
|
||||||
|
#func change_scene(target: String, type: String = 'dissolve') -> void:
|
||||||
|
# if type == 'dissolve':
|
||||||
|
# transition_dissolve(target)
|
||||||
|
# else:
|
||||||
|
# transition_clouds(target)
|
||||||
|
onready var animation_player = $AnimationPlayer
|
||||||
|
|
||||||
|
var animation_name = ''
|
||||||
|
|
||||||
|
func reset():
|
||||||
|
animation_player.play_backwards(animation_name)
|
||||||
|
emit_signal("done")
|
||||||
|
|
||||||
|
func transition_dissolve() -> void:
|
||||||
|
animation_name = 'dissolve'
|
||||||
|
animation_player.play('dissolve')
|
||||||
|
yield(animation_player,'animation_finished')
|
||||||
|
emit_signal("done")
|
||||||
|
|
||||||
|
|
||||||
|
func transition_clouds() -> void:
|
||||||
|
animation_name = 'clouds_out'
|
||||||
|
animation_player.play('clouds_in')
|
||||||
|
yield(animation_player,'animation_finished')
|
||||||
|
emit_signal("done")
|
||||||
|
|
||||||
|
|
@ -54,6 +54,7 @@ func shoot(direction = 1):
|
||||||
# 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:
|
||||||
|
print ("i'm a projectile")
|
||||||
bullet.global_position = global_position
|
bullet.global_position = global_position
|
||||||
bullet.direction_normal = normal_vector
|
bullet.direction_normal = normal_vector
|
||||||
|
|
||||||
|
|
@ -63,5 +64,19 @@ func shoot(direction = 1):
|
||||||
add_child(bullet)
|
add_child(bullet)
|
||||||
# sound_shoot.play()
|
# sound_shoot.play()
|
||||||
timer.start()
|
timer.start()
|
||||||
|
|
||||||
|
NetworkManager.instance_on_peer_players(loaded_scene, self.get_path(), global_position , true)
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
#var bomb_name = String(get_name()) + str(bomb_index)
|
||||||
|
#var bomb_pos = position
|
||||||
|
#rpc("setup_bomb", bomb_name, bomb_pos, get_tree().get_network_unique_id())
|
||||||
|
|
||||||
|
remotesync func setup_bomb(bomb_name, pos, by_who):
|
||||||
|
var bomb = loaded_scene.instance()
|
||||||
|
bomb.set_name(bomb_name) # Ensure unique name for the bomb
|
||||||
|
bomb.position = pos
|
||||||
|
bomb.from_player = by_who
|
||||||
|
# No need to set network master to bomb, will be owned by server by default
|
||||||
|
get_node("../..").add_child(bomb)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ radius = 5.09902
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=2]
|
[sub_resource type="RectangleShape2D" id=2]
|
||||||
|
|
||||||
[node name="CloneBox" instance=ExtResource( 1 )]
|
[node name="CloneBox" groups=["world"] instance=ExtResource( 1 )]
|
||||||
|
|
||||||
[node name="TileMap Collision" parent="." index="1"]
|
[node name="TileMap Collision" parent="." index="1"]
|
||||||
tile_set = ExtResource( 2 )
|
tile_set = ExtResource( 2 )
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ points = PoolVector2Array( 20, 20, 0.326027, 20, 0.326027, 0.605103, 20, 0.60510
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=6]
|
[sub_resource type="CircleShape2D" id=6]
|
||||||
|
|
||||||
[node name="TestBox" instance=ExtResource( 1 )]
|
[node name="TestBox" groups=["world"] instance=ExtResource( 1 )]
|
||||||
music_track = ExtResource( 5 )
|
music_track = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="TileMap Collision" parent="." index="1"]
|
[node name="TileMap Collision" parent="." index="1"]
|
||||||
|
|
@ -64,7 +64,7 @@ tile_data = PoolIntArray( 524288, 0, 2, 524307, 0, 3 )
|
||||||
position = Vector2( 80, 131 )
|
position = Vector2( 80, 131 )
|
||||||
|
|
||||||
[node name="Hitbox_Component" parent="." index="4" instance=ExtResource( 3 )]
|
[node name="Hitbox_Component" parent="." index="4" instance=ExtResource( 3 )]
|
||||||
damage_amount = 10
|
damage_amount = 90
|
||||||
|
|
||||||
[node name="ColorRect" type="ColorRect" parent="Hitbox_Component" index="0"]
|
[node name="ColorRect" type="ColorRect" parent="Hitbox_Component" index="0"]
|
||||||
margin_left = 266.0
|
margin_left = 266.0
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
108
src/ui/lobby.gd
Normal file
108
src/ui/lobby.gd
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
extends Control
|
||||||
|
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
# Called every time the node is added to the scene.
|
||||||
|
NetworkManager.connect("connection_failed", self, "_on_connection_failed")
|
||||||
|
NetworkManager.connect("connection_succeeded", self, "_on_connection_success")
|
||||||
|
NetworkManager.connect("player_list_changed", self, "refresh_lobby")
|
||||||
|
NetworkManager.connect("game_ended", self, "_on_game_ended")
|
||||||
|
NetworkManager.connect("game_error", self, "_on_game_error")
|
||||||
|
# Set the player name according to the system username. Fallback to the path.
|
||||||
|
if OS.has_environment("USERNAME"):
|
||||||
|
$Connect/Name.text = OS.get_environment("USERNAME")
|
||||||
|
else:
|
||||||
|
var desktop_path = OS.get_system_dir(0).replace("\\", "/").split("/")
|
||||||
|
$Connect/Name.text = desktop_path[desktop_path.size() - 2]
|
||||||
|
|
||||||
|
$Connect/Join.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func _on_host_pressed():
|
||||||
|
if $Connect/Name.text == "":
|
||||||
|
$Connect/ErrorLabel.text = "Invalid name!"
|
||||||
|
return
|
||||||
|
|
||||||
|
$Connect.hide()
|
||||||
|
$Players.show()
|
||||||
|
$Connect/ErrorLabel.text = ""
|
||||||
|
|
||||||
|
var player_name = $Connect/Name.text
|
||||||
|
NetworkManager.host_game(player_name)
|
||||||
|
refresh_lobby()
|
||||||
|
$Players/Start.grab_focus()
|
||||||
|
|
||||||
|
func _on_join_pressed():
|
||||||
|
if $Connect/Name.text == "":
|
||||||
|
$Connect/ErrorLabel.text = "Invalid name!"
|
||||||
|
return
|
||||||
|
|
||||||
|
var ip = $Connect/IPAddress.text
|
||||||
|
if not ip.is_valid_ip_address():
|
||||||
|
$Connect/ErrorLabel.text = "Invalid IP address!"
|
||||||
|
return
|
||||||
|
|
||||||
|
$Connect/ErrorLabel.text = ""
|
||||||
|
$Connect/Host.disabled = true
|
||||||
|
$Connect/Join.disabled = true
|
||||||
|
$Players/Start.grab_focus()
|
||||||
|
|
||||||
|
var player_name = $Connect/Name.text
|
||||||
|
NetworkManager.join_game(ip, player_name)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_connection_success():
|
||||||
|
$Connect.hide()
|
||||||
|
$Players.show()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_connection_failed():
|
||||||
|
$Connect/Host.disabled = false
|
||||||
|
$Connect/Join.disabled = false
|
||||||
|
$Connect/ErrorLabel.set_text("Connection failed.")
|
||||||
|
|
||||||
|
|
||||||
|
func _on_game_ended():
|
||||||
|
show()
|
||||||
|
$Connect.show()
|
||||||
|
$Players.hide()
|
||||||
|
$Connect/Host.disabled = false
|
||||||
|
$Connect/Join.disabled = false
|
||||||
|
|
||||||
|
|
||||||
|
func _on_game_error(errtxt):
|
||||||
|
$ErrorDialog.dialog_text = errtxt
|
||||||
|
$ErrorDialog.popup_centered_minsize()
|
||||||
|
$Connect/Host.disabled = false
|
||||||
|
$Connect/Join.disabled = false
|
||||||
|
|
||||||
|
|
||||||
|
func refresh_lobby():
|
||||||
|
var players = NetworkManager.get_player_list()
|
||||||
|
players.sort()
|
||||||
|
$Players/List.clear()
|
||||||
|
$Players/List.add_item(NetworkManager.get_player_name() + " (You)")
|
||||||
|
for p in players:
|
||||||
|
$Players/List.add_item(p)
|
||||||
|
|
||||||
|
## Only Server is allowed to press the start game button.
|
||||||
|
$Players/Start.disabled = not get_tree().is_network_server()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_start_pressed():
|
||||||
|
NetworkManager.begin_game()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_find_public_ip_pressed():
|
||||||
|
OS.shell_open("https://icanhazip.com/")
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Lobby_focus_entered():
|
||||||
|
if visible:
|
||||||
|
$Connect/Join.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Lobby_visibility_changed():
|
||||||
|
if visible:
|
||||||
|
$Connect/Join.grab_focus()
|
||||||
177
src/ui/lobby.tscn
Normal file
177
src/ui/lobby.tscn
Normal file
|
|
@ -0,0 +1,177 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://src/ui/lobby.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://assets/Fonts/QuinqueFive.tres" type="DynamicFont" id=2]
|
||||||
|
|
||||||
|
[node name="Lobby" type="Control"]
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -160.0
|
||||||
|
margin_top = -90.0
|
||||||
|
margin_right = 160.0
|
||||||
|
margin_bottom = 90.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="Players" type="Panel" parent="."]
|
||||||
|
visible = false
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -135.0
|
||||||
|
margin_top = -87.5
|
||||||
|
margin_right = 135.0
|
||||||
|
margin_bottom = 87.5
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="Players"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 17.5
|
||||||
|
margin_right = 132.0
|
||||||
|
margin_bottom = 31.5
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 0
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "Awaiting Players..."
|
||||||
|
|
||||||
|
[node name="Start" type="Button" parent="Players"]
|
||||||
|
margin_left = 26.0
|
||||||
|
margin_top = 140.5
|
||||||
|
margin_right = 78.0
|
||||||
|
margin_bottom = 158.5
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "START!"
|
||||||
|
|
||||||
|
[node name="List" type="ItemList" parent="Players"]
|
||||||
|
margin_left = 11.0
|
||||||
|
margin_top = 37.0
|
||||||
|
margin_right = 136.0
|
||||||
|
margin_bottom = 129.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
|
||||||
|
[node name="PortForward" type="Label" parent="Players"]
|
||||||
|
margin_left = 164.0
|
||||||
|
margin_top = 23.5
|
||||||
|
margin_right = 257.0
|
||||||
|
margin_bottom = 128.5
|
||||||
|
custom_constants/line_spacing = 6
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "If you want non-LAN clients to connect,
|
||||||
|
make sure the port 10567 in UDP
|
||||||
|
is forwarded on your router."
|
||||||
|
align = 1
|
||||||
|
autowrap = true
|
||||||
|
|
||||||
|
[node name="FindPublicIP" type="LinkButton" parent="Players"]
|
||||||
|
margin_left = 90.0
|
||||||
|
margin_top = 141.5
|
||||||
|
margin_right = 263.0
|
||||||
|
margin_bottom = 155.5
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "Find your public IP address"
|
||||||
|
|
||||||
|
[node name="Connect" type="Panel" parent="."]
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -135.0
|
||||||
|
margin_top = -75.0
|
||||||
|
margin_right = 135.0
|
||||||
|
margin_bottom = 75.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
|
||||||
|
[node name="NameLabel" type="Label" parent="Connect"]
|
||||||
|
margin_left = 14.0
|
||||||
|
margin_top = 11.0
|
||||||
|
margin_right = 56.0
|
||||||
|
margin_bottom = 25.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 0
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "Name:"
|
||||||
|
|
||||||
|
[node name="Name" type="LineEdit" parent="Connect"]
|
||||||
|
margin_left = 17.0
|
||||||
|
margin_top = 30.0
|
||||||
|
margin_right = 173.0
|
||||||
|
margin_bottom = 54.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "The Warrior"
|
||||||
|
|
||||||
|
[node name="IPLabel" type="Label" parent="Connect"]
|
||||||
|
margin_left = 15.0
|
||||||
|
margin_top = 66.0
|
||||||
|
margin_right = 57.0
|
||||||
|
margin_bottom = 80.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 0
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "IP:"
|
||||||
|
|
||||||
|
[node name="IPAddress" type="LineEdit" parent="Connect"]
|
||||||
|
margin_left = 17.0
|
||||||
|
margin_top = 85.0
|
||||||
|
margin_right = 173.0
|
||||||
|
margin_bottom = 109.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "192.168.0.133"
|
||||||
|
|
||||||
|
[node name="Host" type="Button" parent="Connect"]
|
||||||
|
margin_left = 181.0
|
||||||
|
margin_top = 31.0
|
||||||
|
margin_right = 246.0
|
||||||
|
margin_bottom = 51.0
|
||||||
|
focus_neighbour_bottom = NodePath("../Join")
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "Host"
|
||||||
|
|
||||||
|
[node name="Join" type="Button" parent="Connect"]
|
||||||
|
margin_left = 181.0
|
||||||
|
margin_top = 87.0
|
||||||
|
margin_right = 246.0
|
||||||
|
margin_bottom = 107.0
|
||||||
|
focus_neighbour_top = NodePath("../Host")
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
custom_fonts/font = ExtResource( 2 )
|
||||||
|
text = "Join"
|
||||||
|
|
||||||
|
[node name="ErrorLabel" type="Label" parent="Connect"]
|
||||||
|
margin_left = 15.0
|
||||||
|
margin_top = 125.0
|
||||||
|
margin_right = 257.0
|
||||||
|
margin_bottom = 139.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 0
|
||||||
|
custom_colors/font_color = Color( 0.820312, 0.291595, 0.291595, 1 )
|
||||||
|
align = 1
|
||||||
|
|
||||||
|
[node name="ErrorDialog" type="AcceptDialog" parent="."]
|
||||||
|
margin_right = 55.0
|
||||||
|
margin_bottom = 58.0
|
||||||
|
size_flags_horizontal = 2
|
||||||
|
size_flags_vertical = 2
|
||||||
|
|
||||||
|
[connection signal="focus_entered" from="." to="." method="_on_Lobby_focus_entered"]
|
||||||
|
[connection signal="visibility_changed" from="." to="." method="_on_Lobby_visibility_changed"]
|
||||||
|
[connection signal="pressed" from="Players/Start" to="." method="_on_start_pressed"]
|
||||||
|
[connection signal="pressed" from="Players/FindPublicIP" to="." method="_on_find_public_ip_pressed"]
|
||||||
|
[connection signal="pressed" from="Connect/Host" to="." method="_on_host_pressed"]
|
||||||
|
[connection signal="pressed" from="Connect/Join" to="." method="_on_join_pressed"]
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
extends CanvasLayer
|
|
||||||
|
|
||||||
signal done
|
|
||||||
|
|
||||||
#func change_scene(target: String, type: String = 'dissolve') -> void:
|
|
||||||
# if type == 'dissolve':
|
|
||||||
# transition_dissolve(target)
|
|
||||||
# else:
|
|
||||||
# transition_clouds(target)
|
|
||||||
|
|
||||||
var animation_name = ''
|
|
||||||
|
|
||||||
func reset():
|
|
||||||
$AnimationPlayer.play_backwards(animation_name)
|
|
||||||
emit_signal("done")
|
|
||||||
|
|
||||||
func transition_dissolve(target: String) -> void:
|
|
||||||
animation_name = 'dissolve'
|
|
||||||
$AnimationPlayer.play('dissolve')
|
|
||||||
yield($AnimationPlayer,'animation_finished')
|
|
||||||
emit_signal("done")
|
|
||||||
#get_tree().change_scene(target)
|
|
||||||
#$AnimationPlayer.play_backwards('dissolve')
|
|
||||||
|
|
||||||
func transition_clouds(target: String) -> void:
|
|
||||||
animation_name = 'clouds_out'
|
|
||||||
$AnimationPlayer.play('clouds_in')
|
|
||||||
yield($AnimationPlayer,'animation_finished')
|
|
||||||
emit_signal("done")
|
|
||||||
#get_tree().change_scene(target)
|
|
||||||
#$AnimationPlayer.play('clouds_out')
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=7 format=2]
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/ui/scene_transition.gd" type="Script" id=1]
|
[ext_resource path="res://src/classes/scene_transition.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/UI/transition_screen.png" type="Texture" id=2]
|
[ext_resource path="res://assets/UI/transition_screen.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="Animation" id=1]
|
[sub_resource type="Animation" id=1]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user