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

Zwei Pyhton-Skripte können sich nun mit dem Spiel verbinden, ihren Step...

Zwei Pyhton-Skripte können sich nun mit dem Spiel verbinden, ihren Step schicken und erhalten als Antwort die Observation als JSON. Ein Step (Derzeit Spielzeit 0,1s) müssen beide KI's ihren nächsten Step an das Spiel geschickt haben.
parent 813d0af8
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