Skip to content
Snippets Groups Projects
Commit b5f9e1e2 authored by Frederic Aust's avatar Frederic Aust
Browse files

Merge branch 'Websocket_Implementierung' into 'master'

Zweispieler Websocket Implementierung

See merge request !1
parents 813d0af8 17bba322
No related branches found
No related tags found
1 merge request!1Zweispieler Websocket Implementierung
...@@ -70,6 +70,9 @@ func ball_hit_paddle(player_position, player_shape, is_player_one): ...@@ -70,6 +70,9 @@ func ball_hit_paddle(player_position, player_shape, is_player_one):
func set_playing(_playing): func set_playing(_playing):
playing = _playing playing = _playing
func set_pause(value):
get_tree().paused=value
func start(pos): func start(pos):
position = pos position = pos
show() show()
...@@ -80,3 +83,6 @@ func start(pos): ...@@ -80,3 +83,6 @@ func start(pos):
if rand_range(-1,1)<0: if rand_range(-1,1)<0:
velocity.x*=-1 velocity.x*=-1
print(velocity) print(velocity)
func get_observation():
return {"velocity":{"X":velocity.x,"Y":velocity.y}, "position":{"X":position.x,"Y":position.y}}
...@@ -17,6 +17,7 @@ animations = [ { ...@@ -17,6 +17,7 @@ animations = [ {
extents = Vector2( 6.66667, 6.66419 ) extents = Vector2( 6.66667, 6.66419 )
[node name="Ball" type="KinematicBody2D"] [node name="Ball" type="KinematicBody2D"]
pause_mode = 1
collision_layer = 8 collision_layer = 8
collision_mask = 7 collision_mask = 7
motion/sync_to_physics = true motion/sync_to_physics = true
......
extends Node extends Node
# The port we will listen to.
const PORT = 9080
# Our WebSocketServer instance.
var _server = WebSocketServer.new()
var player_one_client_id
var player_two_client_id
var deltaN = 0
var action_player_one = InputEventAction.new()
var next_step_player_one = false
var action_player_two = InputEventAction.new()
var next_step_player_two = false
var Ball = preload("Ball.tscn") var Ball = preload("Ball.tscn")
var ball = Ball.instance() var ball = Ball.instance()
var score_player_one = 0 var score_player_one = 0
...@@ -15,11 +27,28 @@ const P2_WIN = "Player 2 won!" ...@@ -15,11 +27,28 @@ const P2_WIN = "Player 2 won!"
var message = SPACE_TO_PLAY var message = SPACE_TO_PLAY
func _ready(): func _ready():
# Connect base signals to get notified of new client connections,
# disconnections, and disconnect requests.
_server.connect("client_connected", self, "_connected")
_server.connect("client_disconnected", self, "_disconnected")
_server.connect("client_close_request", self, "_close_request")
# This signal is emitted when not using the Multiplayer API every time a
# full packet is received.
# Alternatively, you could check get_peer(PEER_ID).get_available_packets()
# in a loop for each connected peer.
_server.connect("data_received", self, "_on_data")
# Start listening on the given port.
var err = _server.listen(PORT)
if err != OK:
print("Unable to start server")
set_process(false)
set_ball() set_ball()
$PlayerOne.start($StartPositionPlayerOne.position) $PlayerOne.start($StartPositionPlayerOne.position)
$PlayerTwo.start($StartPositionPlayerTwo.position) $PlayerTwo.start($StartPositionPlayerTwo.position)
display_message() display_message()
update_score() update_score()
pause()
func _input(_event): func _input(_event):
if Input.is_key_pressed(KEY_SPACE): if Input.is_key_pressed(KEY_SPACE):
...@@ -38,6 +67,9 @@ func play(): ...@@ -38,6 +67,9 @@ func play():
func _process(delta): func _process(delta):
# print(delta)
_server.poll() # in in steuerung durch Timer auslagern, damit der Process durch Pause lahm gelegt werden kann
check_point_scored() check_point_scored()
handle_score_event() handle_score_event()
handle_game_end() handle_game_end()
...@@ -46,6 +78,7 @@ func check_point_scored(): ...@@ -46,6 +78,7 @@ func check_point_scored():
if ball.position.x <= 0: if ball.position.x <= 0:
score_event = true score_event = true
score_player_two += 1 score_player_two += 1
if ball.position.x >= 1024: if ball.position.x >= 1024:
score_event = true score_event = true
score_player_one += 1 score_player_one += 1
...@@ -82,7 +115,6 @@ func new_game(): ...@@ -82,7 +115,6 @@ func new_game():
$PlayerTwo.start($StartPositionPlayerTwo.position) $PlayerTwo.start($StartPositionPlayerTwo.position)
$StartTimer.start() $StartTimer.start()
func remove_ball(): func remove_ball():
remove_child(ball) remove_child(ball)
...@@ -114,3 +146,143 @@ func _on_PlayerTwo_hit(): ...@@ -114,3 +146,143 @@ func _on_PlayerTwo_hit():
func _on_PlayerOne_hit(): func _on_PlayerOne_hit():
ball.ball_hit_paddle($PlayerOne.position, $PlayerOne/CollisionShape2D.shape.extents, true) ball.ball_hit_paddle($PlayerOne.position, $PlayerOne/CollisionShape2D.shape.extents, true)
pass # Replace with function body. pass # Replace with function body.
func _connected(id, proto):
# This is called when a new peer connects, "id" will be the assigned peer id,
# "proto" will be the selected WebSocket sub-protocol (which is optional)
#if(not player_one_client_id):
# player_one_client_id = id
#if(not player_two_client_id):
# player_two_client_id = id
print("Client %d connected with protocol: %s" % [id, proto])
func _close_request(id, code, reason):
# This is called when a client notifies that it wishes to close the connection,
# providing a reason string and close code.
print("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason])
func _disconnected(id, was_clean = false):
# This is called when a client disconnects, "id" will be the one of the
# disconnecting client, "was_clean" will tell you if the disconnection
# was correctly notified by the remote peer before closing the socket.
if( player_one_client_id == id ):
player_one_client_id = null
print("Player One with Client %d disconnected, clean: %s" % [id, str(was_clean)])
if(player_two_client_id== id):
player_two_client_id = null
print("Player Two with Client %d disconnected, clean: %s" % [id, str(was_clean)])
else:
print("Client %d disconnected, clean: %s" % [id, str(was_clean)])
func _on_data(id):
# Print the received packet, you MUST always use get_peer(id).get_packet to receive data,
# and not get_packet directly when not using the MultiplayerAPI.
var pkt = _server.get_peer(id).get_packet()
print("Got data from client %d: %s ... echoing" % [id, pkt.get_string_from_utf8()])
var data = (JSON.parse(pkt.get_string_from_utf8())).get_result()
#print(data)
# var player = data[0]
# var command = data[1]
#if(command == "UP"):
if(data):
for i in data:
print(i)
if(i=="player_one"):
player_one_client_id = id
if(i=="player_two"):
player_two_client_id = id
if(i == "player_one_up"):
action_player_one = InputEventAction.new()
action_player_one.action = i
action_player_one.pressed = true
Input.parse_input_event(action_player_one)
next_step_player_one = true
if(i == "player_one_down"):
action_player_one = InputEventAction.new()
action_player_one.action = i
action_player_one.pressed = true
Input.parse_input_event(action_player_one)
next_step_player_one = true
if(i=="player_one_nothing"):
next_step_player_one = true
if(i == "player_two_up"):
action_player_two = InputEventAction.new()
action_player_two.action = i
action_player_two.pressed = true
Input.parse_input_event(action_player_two)
next_step_player_two = true
if(i == "player_two_down"):
action_player_two = InputEventAction.new()
action_player_two.action = i
action_player_two.pressed = true
Input.parse_input_event(action_player_two)
next_step_player_two = true
if(i == "player_two_nothing"):
next_step_player_two = true
if(i == "start_game"):
play()
var return_value = get_return_value_as_utf8_JSON()
#print(return_value)
#if(player_one_client_id and action_player_one.is_pressed() == false):
# _server.get_peer(player_one_client_id).put_packet(return_value)
#if(player_two_client_id) and action_player_two.is_pressed() == false:
# _server.get_peer(player_two_client_id).put_packet(return_value)
_server.get_peer(id).put_packet(return_value)
pass
if(i=="connect_player"):
var return_value = get_return_value_as_utf8_JSON()
#print(return_value)
#if(player_one_client_id and action_player_one.is_pressed() == false):
# _server.get_peer(player_one_client_id).put_packet(return_value)
#if(player_two_client_id) and action_player_two.is_pressed() == false:
# _server.get_peer(player_two_client_id).put_packet(return_value)
_server.get_peer(id).put_packet(return_value)
pass
if(next_step_player_one and next_step_player_two):
unpause()
$RunTimer.start()
func get_return_value_as_utf8_JSON():
var observation = {"PlayerOne":{"X":$PlayerOne.position.x,"Y":$PlayerOne.position.y}, "PlayerTwo":{"X":$PlayerTwo.position.x,"Y":$PlayerTwo.position.y}, "ball":ball.get_observation()}
var return_value = {"observation":observation, "reward":{"PlayerOneScore":score_player_one, "PlayerTwoScore":score_player_two}, "done":(not playing), "info":{}}
return (JSON.print(return_value)).to_utf8()
func _on_RunTimer_timeout():
print("_RunTimer_timeout")
pause()
action_player_one.pressed = false
action_player_two.pressed = false
Input.parse_input_event(action_player_one)
Input.parse_input_event(action_player_two)
next_step_player_one = false
next_step_player_two = false
var return_value = get_return_value_as_utf8_JSON()
#print(return_value)
if(player_one_client_id):
_server.get_peer(player_one_client_id).put_packet(return_value)
if(player_two_client_id):
_server.get_peer(player_two_client_id).put_packet(return_value)
func pause():
print("pause")
ball.set_pause(true)
$PlayerOne.set_pause(true)
$PlayerTwo.set_pause(true)
func unpause():
print("unpause")
ball.set_pause(false)
$PlayerOne.set_pause(false)
$PlayerTwo.set_pause(false)
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
[ext_resource path="res://Wall.tscn" type="PackedScene" id=3] [ext_resource path="res://Wall.tscn" type="PackedScene" id=3]
[node name="Node2D" type="Node2D"] [node name="Node2D" type="Node2D"]
pause_mode = 2
script = ExtResource( 2 ) script = ExtResource( 2 )
[node name="Player2Score" type="Label" parent="."] [node name="Player2Score" type="Label" parent="."]
...@@ -55,8 +56,10 @@ position = Vector2( 512, 300 ) ...@@ -55,8 +56,10 @@ position = Vector2( 512, 300 )
position = Vector2( 52, 300 ) position = Vector2( 52, 300 )
[node name="PlayerTwo" parent="." instance=ExtResource( 1 )] [node name="PlayerTwo" parent="." instance=ExtResource( 1 )]
pause_mode = 1
[node name="PlayerOne" parent="." instance=ExtResource( 1 )] [node name="PlayerOne" parent="." instance=ExtResource( 1 )]
pause_mode = 1
is_player_one = true is_player_one = true
[node name="ColorRect4" type="ColorRect" parent="."] [node name="ColorRect4" type="ColorRect" parent="."]
...@@ -80,5 +83,11 @@ __meta__ = { ...@@ -80,5 +83,11 @@ __meta__ = {
[node name="WallBottom" parent="." instance=ExtResource( 3 )] [node name="WallBottom" parent="." instance=ExtResource( 3 )]
position = Vector2( 0, 600 ) position = Vector2( 0, 600 )
[node name="RunTimer" type="Timer" parent="."]
pause_mode = 2
wait_time = 0.1
one_shot = true
[connection signal="hit" from="PlayerTwo" to="." method="_on_PlayerTwo_hit"] [connection signal="hit" from="PlayerTwo" to="." method="_on_PlayerTwo_hit"]
[connection signal="hit" from="PlayerOne" to="." method="_on_PlayerOne_hit"] [connection signal="hit" from="PlayerOne" to="." method="_on_PlayerOne_hit"]
[connection signal="timeout" from="RunTimer" to="." method="_on_RunTimer_timeout"]
...@@ -51,3 +51,7 @@ func start(pos): ...@@ -51,3 +51,7 @@ func start(pos):
position = pos position = pos
show() show()
$CollisionShape2D.disabled = false $CollisionShape2D.disabled = false
func set_pause(value):
get_tree().paused=value
...@@ -31,11 +31,12 @@ position = Vector2( -1.5, 0 ) ...@@ -31,11 +31,12 @@ position = Vector2( -1.5, 0 )
scale = Vector2( 3, 6 ) scale = Vector2( 3, 6 )
frames = SubResource( 1 ) frames = SubResource( 1 )
animation = "wave" animation = "wave"
frame = 2 frame = 1
speed_scale = 2.0 speed_scale = 2.0
playing = true playing = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="."] [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
light_mask = 9
shape = SubResource( 2 ) shape = SubResource( 2 )
[node name="ColorRect" type="ColorRect" parent="."] [node name="ColorRect" type="ColorRect" parent="."]
......
...@@ -46,6 +46,11 @@ player_two_down={ ...@@ -46,6 +46,11 @@ player_two_down={
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null) "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
] ]
} }
start_game={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
]
}
[layer_names] [layer_names]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment