diff --git a/Battle Pong/Ball.tscn b/Battle Pong/Ball.tscn index abeeabb3bbe137876f4e337b03daf49e41a13164..fbfd96fb461442a7cb1b15711531e8fa057c377e 100644 --- a/Battle Pong/Ball.tscn +++ b/Battle Pong/Ball.tscn @@ -1,20 +1,9 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://Ball.gd" type="Script" id=1] -[ext_resource path="res://ball_2.png" type="Texture" id=2] -[ext_resource path="res://ball_1.png" type="Texture" id=3] -[ext_resource path="res://ball_3.png" type="Texture" id=4] -[sub_resource type="SpriteFrames" id=1] -animations = [ { -"frames": [ ExtResource( 3 ), ExtResource( 2 ), ExtResource( 4 ) ], -"loop": true, -"name": "default", -"speed": 5.0 -} ] - -[sub_resource type="RectangleShape2D" id=2] -extents = Vector2( 6.66667, 6.66419 ) +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 12, 12.8754 ) [node name="Ball" type="KinematicBody2D"] pause_mode = 1 @@ -23,24 +12,15 @@ collision_mask = 7 motion/sync_to_physics = true script = ExtResource( 1 ) -[node name="AnimatedSprite" type="AnimatedSprite" parent="."] -visible = false -position = Vector2( -3, -3 ) -scale = Vector2( 6, 6 ) -frames = SubResource( 1 ) -frame = 1 -speed_scale = 2.0 - [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2( -3.8147e-06, -0.132433 ) -scale = Vector2( 3, 3 ) -shape = SubResource( 2 ) +shape = SubResource( 1 ) [node name="ColorRect" type="ColorRect" parent="."] -margin_left = -20.0 -margin_top = -20.0 -margin_right = 20.0 -margin_bottom = 20.0 +margin_left = -12.5 +margin_top = -12.5 +margin_right = 12.5 +margin_bottom = 12.5 color = Color( 0.992157, 1, 0, 1 ) __meta__ = { "_edit_use_anchors_": false diff --git a/Battle Pong/Main.gd b/Battle Pong/Main.gd index 29db56b0539f4c76133b66d7f605c0d3bdab1e2e..0eadd60ed6a5ca2b7c9da93d72e271ea04461da9 100644 --- a/Battle Pong/Main.gd +++ b/Battle Pong/Main.gd @@ -28,8 +28,17 @@ const P1_WIN = "Player 1 won!" const P2_WIN = "Player 2 won!" var message = SPACE_TO_PLAY +export var enable_rendering = true +export var learn_with_images = true +export var playtime_per_step = 0.1 + func _ready(): - VisualServer.render_loop_enabled = false # disable rendering to create a massive boost + if not enable_rendering: + VisualServer.render_loop_enabled = false # disable rendering to create a massive boost + if learn_with_images: + $DisplayMessage.hide() + $Player1Score.hide() + $Player2Score.hide() # Connect base signals to get notified of new client connections, # disconnections, and disconnect requests. @@ -172,7 +181,6 @@ func _close_request(id, code, reason): #print("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason]) pass - 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 @@ -231,36 +239,60 @@ func _on_data(id): 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() - _server.get_peer(id).put_packet(return_value) - pass - if(i=="connect_player"): - var return_value = get_return_value_as_utf8_JSON() + if(i=="connect_player" or i == "start_game"): + if(i == "start_game"): + play() + var return_value = null + if learn_with_images: + return_value = yield(get_yielded_return_value_as_utf8_JSON(), "completed") + else: + return_value = get_return_value_as_utf8_JSON() _server.get_peer(id).put_packet(return_value) pass if(next_step_player_one and next_step_player_two): unpause() - #if($RunTimer.is_stopped()): # Used to show how much faster the game runs independent from realtime - # $RunTimer.start() - $PlayerOne.run(0.1) - $PlayerTwo.run(0.1) - ball.run(0.1) + $PlayerOne.run(playtime_per_step) + $PlayerTwo.run(playtime_per_step) + ball.run(playtime_per_step) timeout() - +func get_observarion(): + return {"PlayerOne":{"X":$PlayerOne.position.x,"Y":$PlayerOne.position.y}, "PlayerTwo":{"X":$PlayerTwo.position.x,"Y":$PlayerTwo.position.y}, "ball":ball.get_observation()} + 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 observation = get_observarion() var return_value = {"observation":observation, "reward":{"PlayerOne":reward_player_one, "PlayerTwo":reward_player_two}, "done":(not playing), "info":{"PlayerOneScore":score_player_one, "PlayerTwoScore":score_player_two}} return (JSON.print(return_value)).to_utf8() +func get_yielded_return_value_as_utf8_JSON(): + var observation = get_observarion() + var screenshot = yield(get_screenshot(), "completed") + var return_value = {"observation":observation, "reward":{"PlayerOne":reward_player_one, "PlayerTwo":reward_player_two}, "done":(not playing), "info":{"PlayerOneScore":score_player_one, "PlayerTwoScore":score_player_two, "screenshot":screenshot}} + return (JSON.print(return_value)).to_utf8() -func _on_RunTimer_timeout(): - print("_RunTimer_timeout") - pass +func get_screenshot(): + get_viewport().set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME) + # Wait until the frame has finished before getting the texture. + yield(VisualServer, "frame_post_draw") + + var thumbnail = get_viewport().get_texture().get_data() + thumbnail.flip_y() + thumbnail.resize(100, 60 ) + thumbnail.convert(Image.FORMAT_RGB8 ) # Farbe + #thumbnail.convert(Image.FORMAT_L8 ) # S/W + #thumbnail.save_png('test.png') # Save Image as file - to debug + + var array : PoolByteArray = thumbnail.get_data() + var sg_width = thumbnail.get_width() + var sg_height = thumbnail.get_height() + var sg_format = thumbnail.get_format() + var sg_u_size = array.size() + var sg_saved_img = Marshalls.raw_to_base64(array) + var metadata = {"image" : sg_saved_img, "size" : sg_u_size, "width" : sg_width, "height" : sg_height, "format" : sg_format} + + return metadata func timeout(): pause() @@ -270,7 +302,13 @@ func timeout(): 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() # important to get the return values before resetting the reward + + var return_value = null + if learn_with_images: + return_value = yield(get_yielded_return_value_as_utf8_JSON(), "completed") + else: + return_value = get_return_value_as_utf8_JSON() + reward_player_one = 0 reward_player_two = 0 ##print(return_value) diff --git a/Battle Pong/Main.tscn b/Battle Pong/Main.tscn index 93b36b20f6348d33a296c23a5fbcaf1523782577..804fb3c80b00779c5b5433de80de94b16fbca3dc 100644 --- a/Battle Pong/Main.tscn +++ b/Battle Pong/Main.tscn @@ -42,10 +42,6 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="StartTimer" type="Timer" parent="."] -wait_time = 2.0 -one_shot = true - [node name="StartPositionPlayerTwo" type="Position2D" parent="."] position = Vector2( 968, 300 ) @@ -83,11 +79,5 @@ __meta__ = { [node name="WallBottom" parent="." instance=ExtResource( 3 )] position = Vector2( 0, 600 ) - -[node name="RunTimer" type="Timer" parent="."] -pause_mode = 2 -wait_time = 0.01 -one_shot = true [connection signal="hit" from="PlayerTwo" to="." method="_on_PlayerTwo_hit"] [connection signal="hit" from="PlayerOne" to="." method="_on_PlayerOne_hit"] -[connection signal="timeout" from="RunTimer" to="." method="_on_RunTimer_timeout"] diff --git a/Battle Pong/Player.gd b/Battle Pong/Player.gd index c7685fccae81388da290f0ff2efab0fab1ad105a..79029592e69ca378edaebc571454f3d4289ac999 100644 --- a/Battle Pong/Player.gd +++ b/Battle Pong/Player.gd @@ -33,9 +33,6 @@ func run(delta): if velocity.length() > 0: velocity = velocity.normalized() * speed - $AnimatedSprite.play() - else: - $AnimatedSprite.stop() position += velocity * delta #position.x = clamp(position.x, 0, screen_size.x) # ändert sich nicht diff --git a/Battle Pong/Player.tscn b/Battle Pong/Player.tscn index db6b1cf0f3fefa794d3c9e67114c51eaa076ddc4..7e7361b806ac08103e49ae10aee3db9532d27f83 100644 --- a/Battle Pong/Player.tscn +++ b/Battle Pong/Player.tscn @@ -1,22 +1,12 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=3 format=2] -[ext_resource path="res://player_1.png" type="Texture" id=1] -[ext_resource path="res://player_2.png" type="Texture" id=2] -[ext_resource path="res://player_3.png" type="Texture" id=3] [ext_resource path="res://Player.gd" type="Script" id=4] -[sub_resource type="SpriteFrames" id=1] -animations = [ { -"frames": [ ExtResource( 1 ), ExtResource( 2 ), ExtResource( 3 ) ], -"loop": true, -"name": "wave", -"speed": 5.0 -} ] - -[sub_resource type="RectangleShape2D" id=2] -extents = Vector2( 7.51772, 60.0095 ) +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 7.96318, 39.9475 ) [node name="Player" type="RigidBody2D"] +position = Vector2( -0.325993, -1.00885 ) collision_layer = 2 collision_mask = 8 script = ExtResource( 4 ) @@ -25,24 +15,19 @@ __meta__ = { } is_player_one = false -[node name="AnimatedSprite" type="AnimatedSprite" parent="."] -visible = false -position = Vector2( -1.5, 0 ) -scale = Vector2( 3, 6 ) -frames = SubResource( 1 ) -animation = "wave" -speed_scale = 2.0 -playing = true - [node name="CollisionShape2D" type="CollisionShape2D" parent="."] light_mask = 9 -shape = SubResource( 2 ) +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} [node name="ColorRect" type="ColorRect" parent="."] -margin_left = -7.506 -margin_top = -60.0 -margin_right = 7.494 -margin_bottom = 60.0 +margin_left = -7.90636 +margin_top = -40.0468 +margin_right = 8.09364 +margin_bottom = 39.9532 __meta__ = { +"_edit_lock_": true, "_edit_use_anchors_": false }