From 7842743dbd5eb3ba9dcf14959c281e087bf2c296 Mon Sep 17 00:00:00 2001
From: Frederic Aust <frederic.aust@hs-bochum.de>
Date: Sat, 3 Apr 2021 15:46:01 +0200
Subject: [PATCH] ## GameSettings: * Parameter *length* und *speed* des
 Obstacle hinzugefuegt * Beim Start wird mit Defaultwerten initialisiert, fall
 configfiles geladen werden in der Werte fehlen * In der update_settings
 Funktion wird nun geprueft, ob die Variablen im Objekt data enthalten sind,
 um Null-Exceptions zu vermeiden

## Obstacle:
* Die Geschwindigkeit ist nun statisch und wird im Settings Window eingestellt

## SettingsWindow:
* Eingabemaske fuer Obstacle *length* und *speed* erstellt
* Inhalt zentriert
* Einstellung Obstacle *length* vorerst ausgeblendet
---
 Battle Pong/GameSettings.gd     | 101 +++++++++++++++++++++++---------
 Battle Pong/Obstacle.gd         |   8 +--
 Battle Pong/SettingsWindow.gd   |   6 ++
 Battle Pong/SettingsWindow.tscn |  87 +++++++++++++++++++++++----
 4 files changed, 154 insertions(+), 48 deletions(-)

diff --git a/Battle Pong/GameSettings.gd b/Battle Pong/GameSettings.gd
index 905409a..da6f168 100644
--- a/Battle Pong/GameSettings.gd	
+++ b/Battle Pong/GameSettings.gd	
@@ -35,6 +35,9 @@ var player_one_speed
 var player_two_length
 var player_two_speed
 
+var obstacle_length
+var obstacle_speed
+
 var path="data.json"
 
 var default_data = {
@@ -68,6 +71,10 @@ var default_data = {
     "player_two":{
         "length":60,
         "speed":300
+       },
+    "obstacle":{
+        "length":60,
+        "speed":500
        }
    }
 
@@ -75,12 +82,12 @@ var data = default_data
 
 # Called when the node enters the scene tree for the first time.
 func _ready():
+    reset_data() # Initialize Values
     load_data()
     pass # Replace with function body.
     
 func load_data():
     var file = File.new()
-    
     if not file.file_exists(path):
         reset_data()
         return
@@ -127,6 +134,10 @@ func save_data():
         "player_two":{
             "length":$"/root/GameSettings".player_two_length,
             "speed":$"/root/GameSettings".player_two_speed
+        },
+        "obstacle":{
+            "length":$"/root/GameSettings".obstacle_length,
+            "speed":$"/root/GameSettings".obstacle_speed
         }
     }
     var file
@@ -140,33 +151,65 @@ func reset_data():
     update_settings()
     
 func update_settings():
