From 7ea324130dd2b7f5f6a2764c6d38d485e618ac37 Mon Sep 17 00:00:00 2001 From: "louis.drilltzsch@gmail.com" Date: Fri, 3 Jul 2026 21:35:29 +0200 Subject: [PATCH] init #3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assets hinzugefügt (X) --- project.godot | 87 ++++++++---------- res/Dornenkrone.png.import | 2 +- res/Rankenkreuz.png | Bin 0 -> 1957 bytes res/Rankenkreuz.png.import | 40 +++++++++ scene/TicTacToe.tscn | 177 ++++++++++++++++++++++++++++++++++++- scripts/control.gd | 78 +++++++++------- 6 files changed, 298 insertions(+), 86 deletions(-) create mode 100644 res/Rankenkreuz.png create mode 100644 res/Rankenkreuz.png.import diff --git a/project.godot b/project.godot index 9c01f73..3ee87e9 100644 --- a/project.godot +++ b/project.godot @@ -10,58 +10,22 @@ config_version=5 [application] -config/name="Tic-Tac-Toe" run/main_scene="uid://dqveewprna0jt" -config/features=PackedStringArray("4.7", "GL Compatibility") - -[display] - -window/stretch/mode="canvas_items" -window/stretch/aspect="expand" +config/features=PackedStringArray("4.7") [file_customization] folder_colors={ "res://res/": "red", -"res://scene/": "purple", -"res://scripts/": "green" +"res://scene/": "green", +"res://scripts/": "purple" } [input] -pad_9={ +pad_1={ "deadzone": 0.2, -"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":4194447,"key_label":0,"unicode":57,"location":0,"echo":false,"script":null) -] -} -pad_8={ -"deadzone": 0.2, -"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":4194446,"key_label":0,"unicode":56,"location":0,"echo":false,"script":null) -] -} -pad_7={ -"deadzone": 0.2, -"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":4194445,"key_label":0,"unicode":55,"location":0,"echo":false,"script":null) -] -} -pad_6={ -"deadzone": 0.2, -"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":4194444,"key_label":0,"unicode":54,"location":0,"echo":false,"script":null) -] -} -pad_5={ -"deadzone": 0.2, -"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":4194443,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) -] -} -pad_4={ -"deadzone": 0.2, -"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":4194442,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) -] -} -pad_3={ -"deadzone": 0.2, -"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":4194441,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) +"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":4194439,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) ] } pad_2={ @@ -69,19 +33,42 @@ pad_2={ "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":4194440,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) ] } -pad_1={ +pad_3={ "deadzone": 0.2, -"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":4194439,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) +"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":4194441,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) +] +} +pad_4={ +"deadzone": 0.2, +"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":4194442,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) +] +} +pad_5={ +"deadzone": 0.2, +"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":4194443,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) +] +} +pad_6={ +"deadzone": 0.2, +"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":4194444,"key_label":0,"unicode":54,"location":0,"echo":false,"script":null) +] +} +pad_7={ +"deadzone": 0.2, +"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":4194445,"key_label":0,"unicode":55,"location":0,"echo":false,"script":null) +] +} +pad_8={ +"deadzone": 0.2, +"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":4194446,"key_label":0,"unicode":56,"location":0,"echo":false,"script":null) +] +} +pad_9={ +"deadzone": 0.2, +"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":4194447,"key_label":0,"unicode":57,"location":0,"echo":false,"script":null) ] } - -[physics] - -3d/physics_engine="Jolt Physics" [rendering] textures/canvas_textures/default_texture_filter=0 -rendering_device/driver.windows="d3d12" -renderer/rendering_method="gl_compatibility" -renderer/rendering_method.mobile="gl_compatibility" diff --git a/res/Dornenkrone.png.import b/res/Dornenkrone.png.import index fa3cdb1..5e3310b 100644 --- a/res/Dornenkrone.png.import +++ b/res/Dornenkrone.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://p3r88nr8pbov" +uid="uid://c0d0vvj7grl0p" path="res://.godot/imported/Dornenkrone.png-d685e6b66b51219ea3aea986045555ab.ctex" metadata={ "vram_texture": false diff --git a/res/Rankenkreuz.png b/res/Rankenkreuz.png new file mode 100644 index 0000000000000000000000000000000000000000..a05f9c9605ae6546a8316dc52898a7c64301e28a GIT binary patch literal 1957 zcmV;W2U_@vP)Px+Ur9tkRA_SHzHI;i?zJUXT*v-=wJl6d7f%e} z0u=VX8M5xRC3oZR4+Hl`Fa8*Sg_Vy0xV5(3@Y&xx?#CwvaL096{@D^h$6jj1Mt}J( z02`m)hROlVjF5ZhPyFGl-^*u55oriS1ur}_`tc%szV0nZ^ag+E`eH|<+-plNGb1(d z!07o|#63#3AVI#cTSp?^3i#3Uv$YR@H154t4mc`RAgM!A$NlY1H|n>J1@C`n7LA?jS6`>>_tb#XR z^Ire*)>18Gz>EJxua{*0!!oNM@Q-^=+wtEhFUD{hKn( z#B22pjiH&Yrb={neo(GidRh#GN7%$pq;Fg#edA)}nmPi$7XvK2&yC4HN;bdBEn*#d z-e1);io+T&>;tB=V_doZW+hX0B8THbuY>u+l=5J>L%xgj?@ahj|j+bTE_K07D}Bz=M(QvpYw65xg9DrL;1iB+d8!Ct9|VAJZI*dqAF#FA%LT`g3O268ska7QGiee|Sm~VX8FKk&EF=sD^`1a7 z=L@?5wK)+10^T+xaDWSr!!liDo;z4dQd@^!oSR9r?ze2)!L}Wym<*5_)O*MmcA-fJ z+7^Mr9x?7Yq|$~P4if-ggE#;6U%6iFK-?HY*Q-2!^aNekq<07P9;gJ9Q}ueQz=gHE zSR|$ZE^2`4aba;|h^^CA>3tFFYKVwD=r_A5aOPUS5C-1CKIY*GTQgF}~i$qEEE?Q`3`7O;3`mlmoIUu5H_q)70>nI})@?Lfl)`{7%=O zE!ri~G=#!x6E<}i5!ZUv19j(h^xnWsfj#6Iv@Y!y|X?E z5BP(Xbu!N#Zzxidn-*$C9RamS1%{9YL$|6#&01m+)56;iR@S-TI9za?z&fE)!j2;m zc;MN2Z-x~*uYyxsV4*Tr$s)BIZwb6=69c%;aF?9q!o^Lk5$bhuSgSk6lsgdCd3EFy z;CJko0f`jA+Z{#Ce47( z3ldkyGV;)=*^x&x66?0tMl>Q(9M)LXG|s&<9{8?WD-|Uv79u3-slMW&T|L-Qp z)cdEp=o=26JC!$IFr6KfiLY8+5-%hS3VCmWGLt52)&0Qd`NHmrJl}}Ox*aTT;j^c$ z%`%r`Uf8MOCkfnI+m4Ad8T@WjkWi(v)8V@n5~;KyJ#D1>Byb_I0=!xm>cEH^AO>zx zaXUTsXxBuNZf%yOyo&sYYP%x=g-P&=V!l;-{cX)v&z}J9eHA@3Gz6uRc-1lAim6Rt r#{*B)4DkQ7i2>YKF*ko_-=zHyOxf-sFSzFy00000NkvXXu0mjfiiWvz literal 0 HcmV?d00001 diff --git a/res/Rankenkreuz.png.import b/res/Rankenkreuz.png.import new file mode 100644 index 0000000..9fcdf19 --- /dev/null +++ b/res/Rankenkreuz.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://42igluxsxh0i" +path="res://.godot/imported/Rankenkreuz.png-67e538a33ccef681a741da4733a45886.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://res/Rankenkreuz.png" +dest_files=["res://.godot/imported/Rankenkreuz.png-67e538a33ccef681a741da4733a45886.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scene/TicTacToe.tscn b/scene/TicTacToe.tscn index 60c69b7..ec978eb 100644 --- a/scene/TicTacToe.tscn +++ b/scene/TicTacToe.tscn @@ -1,7 +1,8 @@ [gd_scene format=3 uid="uid://dqveewprna0jt"] [ext_resource type="Script" uid="uid://6afx0iw42x0b" path="res://scripts/control.gd" id="1_d4uqn"] -[ext_resource type="Texture2D" uid="uid://p3r88nr8pbov" path="res://res/Dornenkrone.png" id="2_c2amw"] +[ext_resource type="Texture2D" uid="uid://c0d0vvj7grl0p" path="res://res/Dornenkrone.png" id="2_c2amw"] +[ext_resource type="Texture2D" uid="uid://42igluxsxh0i" path="res://res/Rankenkreuz.png" id="3_e5yio"] [node name="TicTacToe" type="Node2D" unique_id=1284704153] @@ -24,46 +25,217 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button7_ObenLinks" unique_id=1165030818] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button7_ObenLinks" unique_id=1859763733] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button8_ObenMitte" type="Button" parent="Control/Board" unique_id=1708324161] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button8_ObenMitte" unique_id=1719206029] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button8_ObenMitte" unique_id=524101128] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button9_ObenRechts" type="Button" parent="Control/Board" unique_id=88820554] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button9_ObenRechts" unique_id=1251697558] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button9_ObenRechts" unique_id=2027318618] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button4_MitteLinks" type="Button" parent="Control/Board" unique_id=1367556442] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button4_MitteLinks" unique_id=1902384192] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button4_MitteLinks" unique_id=93981872] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button5_MitteMitte" type="Button" parent="Control/Board" unique_id=863510856] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button5_MitteMitte" unique_id=482036297] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button5_MitteMitte" unique_id=103466242] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button6_MitteRechts" type="Button" parent="Control/Board" unique_id=1730224545] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button6_MitteRechts" unique_id=933598029] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button6_MitteRechts" unique_id=1299839229] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button1_UntenLinks" type="Button" parent="Control/Board" unique_id=417363038] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button1_UntenLinks" unique_id=879668694] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button1_UntenLinks" unique_id=1893136245] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button2_UntenMitte" type="Button" parent="Control/Board" unique_id=2081092678] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button2_UntenMitte" unique_id=2135819389] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button2_UntenMitte" unique_id=1493058391] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="Button3_UntenRechts" type="Button" parent="Control/Board" unique_id=92172665] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="PieceTexture" type="TextureRect" parent="Control/Board/Button3_UntenRechts" unique_id=420000251] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_c2amw") +expand_mode = 1 +stretch_mode = 5 + +[node name="PieceTexture2" type="TextureRect" parent="Control/Board/Button3_UntenRechts" unique_id=846383566] +layout_mode = 0 +mouse_filter = 2 +texture = ExtResource("3_e5yio") +expand_mode = 1 +stretch_mode = 5 + [node name="StatusLabel" type="Label" parent="Control" unique_id=401811983] layout_mode = 1 anchors_preset = 5 @@ -85,6 +257,3 @@ position = Vector2(250, 230) width = 8.0 begin_cap_mode = 2 end_cap_mode = 2 - -[node name="Sprite2D" type="Sprite2D" parent="." unique_id=616979674] -texture = ExtResource("2_c2amw") diff --git a/scripts/control.gd b/scripts/control.gd index 696911c..2f6b3ca 100644 --- a/scripts/control.gd +++ b/scripts/control.gd @@ -11,7 +11,7 @@ var game_over = false # Referenzen zu den Nodes @onready var board_grid = $Board @onready var status_label = $StatusLabel -@onready var win_line = $WinLine # Die neue Line2D Node +@onready var win_line = $WinLine # Mapping von Numpad-Aktionen zu den Array-Indizes (0 bis 8) var numpad_mapping = { @@ -22,25 +22,34 @@ var numpad_mapping = { var buttons = [] -# Gewinnkombinationen global definieren, da wir sie auch für die Linie brauchen +# --- NEU: Beide Textur-Referenzen geladen --- +var circle_texture = load("res://res/Dornenkrone.png") # Textur für O +var cross_texture = load("res://res/Rankenkreuz.png") # Textur für X (Hier Pfad anpassen!) +# -------------------------------------------- + var win_conditions = [ - [0, 1, 2], [3, 4, 5], [6, 7, 8], # Horizontal (0=oben, 1=mitte, 2=unten) - [0, 3, 6], [1, 4, 7], [2, 5, 8], # Vertikal (3=links, 4=mitte, 5=rechts) - [0, 4, 8], [2, 4, 6] # Diagonal (6=Hauptdiagonale, 7=Nebendiagonale) + [0, 1, 2], [3, 4, 5], [6, 7, 8], + [0, 3, 6], [1, 4, 7], [2, 5, 8], + [0, 4, 8], [2, 4, 6] ] func _ready(): board_grid.custom_minimum_size = Vector2(500, 500) buttons = board_grid.get_children() - # Gewinnlinie am Anfang unsichtbar machen win_line.clear_points() for i in range(buttons.size()): - buttons[i].text = EMPTY buttons[i].size_flags_horizontal = Control.SIZE_EXPAND_FILL buttons[i].size_flags_vertical = Control.SIZE_EXPAND_FILL - buttons[i].add_theme_font_size_override("font_size", 64) + + # Buttons komplett leeren (kein störender Text mehr) + buttons[i].text = EMPTY + + # Finde die TextureRect-Node im Button und leere sie für den Start + var piece_texture = buttons[i].get_node("PieceTexture") + piece_texture.texture = null + buttons[i].pressed.connect(_on_button_pressed.bind(i)) update_status_label() @@ -52,22 +61,31 @@ func _input(event): for action in numpad_mapping.keys(): if event.is_action_pressed(action): var index = numpad_mapping[action] - if buttons[index].text == EMPTY: + + var piece_texture = buttons[index].get_node("PieceTexture") + if piece_texture.texture == null: make_move(index) func _on_button_pressed(index): - if game_over or buttons[index].text != EMPTY: + var piece_texture = buttons[index].get_node("PieceTexture") + if game_over or piece_texture.texture != null: return make_move(index) func make_move(index): - buttons[index].text = current_player + var piece_texture = buttons[index].get_node("PieceTexture") + + # Weist jetzt je nach Spieler die korrekte Bild-Textur zu + if current_player == PLAYER_O: + piece_texture.texture = circle_texture + else: + piece_texture.texture = cross_texture var winning_combo = check_win() if winning_combo != null: status_label.text = "Spieler " + current_player + " hat gewonnen!" game_over = true - animate_win_line(winning_combo) # Hier starten wir die Animation + animate_win_line(winning_combo) elif check_draw(): status_label.text = "Unentschieden!" game_over = true @@ -78,50 +96,48 @@ func make_move(index): func update_status_label(): status_label.text = "Spieler " + current_player + " ist am Zug." -# Gibt nun die Gewinn-Kombination zurück, wenn jemand gewinnt +# Prüft den Gewinn vollautomatisch über die gesetzten Texturen func check_win(): for cond in win_conditions: - if buttons[cond[0]].text == current_player and \ - buttons[cond[1]].text == current_player and \ - buttons[cond[2]].text == current_player: - return cond # Gibt das Array der 3 Buttons zurück (z.B. [0, 1, 2]) + var p0 = buttons[cond[0]].get_node("PieceTexture").texture + var p1 = buttons[cond[1]].get_node("PieceTexture").texture + var p2 = buttons[cond[2]].get_node("PieceTexture").texture + + if current_player == PLAYER_O: + if p0 == circle_texture and p1 == circle_texture and p2 == circle_texture: + return cond + else: + if p0 == cross_texture and p1 == cross_texture and p2 == cross_texture: + return cond return null +# Prüft auf Unentschieden: Wenn alle Felder eine Textur haben, ist das Feld voll func check_draw() -> bool: for button in buttons: - if button.text == EMPTY: + var piece_texture = button.get_node("PieceTexture") + if piece_texture.texture == null: return false return true -# Berechnet die Mitte eines Buttons basierend auf seiner globalen Position func get_button_center(button: Button) -> Vector2: return button.global_position + (button.size / 2) -# Animiert den Strich von Button 1 zu Button 3 und geht über die Ränder hinaus func animate_win_line(combo: Array): var start_pos = get_button_center(buttons[combo[0]]) var end_pos = get_button_center(buttons[combo[2]]) - - # 1. Richtung zwischen den beiden Punkten berechnen (Normalisierter Vektor) var direction = (end_pos - start_pos).normalized() - - # 2. Festlegen, wie viele Pixel der Strich links und rechts überstehen soll - var padding = 40.0 - - # 3. Start- und Endpunkt nach außen verschieben + var padding = 40.0 var extended_start = start_pos - (direction * padding) var extended_end = end_pos + (direction * padding) - # Initialisiere die Punkte der Linie am neuen, erweiterten Startpunkt win_line.clear_points() win_line.add_point(extended_start) - win_line.add_point(extended_start) # Der zweite Punkt startet hier und wandert + win_line.add_point(extended_start) - # Erstelle den Tween für die flüssige Animation var tween = create_tween() tween.tween_method( func(pos): win_line.set_point_position(1, pos), extended_start, - extended_end, # Wandert bis zum erweiterten Endpunkt + extended_end, 0.4 ).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)