Skip to content

Commit

Permalink
Networked Player Movements
Browse files Browse the repository at this point in the history
  • Loading branch information
TheBardWhoCodes committed Oct 18, 2024
1 parent 927d48d commit 17a4302
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 21 deletions.
5 changes: 5 additions & 0 deletions gcgd-social-client/NetworkingClient.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,10 @@ offset_bottom = 55.0
size_flags_horizontal = 4
text = "Disconnect"

[node name="Main" type="Node2D" parent="."]

[node name="StartingPoint" type="Marker2D" parent="Main"]
position = Vector2(143, 99)

[connection signal="pressed" from="Lobby/ConnectBtn" to="." method="_on_connect_btn_pressed"]
[connection signal="pressed" from="Lobby/DisconnectBtn" to="." method="_on_disconnect_btn_pressed"]
13 changes: 13 additions & 0 deletions gcgd-social-client/Player.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[gd_scene load_steps=3 format=3 uid="uid://dbodpfxyefg37"]

[ext_resource type="Script" path="res://player.gd" id="1_jtuqy"]
[ext_resource type="Texture2D" uid="uid://crb5lx2kqp0xl" path="res://icon.svg" id="1_t3xwi"]

[node name="Player" type="CharacterBody2D"]
motion_mode = 1
script = ExtResource("1_jtuqy")

[node name="Sprite2D" type="Sprite2D" parent="."]
position = Vector2(550, 334)
scale = Vector2(0.671875, 0.65625)
texture = ExtResource("1_t3xwi")
71 changes: 61 additions & 10 deletions gcgd-social-client/networking_client.gd
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
extends Node
class_name NetworkingClient

const DEV = true

@onready var connect_btn = $Lobby/ConnectBtn
@onready var disconnect_btn = $Lobby/DisconnectBtn
@onready var main_node = $Main
@onready var starting_point = $Main/StartingPoint

var multiplayer_peer = ENetMultiplayerPeer.new()
var multiplayer_peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new()
var url : String = "ec2-18-117-120-174.us-east-2.compute.amazonaws.com"
const PORT = 9009

var connected_peer_ids = []
var connected_peers : Dictionary = {}
var my_player : Player;

const player_factory = preload("res://Player.tscn")

func _ready():
if DEV == true:
url = "127.0.0.1"
update_connection_buttons()
multiplayer.connected_to_server.connect(_on_connected_to_server)
multiplayer.server_disconnected.connect(_on_server_disconnected)

@rpc
func sync_player_list(updated_connected_peer_ids):
connected_peer_ids = updated_connected_peer_ids
multiplayer_peer.get_unique_id()
update_connection_buttons()
print("Currently connected Players: " + str(connected_peer_ids))

func add_player_to_scene(peer_id: int, position: Vector2):
var player: Player = player_factory.instantiate()
player.set_name(str(peer_id))
player.set_peer_id(peer_id)
player.position = position
main_node.add_child(player)
connected_peers[peer_id] = player

func _on_connect_btn_pressed() -> void:
print("Connecting ...")
Expand All @@ -34,17 +40,22 @@ func _on_connect_btn_pressed() -> void:


func _on_disconnect_btn_pressed():
var peer_id = multiplayer_peer.get_unique_id()
var player = connected_peers[peer_id]
player.queue_free()
connected_peers.erase(peer_id)
multiplayer_peer.close()
update_connection_buttons()
print("Disconnected.")

func _on_connected_to_server():
print("I'm connected!")

func _on_server_disconnected():
multiplayer_peer.close()
update_connection_buttons()
print("Connection to server lost.")


func update_connection_buttons() -> void:
if multiplayer_peer.get_connection_status() == multiplayer_peer.CONNECTION_DISCONNECTED:
connect_btn.disabled = false
Expand All @@ -55,3 +66,43 @@ func update_connection_buttons() -> void:
if multiplayer_peer.get_connection_status() == multiplayer_peer.CONNECTION_CONNECTED:
connect_btn.disabled = true
disconnect_btn.disabled = false

func set_position(peer_id, position):
rpc('_set_position', peer_id, position)

func move_player(peer_id, direction):
rpc('_move_player', peer_id, direction)

@rpc("authority")
func sync_player_list(updated_connected_peers: Dictionary):
var my_peer_id = multiplayer_peer.get_unique_id()
for peer_id in updated_connected_peers.keys():
if !connected_peers.has(peer_id):
add_player_to_scene(peer_id, updated_connected_peers[peer_id])