-    game_playtime_per_step = data["game"]["playtime_per_step"] as float
-    game_wins_to_reset = data["game"]["wins_to_reset"] as int
-    game_port= data["game"]["port"] as int
-
-    var format = data["image"]["format"]
-    if format =="RGB8":
-        image_rgb =true
-    else:
-        image_rgb = false;
-    image_heigth = data["image"]["height"] as int
-    image_width = data["image"]["width"] as int
-
-    trainer_ip = data["trainer"]["ip"]
-    trainer_port = data["trainer"]["port"] as int
-    trainer_position = data["trainer"]["position"]
-    trainer_realtime_enabled = data["trainer"]["realtime_enabled"] as bool
-
-    ball_height =data["ball"]["height"] as int
-    ball_width = data["ball"]["width"] as int
-    ball_speed_min = data["ball"]["speed_min"] as int
-    ball_speed_max = data["ball"]["speed_max"] as int 
-    ball_speed_increment = data["ball"]["speed_increment"] as int
-
-    player_one_length = data["player_one"]["length"] as int
-    player_one_speed = data["player_one"]["speed"] as int
-
-    player_two_length = data["player_two"]["length"] as int
-    player_two_speed = data["player_two"]["speed"] as int
+    if data.has("game"):
+        if data["game"].has("playtime_per_step"):
+            game_playtime_per_step = data["game"]["playtime_per_step"] as float
+        if data["game"].has("wins_to_reset"):
+            game_wins_to_reset = data["game"]["wins_to_reset"] as int
+        if data["game"].has("port"):
+            game_port= data["game"]["port"] as int
+            
+    if data.has("image"):
+        if data["image"].has("format"):
+            var format = data["image"]["format"]
+            if format == "RGB8":
+                image_rgb =true
+            else:
+                image_rgb = false;
+        if data["image"].has("height"):
+            image_heigth = data["image"]["height"] as int
+        if data["image"].has("width"):
+            image_width = data["image"]["width"] as int
+    
+    
+    if data.has("trainer"):
+        if data["trainer"].has("ip"):
+            trainer_ip = data["trainer"]["ip"]
+        if data["trainer"].has("ip"):
+            trainer_port = data["trainer"]["ip"] as int
+        if data["trainer"].has("position"):
+            trainer_position = data["trainer"]["position"]
+        if data["trainer"].has("realtime_enabled"):
+            trainer_realtime_enabled = data["trainer"]["realtime_enabled"] as bool
+
+    if data.has("ball"):
+        if data["ball"].has("height"):
+            ball_height =data["ball"]["height"] as int
+        if data["ball"].has("width"):
+            ball_width = data["ball"]["width"] as int
+        if data["ball"].has("speed_min"):
+           ball_speed_min = data["ball"]["speed_min"] as int
+        if data["ball"].has("speed_max"):
+            ball_speed_max = data["ball"]["speed_max"] as int 
+        if data["ball"].has("speed_increment"):
+            ball_speed_increment = data["ball"]["speed_increment"] as int
+
+    if data.has("player_one"):
+        if data["player_one"].has("length"):
+            player_one_length = data["player_one"]["length"] as int
+        if data["player_one"].has("speed"):
+            player_one_speed = data["player_one"]["speed"] as int
+
+    if data.has("player_two"):
+        if data["player_two"].has("length"):
+            player_two_length = data["player_two"]["length"] as int
+        if data["player_two"].has("speed"):
+            player_two_speed = data["player_two"]["speed"] as int
+
+    if data.has("obstacle"):
+        if data["obstacle"].has("length"):
+            obstacle_length = data["obstacle"]["length"] as int
+        if data["obstacle"].has("speed"):
+            obstacle_speed = data["obstacle"]["speed"] as int
 
 
diff --git a/Battle Pong/Obstacle.gd b/Battle Pong/Obstacle.gd
index 4cbc8b5..9e74b9b 100644
--- a/Battle Pong/Obstacle.gd	
+++ b/Battle Pong/Obstacle.gd	
@@ -1,11 +1,5 @@
 extends StaticBody2D
 
-
-# Declare member variables here. Examples:
-# var a = 2
-# var b = "text"
-var min_speed = 300
-var max_speed = 700
 var speed=0
 var start_position
 var playing = false
@@ -17,7 +11,7 @@ var bottom_position
 func _ready():
     randomize()
     #speed = rand_range(min_speed, max_speed)
-    speed = 500
+    speed = $"/root/GameSettings".obstacle_speed
     
     obstacle_size =$CollisionShape2D.shape.extents
     top_position = 0- obstacle_size.y
diff --git a/Battle Pong/SettingsWindow.gd b/Battle Pong/SettingsWindow.gd
index cfebdf6..9203634 100644
--- a/Battle Pong/SettingsWindow.gd	
+++ b/Battle Pong/SettingsWindow.gd	
@@ -43,6 +43,9 @@ func update_gui():
     $VBoxContainer/grid_settings/vbox_player_two_settings/grid_player_two_settings/input_player_two_length.text = str($"/root/GameSettings".player_two_length)
     $VBoxContainer/grid_settings/vbox_player_two_settings/grid_player_two_settings/input_player_two_speed.text = str($"/root/GameSettings".player_two_speed)
 
+    $VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings/input_obstacle_length.text = str($"/root/GameSettings".obstacle_length)
+    $VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings/input_obstacle_speed.text = str($"/root/GameSettings".obstacle_speed)
+
 
 func _on_input_trainer_position_pressed():
     if $VBoxContainer/grid_settings/vbox_trainer_settings/grid_trainer_settings/input_trainer_position.is_pressed():
@@ -77,6 +80,9 @@ func _on_but_save_pressed():
 
     $"/root/GameSettings".player_two_length = $VBoxContainer/grid_settings/vbox_player_two_settings/grid_player_two_settings/input_player_two_length.text as int
     $"/root/GameSettings".player_two_speed = $VBoxContainer/grid_settings/vbox_player_two_settings/grid_player_two_settings/input_player_two_speed.text as int
+
+    $"/root/GameSettings".obstacle_length = $VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings/input_obstacle_length.text as int
+    $"/root/GameSettings".obstacle_speed = $VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings/input_obstacle_speed.text as int
     
     $"/root/GameSettings".save_data()
     
