From 50e2dad3e769f39280455e13d9bd3a7482775b59 Mon Sep 17 00:00:00 2001 From: Tabby <41929769+tabby-cat-nya@users.noreply.github.com> Date: Thu, 7 Aug 2025 22:45:24 +1000 Subject: [PATCH] player and snake movement --- prefabs/braincell.tscn | 17 ++++++++++++++ prefabs/snake_segment.gd | 37 +++++++++++++++++++++++++++++ prefabs/snake_segment.gd.uid | 1 + prefabs/snake_segment.tscn | 17 ++++++++++++++ snakeManager.gd | 18 +++++++++++++++ snakeManager.gd.uid | 1 + test.tscn | 45 ++++++++++++++++++------------------ 7 files changed, 113 insertions(+), 23 deletions(-) create mode 100644 prefabs/braincell.tscn create mode 100644 prefabs/snake_segment.gd create mode 100644 prefabs/snake_segment.gd.uid create mode 100644 prefabs/snake_segment.tscn create mode 100644 snakeManager.gd create mode 100644 snakeManager.gd.uid diff --git a/prefabs/braincell.tscn b/prefabs/braincell.tscn new file mode 100644 index 0000000..159b45c --- /dev/null +++ b/prefabs/braincell.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://cusdydgg4b1bo"] + +[ext_resource type="Script" uid="uid://b48mlxrnte625" path="res://braincell.gd" id="1_q1ksn"] +[ext_resource type="Texture2D" uid="uid://qyd5e7lb2esx" path="res://assets/braincell.png" id="2_wv6rk"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_g14j6"] +radius = 16.0 + +[node name="Braincell" type="CharacterBody2D"] +motion_mode = 1 +script = ExtResource("1_q1ksn") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_wv6rk") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_g14j6") diff --git a/prefabs/snake_segment.gd b/prefabs/snake_segment.gd new file mode 100644 index 0000000..da2d764 --- /dev/null +++ b/prefabs/snake_segment.gd @@ -0,0 +1,37 @@ +extends AnimatableBody2D +class_name snake_segment + +@export var is_head : bool = false +var direction : Vector2 = Vector2.RIGHT +var want_direction : Vector2 = Vector2.RIGHT + +@export var next_segment : Node2D +var start_pos : Vector2 +var target_pos : Vector2 +var move_progress : float +# if snake is the head, it chooses where it goes +# if snake is not the head, it goes where the one infront went + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + start_pos = position + get_new_target() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + move_progress += delta + if Input.get_vector("left","right","up","down").length() > 0: + want_direction = Input.get_vector("left","right","up","down") + position = lerp(start_pos,target_pos,move_progress) + if move_progress >= 1: + get_new_target() + +func get_new_target(): + start_pos=target_pos + if is_head: + direction = want_direction + target_pos = start_pos + (direction * 320) + else: + target_pos = next_segment.position + move_progress = 0 diff --git a/prefabs/snake_segment.gd.uid b/prefabs/snake_segment.gd.uid new file mode 100644 index 0000000..c870620 --- /dev/null +++ b/prefabs/snake_segment.gd.uid @@ -0,0 +1 @@ +uid://b5cqo12km1nh3 diff --git a/prefabs/snake_segment.tscn b/prefabs/snake_segment.tscn new file mode 100644 index 0000000..97d5dbb --- /dev/null +++ b/prefabs/snake_segment.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://bwoeu7ask0fck"] + +[ext_resource type="Script" uid="uid://b5cqo12km1nh3" path="res://prefabs/snake_segment.gd" id="1_3ulhv"] +[ext_resource type="Texture2D" uid="uid://l8x3dp68yyxr" path="res://assets/segement.png" id="1_6uqch"] +[ext_resource type="Script" uid="uid://deq18nev0kwbg" path="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd" id="2_3ulhv"] + +[node name="SnakeSegment" type="AnimatableBody2D"] +script = ExtResource("1_3ulhv") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("1_6uqch") + +[node name="DonutCollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(9.85808e-15, -161, 31.4095, -157.906, 61.612, -148.745, 89.4468, -133.867, 113.844, -113.844, 133.867, -89.4468, 148.745, -61.612, 157.906, -31.4095, 161, 0, 157.906, 31.4095, 148.745, 61.612, 133.867, 89.4468, 113.844, 113.844, 89.4468, 133.867, 61.612, 148.745, 31.4095, 157.906, 9.85808e-15, 161, -31.4095, 157.906, -61.612, 148.745, -89.4468, 133.867, -113.844, 113.844, -133.867, 89.4468, -148.745, 61.612, -157.906, 31.4095, -161, 1.97162e-14, -157.906, -31.4095, -148.745, -61.612, -133.867, -89.4468, -113.844, -113.844, -89.4468, -133.867, -61.612, -148.745, -31.4095, -157.906, -2.95742e-14, -161, -2.92069e-14, -159, -31.0194, -155.945, -60.8467, -146.897, -88.3357, -132.204, -112.43, -112.43, -132.204, -88.3357, -146.897, -60.8467, -155.945, -31.0194, -159, 1.94712e-14, -155.945, 31.0194, -146.897, 60.8467, -132.204, 88.3357, -112.43, 112.43, -88.3357, 132.204, -60.8467, 146.897, -31.0194, 155.945, 9.73562e-15, 159, 31.0194, 155.945, 60.8467, 146.897, 88.3357, 132.204, 112.43, 112.43, 132.204, 88.3357, 146.897, 60.8467, 155.945, 31.0194, 159, 0, 155.945, -31.0194, 146.897, -60.8467, 132.204, -88.3357, 112.43, -112.43, 88.3357, -132.204, 60.8467, -146.897, 31.0194, -155.945, 9.73562e-15, -159, 0.0001, -161) +script = ExtResource("2_3ulhv") +radius = 160.0 +metadata/_custom_type_script = "uid://deq18nev0kwbg" diff --git a/snakeManager.gd b/snakeManager.gd new file mode 100644 index 0000000..295165c --- /dev/null +++ b/snakeManager.gd @@ -0,0 +1,18 @@ +extends Node2D + +@export var segements : Array[snake_segment] + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + #segements = get_children() as Array[snake_segment] + segements.assign(get_children()) + for i in segements.size(): + if i == 0: + segements[i].is_head = true + else: + segements[i].next_segment = segements[i-1] + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/snakeManager.gd.uid b/snakeManager.gd.uid new file mode 100644 index 0000000..a8c7261 --- /dev/null +++ b/snakeManager.gd.uid @@ -0,0 +1 @@ +uid://bue4xxejdsmqh diff --git a/test.tscn b/test.tscn index f7974f2..a65d1a0 100644 --- a/test.tscn +++ b/test.tscn @@ -1,34 +1,33 @@ -[gd_scene load_steps=6 format=3 uid="uid://daqqurdrnk61h"] +[gd_scene load_steps=4 format=3 uid="uid://daqqurdrnk61h"] -[ext_resource type="Texture2D" uid="uid://l8x3dp68yyxr" path="res://assets/segement.png" id="1_6uqi0"] -[ext_resource type="Script" uid="uid://deq18nev0kwbg" path="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd" id="2_ppyta"] -[ext_resource type="Script" uid="uid://b48mlxrnte625" path="res://braincell.gd" id="3_ppyta"] -[ext_resource type="Texture2D" uid="uid://qyd5e7lb2esx" path="res://assets/braincell.png" id="3_ykrsh"] - -[sub_resource type="CircleShape2D" id="CircleShape2D_g14j6"] -radius = 16.0 +[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"] +[ext_resource type="PackedScene" uid="uid://cusdydgg4b1bo" path="res://prefabs/braincell.tscn" id="2_6uqi0"] [node name="Node2D" type="Node2D"] -[node name="SnakeSegment" type="AnimatableBody2D" parent="."] +[node name="Snake" type="Node2D" parent="."] +script = ExtResource("1_6uqi0") -[node name="Sprite2D" type="Sprite2D" parent="SnakeSegment"] -texture = ExtResource("1_6uqi0") +[node name="SnakeSegment" parent="Snake" instance=ExtResource("1_8uh7m")] +is_head = true -[node name="DonutCollisionPolygon2D" type="CollisionPolygon2D" parent="SnakeSegment"] -polygon = PackedVector2Array(9.85808e-15, -161, 31.4095, -157.906, 61.612, -148.745, 89.4468, -133.867, 113.844, -113.844, 133.867, -89.4468, 148.745, -61.612, 157.906, -31.4095, 161, 0, 157.906, 31.4095, 148.745, 61.612, 133.867, 89.4468, 113.844, 113.844, 89.4468, 133.867, 61.612, 148.745, 31.4095, 157.906, 9.85808e-15, 161, -31.4095, 157.906, -61.612, 148.745, -89.4468, 133.867, -113.844, 113.844, -133.867, 89.4468, -148.745, 61.612, -157.906, 31.4095, -161, 1.97162e-14, -157.906, -31.4095, -148.745, -61.612, -133.867, -89.4468, -113.844, -113.844, -89.4468, -133.867, -61.612, -148.745, -31.4095, -157.906, -2.95742e-14, -161, -2.92069e-14, -159, -31.0194, -155.945, -60.8467, -146.897, -88.3357, -132.204, -112.43, -112.43, -132.204, -88.3357, -146.897, -60.8467, -155.945, -31.0194, -159, 1.94712e-14, -155.945, 31.0194, -146.897, 60.8467, -132.204, 88.3357, -112.43, 112.43, -88.3357, 132.204, -60.8467, 146.897, -31.0194, 155.945, 9.73562e-15, 159, 31.0194, 155.945, 60.8467, 146.897, 88.3357, 132.204, 112.43, 112.43, 132.204, 88.3357, 146.897, 60.8467, 155.945, 31.0194, 159, 0, 155.945, -31.0194, 146.897, -60.8467, 132.204, -88.3357, 112.43, -112.43, 88.3357, -132.204, 60.8467, -146.897, 31.0194, -155.945, 9.73562e-15, -159, 0.0001, -161) -script = ExtResource("2_ppyta") -radius = 160.0 -metadata/_custom_type_script = "uid://deq18nev0kwbg" +[node name="Braincell" parent="Snake/SnakeSegment" instance=ExtResource("2_6uqi0")] -[node name="Braincell" type="CharacterBody2D" parent="."] -motion_mode = 1 -script = ExtResource("3_ppyta") +[node name="SnakeSegment2" parent="Snake" node_paths=PackedStringArray("next_segment") instance=ExtResource("1_8uh7m")] +next_segment = NodePath("../SnakeSegment") -[node name="Sprite2D" type="Sprite2D" parent="Braincell"] -texture = ExtResource("3_ykrsh") +[node name="SnakeSegment3" parent="Snake" node_paths=PackedStringArray("next_segment") instance=ExtResource("1_8uh7m")] +next_segment = NodePath("../SnakeSegment2") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Braincell"] -shape = SubResource("CircleShape2D_g14j6") +[node name="SnakeSegment4" parent="Snake" node_paths=PackedStringArray("next_segment") instance=ExtResource("1_8uh7m")] +next_segment = NodePath("../SnakeSegment2") + +[node name="SnakeSegment5" parent="Snake" node_paths=PackedStringArray("next_segment") instance=ExtResource("1_8uh7m")] +next_segment = NodePath("../SnakeSegment2") + +[node name="SnakeSegment6" parent="Snake" node_paths=PackedStringArray("next_segment") instance=ExtResource("1_8uh7m")] +next_segment = NodePath("../SnakeSegment2") [node name="Camera2D" type="Camera2D" parent="."] +zoom = Vector2(0.1, 0.1)