for peer_id in connected_peers:
if !updated_connected_peers.has(peer_id):
var player = connected_peers[peer_id]
player.queue_free()
connected_peers.erase(peer_id)

update_connection_buttons()
print("Currently connected Players: " + str(connected_peers.keys()))

@rpc("any_peer")
func _set_position(peer_id, position):
pass

@rpc
func _set_initial_position(peer_id: int, position: Vector2):
pass

@rpc("any_peer")
func _move_player(peer_id, direction):
pass

@rpc("authority")
func set_new_velocity(peer_id, new_velocity):
if connected_peers.has(peer_id):
var player: Player = connected_peers.get(peer_id)
player.velocity = new_velocity
26 changes: 26 additions & 0 deletions gcgd-social-client/player.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
extends CharacterBody2D
class_name Player
var this_players_peer_id: int
var multiplayer_peer: ENetMultiplayerPeer
var networking_client: NetworkingClient

func _ready() -> void:
networking_client = get_tree().root.get_node('Networking')
multiplayer_peer = networking_client.multiplayer_peer

func get_input():
var input_direction = Input.get_vector("left", "right", "up", "down")
networking_client.move_player(this_players_peer_id, input_direction)

func set_peer_id(peer_id: int):
this_players_peer_id = peer_id

func sync_current_position():
networking_client.set_position(this_players_peer_id, position)

func _physics_process(delta):
var my_peer_id = multiplayer_peer.get_unique_id()
if this_players_peer_id == my_peer_id:
sync_current_position()
get_input()
move_and_slide()
23 changes: 23 additions & 0 deletions gcgd-social-client/project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,29 @@ run/main_scene="res://NetworkingClient.tscn"
config/features=PackedStringArray("4.3", "GL Compatibility")
config/icon="res://icon.svg"

[input]

left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
]
}

[rendering]

renderer/rendering_method="gl_compatibility"
Expand Down
38 changes: 27 additions & 11 deletions gcgd-social-server/networking.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var multiplayer_peer = ENetMultiplayerPeer.new()
var url : String = "your-prod.url"
const PORT = 9009

var connected_peer_ids = []
var connected_peers : Dictionary = {}

func _ready():
if DEV == true:
Expand All @@ -27,27 +27,43 @@ func _on_peer_connected(new_peer_id : int) -> void:


func add_player(new_peer_id : int) -> void:
connected_peer_ids.append(new_peer_id)
var position: Vector2 = Vector2(0, 0)
connected_peers[new_peer_id] = position
print("Player " + str(new_peer_id) + " joined.")
print("Currently connected Players: " + str(connected_peer_ids))
rpc("sync_player_list", connected_peer_ids)

print("Currently connected Players: " + str(connected_peers.keys()))
rpc("sync_player_list", connected_peers)

func _on_peer_disconnected(leaving_peer_id : int) -> void:
# The disconnect signal fires before the client is removed from the connected
# clients in multiplayer.get_peers(), so we wait for a moment.
await get_tree().create_timer(1).timeout
remove_player(leaving_peer_id)


func remove_player(leaving_peer_id : int) -> void:
var peer_idx_in_peer_list : int = connected_peer_ids.find(leaving_peer_id)
if peer_idx_in_peer_list != -1:
connected_peer_ids.remove_at(peer_idx_in_peer_list)
if connected_peers.has(leaving_peer_id):
connected_peers.erase(leaving_peer_id)
print("Player " + str(leaving_peer_id) + " disconnected.")
rpc("sync_player_list", connected_peer_ids)

rpc("sync_player_list", connected_peers)

@rpc
func sync_player_list(_updated_connected_peer_ids):
pass # only implemented in client (but still has to exist here)

@rpc("any_peer")
func _move_player(peer_id: int, direction: Vector2):
rpc('set_new_velocity', peer_id, direction * 400)

@rpc
func set_new_velocity(peer_id, velocity):
pass

@rpc("any_peer")
func _set_position(peer_id: int, position: Vector2):
connected_peers[peer_id] = position

@rpc("any_peer")
func _set_initial_position(peer_id: int, position: Vector2):
print("Set Initial Position")
print(peer_id)
connected_peers[peer_id] = position
rpc("sync_player_list", connected_peers)

0 comments on commit 17a4302

Please sign in to comment.