From 6ce339b4303db12d7ade591b4ad4c2325fcaa138 Mon Sep 17 00:00:00 2001 From: Tabby <41929769+tabby-cat-nya@users.noreply.github.com> Date: Wed, 3 Sep 2025 12:14:08 +1000 Subject: [PATCH] yippee --- camera_2d.gd | 8 ++++ project.godot | 3 +- router.gd | 2 + scenes/menu.gd | 15 +++++++ scenes/menu.gd.uid | 1 + scenes/menu.tscn | 98 ++++++++++++++++++++++++++++++++++++++++ snakeManager.gd | 15 +++++-- test.tscn | 108 ++++++++++++++++++++++++++++++++++++++------- uiman.gd | 23 ++++++++++ 9 files changed, 252 insertions(+), 21 deletions(-) create mode 100644 scenes/menu.gd create mode 100644 scenes/menu.gd.uid create mode 100644 scenes/menu.tscn diff --git a/camera_2d.gd b/camera_2d.gd index 6ca87f3..452ca5b 100644 --- a/camera_2d.gd +++ b/camera_2d.gd @@ -8,6 +8,7 @@ extends Camera2D # Called when the node enters the scene tree for the first time. func _ready() -> void: + Router.die.connect(panic_zoomout) pass # Replace with function body. @@ -31,3 +32,10 @@ func _process(delta: float) -> void: snake_line.modulate = Color(1,1,1,1) snake_line.z_index = 11 z_index = 1 + +func panic_zoomout(): + position = Vector2(0,0) + zoom = Vector2(0.1,0.1) + snake_line.modulate = Color(1,1,1,1) + snake_line.z_index = 11 + z_index = 1 diff --git a/project.godot b/project.godot index 9d3c47a..c5cbbc8 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Snake" -run/main_scene="uid://daqqurdrnk61h" +run/main_scene="uid://bgnfwdpk48u51" config/features=PackedStringArray("4.4", "GL Compatibility") config/icon="res://icon.svg" @@ -84,3 +84,4 @@ action={ textures/canvas_textures/default_texture_filter=0 renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" +environment/defaults/default_clear_color=Color(0, 0.278688, 0.624722, 1) diff --git a/router.gd b/router.gd index b08f65f..ff2987b 100644 --- a/router.gd +++ b/router.gd @@ -13,6 +13,7 @@ var player_mode : bool = false # Called when the node enters the scene tree for the first time. func _ready() -> void: die.connect(end_game) + player_mode = false pass # Replace with function body. @@ -22,5 +23,6 @@ func _process(delta: float) -> void: player_mode = !player_mode func end_game(): + player_mode = false print("i die") get_tree().get_root().process_mode = Node.PROCESS_MODE_DISABLED diff --git a/scenes/menu.gd b/scenes/menu.gd new file mode 100644 index 0000000..f141007 --- /dev/null +++ b/scenes/menu.gd @@ -0,0 +1,15 @@ +extends Control + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + + +func _on_play_button_pressed() -> void: + get_tree().change_scene_to_file("res://test.tscn") diff --git a/scenes/menu.gd.uid b/scenes/menu.gd.uid new file mode 100644 index 0000000..2a2a862 --- /dev/null +++ b/scenes/menu.gd.uid @@ -0,0 +1 @@ +uid://cxggjpnb3uys7 diff --git a/scenes/menu.tscn b/scenes/menu.tscn new file mode 100644 index 0000000..e36ca83 --- /dev/null +++ b/scenes/menu.tscn @@ -0,0 +1,98 @@ +[gd_scene load_steps=3 format=3 uid="uid://bgnfwdpk48u51"] + +[ext_resource type="Script" uid="uid://cxggjpnb3uys7" path="res://scenes/menu.gd" id="1_vjb58"] +[ext_resource type="Texture2D" uid="uid://b1sese4p8sck3" path="res://assets/smallMap.png" id="1_yqeox"] + +[node name="Menu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_vjb58") + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_yqeox") +stretch_mode = 6 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 100 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 100 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +bbcode_enabled = true +text = "[wave][font_size=50][outline_size=8][outline_color=darkgreen][color=green]Snake's Braincell" +fit_content = true +horizontal_alignment = 1 + +[node name="RichTextLabel2" type="RichTextLabel" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +bbcode_enabled = true +text = "[font_size=15][outline_size=2][outline_color=darkred][color=red]Made by Tabby :3" +fit_content = true +horizontal_alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/PanelContainer"] +layout_mode = 2 + +[node name="Instructions" type="RichTextLabel" parent="MarginContainer/VBoxContainer/PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +bbcode_enabled = true +text = "You are a snake, or rather, you are it's sincle braincell. press [color=green]Enter[/color] to switch between [i]controlling the snake[/i] and [i]controlling the braincell[/i]. +In snake form, Use the [color=green]Arrow Keys[/color] to direct the snake into apples. Then in braincell view, use the [color=green]Space[/color] key to pickup collected apples and put them in the [i]furnace[/i] - this will replenish your food, if you run of food you die!" +fit_content = true + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="CreditsButton" type="Button" parent="MarginContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer"] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 8 +text = "View Credits" + +[node name="PlayButton" type="Button" parent="MarginContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 8 +text = "Play" + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -40.0 +offset_top = -23.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "V 0.2" + +[connection signal="pressed" from="MarginContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer/PlayButton" to="." method="_on_play_button_pressed"] diff --git a/snakeManager.gd b/snakeManager.gd index 6c7b411..ab058dc 100644 --- a/snakeManager.gd +++ b/snakeManager.gd @@ -3,11 +3,13 @@ extends Node2D @export var segements_holder : Node2D var segements : Array[snake_segment] @export var SNAKE_SPEED : float = 0.2 +@export var max_snake_speed : float = 1 @export var snake_line : Line2D @export var player : Node2D -var food : float = 5 -@export var max_food = 5 +var food : float = 8 +@export var max_food = 8 @export var food_drain = 0.1 +@export var food_gain = 0.2 var pit_apples : int = 0 var burn_apples : float = 0 var score : int = 0 @@ -43,16 +45,21 @@ func _process(delta: float) -> void: add_segment() - burn_apples -= 0.2 * delta + burn_apples -= 0.3 * delta if burn_apples <= 0: burn_apples = 0 else: - food += 0.3 * delta + food += food_gain * delta if food > max_food: food = max_food food -= food_drain * delta + if food <= 0: + Router.die.emit() + + if SNAKE_SPEED > max_snake_speed: + SNAKE_SPEED = max_snake_speed pass diff --git a/test.tscn b/test.tscn index 1af8a8b..9faaf42 100644 --- a/test.tscn +++ b/test.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=3 uid="uid://daqqurdrnk61h"] +[gd_scene load_steps=20 format=3 uid="uid://daqqurdrnk61h"] [ext_resource type="Script" uid="uid://bue4xxejdsmqh" path="res://snakeManager.gd" id="1_6uqi0"] [ext_resource type="PackedScene" uid="uid://bwoeu7ask0fck" path="res://prefabs/snake_segment.tscn" id="1_8uh7m"] @@ -35,7 +35,12 @@ outline_color = Color(0.87451, 0, 0, 1) radius = 50.0 [sub_resource type="LabelSettings" id="LabelSettings_5tkv4"] -font_size = 8 + +[sub_resource type="LabelSettings" id="LabelSettings_0m0f1"] +font_size = 31 +font_color = Color(0.84956, 3.29696e-06, 1.54018e-06, 1) +outline_size = 3 +outline_color = Color(0, 0, 0, 1) [node name="Node2D" type="Node2D" node_paths=PackedStringArray("test_area")] script = ExtResource("1_ehkex") @@ -165,7 +170,8 @@ shape = SubResource("CircleShape2D_ehkex") [node name="CanvasLayer" type="CanvasLayer" parent="."] -[node name="Control" type="Control" parent="CanvasLayer" node_paths=PackedStringArray("food_bar", "snake_manager", "score_label")] +[node name="Control" type="Control" parent="CanvasLayer" node_paths=PackedStringArray("food_bar", "snake_manager", "score_label", "speed_label", "gameover_score_label", "gameover_screen")] +process_mode = 3 layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -175,7 +181,10 @@ grow_vertical = 2 script = ExtResource("9_xersf") food_bar = NodePath("PanelContainer/HBoxContainer/ProgressBar") snake_manager = NodePath("../../Snake") -score_label = NodePath("PanelContainer2/VBoxContainer/score_label") +score_label = NodePath("Score Panel/VBoxContainer/score_label") +speed_label = NodePath("Speed Panel/VBoxContainer/speed_label") +gameover_score_label = NodePath("game over screen/PanelContainer/VBoxContainer/gameoverscorelabel") +gameover_screen = NodePath("game over screen") [node name="PanelContainer" type="PanelContainer" parent="CanvasLayer/Control"] layout_mode = 1 @@ -198,35 +207,102 @@ layout_mode = 2 size_flags_horizontal = 3 step = 0.0 -[node name="PanelContainer2" type="PanelContainer" parent="CanvasLayer/Control"] +[node name="Score Panel" type="PanelContainer" parent="CanvasLayer/Control"] layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 +offset_right = 50.0 +offset_bottom = 50.0 -[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/Control/PanelContainer2"] +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/Control/Score Panel"] layout_mode = 2 -[node name="Label" type="Label" parent="CanvasLayer/Control/PanelContainer2/VBoxContainer"] +[node name="Label" type="Label" parent="CanvasLayer/Control/Score Panel/VBoxContainer"] layout_mode = 2 text = "Score" +horizontal_alignment = 1 -[node name="score_label" type="Label" parent="CanvasLayer/Control/PanelContainer2/VBoxContainer"] +[node name="score_label" type="Label" parent="CanvasLayer/Control/Score Panel/VBoxContainer"] layout_mode = 2 text = "0" horizontal_alignment = 1 -[node name="PanelContainer3" type="PanelContainer" parent="CanvasLayer/Control"] +[node name="Speed Panel" type="PanelContainer" parent="CanvasLayer/Control"] layout_mode = 1 anchors_preset = 1 anchor_left = 1.0 anchor_right = 1.0 -offset_left = -80.0 -offset_bottom = 65.0 +offset_left = -50.0 +offset_bottom = 50.0 grow_horizontal = 0 -[node name="Label" type="Label" parent="CanvasLayer/Control/PanelContainer3"] +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/Control/Speed Panel"] layout_mode = 2 -text = "Press enter to switch between inside and outside view" + +[node name="Label2" type="Label" parent="CanvasLayer/Control/Speed Panel/VBoxContainer"] +layout_mode = 2 +text = "Speed" +horizontal_alignment = 1 + +[node name="speed_label" type="Label" parent="CanvasLayer/Control/Speed Panel/VBoxContainer"] +layout_mode = 2 +text = "0.3" label_settings = SubResource("LabelSettings_5tkv4") horizontal_alignment = 1 -autowrap_mode = 2 + +[node name="game over screen" type="MarginContainer" parent="CanvasLayer/Control"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 200 +theme_override_constants/margin_top = 90 +theme_override_constants/margin_right = 200 +theme_override_constants/margin_bottom = 90 + +[node name="PanelContainer" type="PanelContainer" parent="CanvasLayer/Control/game over screen"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/Control/game over screen/PanelContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Game Over" +label_settings = SubResource("LabelSettings_0m0f1") +horizontal_alignment = 1 + +[node name="HSeparator" type="HSeparator" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Score:" +horizontal_alignment = 1 + +[node name="gameoverscorelabel" type="RichTextLabel" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_font_sizes/normal_font_size = 40 +bbcode_enabled = true +text = "[wave]200" +fit_content = true +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="MenuButton" type="Button" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Menu" + +[node name="AgainButton" type="Button" parent="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Play Again!" + +[connection signal="pressed" from="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer/HBoxContainer/MenuButton" to="CanvasLayer/Control" method="_on_menu_button_pressed"] +[connection signal="pressed" from="CanvasLayer/Control/game over screen/PanelContainer/VBoxContainer/HBoxContainer/AgainButton" to="CanvasLayer/Control" method="_on_again_button_pressed"] diff --git a/uiman.gd b/uiman.gd index c339379..e6eccd4 100644 --- a/uiman.gd +++ b/uiman.gd @@ -3,10 +3,14 @@ extends Control @export var food_bar : ProgressBar @export var snake_manager : Node2D @export var score_label : Label +@export var speed_label : Label +@export var gameover_score_label : RichTextLabel +@export var gameover_screen : MarginContainer # Called when the node enters the scene tree for the first time. func _ready() -> void: + Router.die.connect(show_gameover) pass # Replace with function body. @@ -15,3 +19,22 @@ func _process(delta: float) -> void: food_bar.max_value = snake_manager.max_food food_bar.value = snake_manager.food score_label.text = str(snake_manager.score) + gameover_score_label.text = str(snake_manager.score) + if snake_manager.SNAKE_SPEED < snake_manager.max_snake_speed: + speed_label.text = str(round(snake_manager.SNAKE_SPEED*100)/100) + else: + speed_label.text = str(round(snake_manager.max_snake_speed*100)/100) + " MAX" + speed_label.label_settings.font_color = Color.RED + +func show_gameover(): + gameover_screen.show() + + +func _on_again_button_pressed() -> void: + get_tree().get_root().process_mode = Node.PROCESS_MODE_ALWAYS + get_tree().change_scene_to_file("res://test.tscn") + + +func _on_menu_button_pressed() -> void: + get_tree().get_root().process_mode = Node.PROCESS_MODE_ALWAYS + get_tree().change_scene_to_file("res://scenes/menu.tscn")