diff --git a/Battle Pong/SettingsWindow.tscn b/Battle Pong/SettingsWindow.tscn
index 51b5e09..55cd2bd 100644
--- a/Battle Pong/SettingsWindow.tscn	
+++ b/Battle Pong/SettingsWindow.tscn	
@@ -28,17 +28,17 @@ anchor_left = 0.5
 anchor_top = 0.5
 anchor_right = 0.5
 anchor_bottom = 0.5
-margin_left = -141.5
-margin_top = -181.0
-margin_right = 141.5
-margin_bottom = 181.0
+margin_left = -173.5
+margin_top = -206.0
+margin_right = 173.5
+margin_bottom = 206.0
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="grid_settings" type="GridContainer" parent="VBoxContainer"]
 margin_right = 347.0
-margin_bottom = 278.0
+margin_bottom = 332.0
 columns = 3
 __meta__ = {
 "_edit_use_anchors_": false
@@ -421,27 +421,90 @@ margin_left = 43.0
 margin_right = 101.0
 margin_bottom = 24.0
 
-[node name="VSeparator5" type="HSeparator" parent="VBoxContainer"]
+[node name="HSeparator8" type="HSeparator" parent="VBoxContainer/grid_settings"]
+margin_top = 282.0
+margin_right = 163.0
+margin_bottom = 286.0
+
+[node name="VSeparator5" type="HSeparator" parent="VBoxContainer/grid_settings"]
+margin_left = 167.0
+margin_top = 282.0
+margin_right = 171.0
+margin_bottom = 286.0
+
+[node name="HSeparator3" type="HSeparator" parent="VBoxContainer/grid_settings"]
+margin_left = 175.0
 margin_top = 282.0
 margin_right = 347.0
 margin_bottom = 286.0
 
-[node name="but_save" type="Button" parent="VBoxContainer"]
+[node name="vbox_obstacle_settings" type="VBoxContainer" parent="VBoxContainer/grid_settings"]
 margin_top = 290.0
+margin_right = 163.0
+margin_bottom = 332.0
+
+[node name="lbl_title_obstacle_settings" type="Label" parent="VBoxContainer/grid_settings/vbox_obstacle_settings"]
+margin_right = 163.0
+margin_bottom = 14.0
+text = "Obstacle:"
+
+[node name="grid_obstacle_settings" type="GridContainer" parent="VBoxContainer/grid_settings/vbox_obstacle_settings"]
+margin_top = 18.0
+margin_right = 163.0
+margin_bottom = 42.0
+columns = 2
+
+[node name="lbl_obstacle_length" type="Label" parent="VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings"]
+visible = false
+margin_right = 58.0
+margin_bottom = 14.0
+text = "Length"
+
+[node name="input_obstacle_length" type="LineEdit" parent="VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings"]
+visible = false
+margin_left = 47.0
+margin_right = 105.0
+margin_bottom = 24.0
+editable = false
+
+[node name="lbl_obstacle_speed" type="Label" parent="VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings"]
+margin_top = 5.0
+margin_right = 39.0
+margin_bottom = 19.0
+text = "Speed"
+
+[node name="input_obstacle_speed" type="LineEdit" parent="VBoxContainer/grid_settings/vbox_obstacle_settings/grid_obstacle_settings"]
+margin_left = 43.0
+margin_right = 101.0
+margin_bottom = 24.0
+
+[node name="VSeparator6" type="VSeparator" parent="VBoxContainer/grid_settings"]
+margin_left = 167.0
+margin_top = 290.0
+margin_right = 171.0
+margin_bottom = 332.0
+
+[node name="VSeparator7" type="HSeparator" parent="VBoxContainer"]
+margin_top = 336.0
+margin_right = 347.0
+margin_bottom = 340.0
+
+[node name="but_save" type="Button" parent="VBoxContainer"]
+margin_top = 344.0
 margin_right = 347.0
-margin_bottom = 310.0
+margin_bottom = 364.0
 text = "Save"
 
 [node name="but_cancel" type="Button" parent="VBoxContainer"]
-margin_top = 314.0
+margin_top = 368.0
 margin_right = 347.0
-margin_bottom = 334.0
+margin_bottom = 388.0
 text = "Cancel"
 
 [node name="but_reset" type="Button" parent="VBoxContainer"]
-margin_top = 338.0
+margin_top = 392.0
 margin_right = 347.0
-margin_bottom = 358.0
+margin_bottom = 412.0
 text = "Reset"
 [connection signal="pressed" from="VBoxContainer/grid_settings/vbox_trainer_settings/grid_trainer_settings/input_trainer_position" to="." method="_on_input_trainer_position_pressed"]
 [connection signal="pressed" from="VBoxContainer/but_save" to="." method="_on_but_save_pressed"]
-- 
GitLab