Guest User

Sprite2D bug

a guest
Nov 16th, 2025
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extends Node2D
  2.  
  3. @onready var mr_scrumples_node : Node2D = $"Mr Scrumples"
  4. @onready var food : Sprite2D = $Food
  5.  
  6. const BODY_PART : PackedScene = preload("res://Body Part.tscn")
  7. const TILE_SIZE : int = 40
  8. const STATE_LIST : Dictionary[String, String] = {
  9.     "starting" : "Starting", "playing" : "Playing"
  10. }
  11.  
  12. const body_straight_left_right : Object = preload("res://Graphics/body straight left right.png")
  13. const body_straight_up_down : Object = preload("res://Graphics/body straight up down.png")
  14. const body_turn_1 : Object = preload("res://Graphics/body turn 1.png")
  15. const body_turn_2 : Object = preload("res://Graphics/body turn 2.png")
  16. const body_turn_3 : Object = preload("res://Graphics/body turn 3.png")
  17. const body_turn_4 : Object = preload("res://Graphics/body turn 4.png")
  18.  
  19. var state : String = STATE_LIST.starting
  20.  
  21. var mr_scrumples_entity : Array[Dictionary]
  22. var direction : Vector2i = Vector2i(1, 0)
  23. var next_direction : Vector2i = Vector2i(1, 0)
  24. var new_tile : Vector2i
  25. var stored_tile : Vector2i
  26.  
  27. var speed : float = 1.0
  28. var speed_multiplier : int = 4
  29. var walk_timer : float = 0.0
  30.  
  31. var food_tile : Vector2i
  32. var score : int = 0
  33.  
  34. func _ready() -> void:
  35.     randomize()
  36.  
  37. func _process(delta: float) -> void:
  38.     if state == STATE_LIST.playing:
  39.         mr_scrumples_walk(delta)
  40.  
  41. func _input(event: InputEvent) -> void:
  42.     if state == STATE_LIST.playing:
  43.         var dir_list : Dictionary[String, Vector2i] = {
  44.             "ui_left" : Vector2i(-1, 0),
  45.             "ui_right" : Vector2i(1, 0),
  46.             "ui_up" : Vector2i(0, -1),
  47.             "ui_down" : Vector2i(0, 1)
  48.         }
  49.         var available_dir_list : Dictionary[Vector2i, Array] = {
  50.             Vector2i(-1, 0) : [Vector2i(-1, 0), Vector2i(0, -1), Vector2i(0, 1)],
  51.             Vector2i(1, 0) : [Vector2i(1, 0), Vector2i(0, -1), Vector2i(0, 1)],
  52.             Vector2i(0, -1) : [Vector2i(0, -1), Vector2i(-1, 0), Vector2i(1, 0)],
  53.             Vector2i(0, 1) : [Vector2i(0, 1), Vector2i(-1, 0), Vector2i(1, 0)]
  54.         }
  55.        
  56.         for dir in dir_list:
  57.             if event.is_action_pressed(dir) and available_dir_list[direction].has(dir_list[dir]):
  58.                 next_direction = dir_list[dir]
  59.                 break
  60.        
  61.     elif state == STATE_LIST.starting:
  62.         if event.is_action_pressed("ui_select"):
  63.             reset_all()
  64.             await get_tree().create_timer(0.02).timeout
  65.             set_first_mr_scrumples()
  66.  
  67. func reset_all() -> void:
  68.     mr_scrumples_entity.clear()
  69.     direction = Vector2i(1, 0)
  70.     next_direction = Vector2i(1, 0)
  71.     walk_timer = 0.0
  72.    
  73.     if mr_scrumples_node.get_child_count() > 0:
  74.         for node in mr_scrumples_node.get_children():
  75.             node.queue_free()
  76.  
  77. func set_food() -> void:
  78.     var mr_scrumples_tiles : Array[Vector2i]
  79.     var available_tiles : Array[Vector2i]
  80.    
  81.     for body in mr_scrumples_entity:
  82.         mr_scrumples_tiles.append(body["self_tile"])
  83.    
  84.     for num_y in range(7):
  85.         for num_x in range(12):
  86.             if not mr_scrumples_tiles.has(Vector2i(num_x, num_y)):
  87.                 available_tiles.append(Vector2i(num_x, num_y))
  88.    
  89.     food_tile = available_tiles.pick_random()
  90.     food.position = Vector2(food_tile * TILE_SIZE) + (Vector2(TILE_SIZE, TILE_SIZE) / 2)
  91.    
  92.     if food.visible == false:
  93.         food.visible = true
  94.  
  95. func set_first_mr_scrumples() -> void:
  96.     var first_data : Array[Array] = [
  97.         [null, Vector2i(6, 3), Vector2i(5, 3)],
  98.         [Vector2i(6, 3), Vector2i(5, 3), Vector2i(4, 3)],
  99.         [Vector2i(5, 3), Vector2i(4, 3), null]
  100.     ]
  101.    
  102.     for num in range(3):
  103.         mr_scrumples_entity.append({
  104.             "origin_tile" : first_data[num][0],
  105.             "self_tile" : first_data[num][1],
  106.             "after_tile" : first_data[num][2]
  107.         })
  108.    
  109.     set_mr_scrumples_visuals()
  110.     set_food()
  111.     state = STATE_LIST.playing
  112.  
  113. func mr_scrumples_walk(delta : float) -> void:
  114.     walk_timer += delta
  115.    
  116.     if walk_timer >= (speed / speed_multiplier):
  117.         walk_timer = 0.0
  118.         direction = next_direction
  119.        
  120.         for num in range(mr_scrumples_entity.size()):
  121.             if num != 0 and num != mr_scrumples_entity.size() - 1:
  122.                 new_tile = stored_tile
  123.                 stored_tile = mr_scrumples_entity[num]["self_tile"]
  124.                 mr_scrumples_entity[num]["origin_tile"] = mr_scrumples_entity[num - 1]["self_tile"]
  125.                 mr_scrumples_entity[num]["self_tile"] = new_tile
  126.                 mr_scrumples_entity[num]["after_tile"] = stored_tile
  127.             elif num == 0:
  128.                 stored_tile = mr_scrumples_entity[num]["self_tile"]
  129.                 mr_scrumples_entity[num]["self_tile"] += direction
  130.                 mr_scrumples_entity[num]["after_tile"] = stored_tile
  131.             elif num == mr_scrumples_entity.size() - 1:
  132.                 new_tile = stored_tile
  133.                 stored_tile = mr_scrumples_entity[num]["self_tile"]
  134.                 mr_scrumples_entity[num]["origin_tile"] = mr_scrumples_entity[num - 1]["self_tile"]
  135.                 mr_scrumples_entity[num]["self_tile"] = new_tile
  136.        
  137.         if mr_scrumples_entity[0]["self_tile"] == food_tile:
  138.             var new_butt : Dictionary[String, Variant] = {
  139.                 "origin_tile" : mr_scrumples_entity[mr_scrumples_entity.size() - 1]["self_tile"],
  140.                 "self_tile" : stored_tile,
  141.                 "after_tile" : null
  142.             }
  143.             score += 1
  144.             mr_scrumples_entity[mr_scrumples_entity.size() - 1]["after_tile"] = new_butt["self_tile"]
  145.             mr_scrumples_entity.append(new_butt)
  146.             set_food()
  147.        
  148.         var mr_scrumples_tiles : Array[Vector2i]
  149.        
  150.         for num in range(mr_scrumples_entity.size()):
  151.             if num != 0:
  152.                 mr_scrumples_tiles.append(mr_scrumples_entity[num]["self_tile"])
  153.        
  154.         if (
  155.             (mr_scrumples_entity[0]["self_tile"].x < 0
  156.             or mr_scrumples_entity[0]["self_tile"].y < 0
  157.             or mr_scrumples_entity[0]["self_tile"].x > 11
  158.             or mr_scrumples_entity[0]["self_tile"].y > 6)
  159.             or
  160.             (mr_scrumples_tiles.has(mr_scrumples_entity[0]["self_tile"]))
  161.         ):
  162.             game_over()
  163.        
  164.         set_mr_scrumples_visuals()
  165.  
  166. func set_mr_scrumples_visuals() -> void:
  167.     if mr_scrumples_node.get_child_count() != mr_scrumples_entity.size():
  168.         var interval : int = mr_scrumples_entity.size() - mr_scrumples_node.get_child_count()
  169.         var first_index : int = mr_scrumples_entity.size() - interval
  170.        
  171.         for num in range(interval):
  172.             var new_sprite : Sprite2D = BODY_PART.instantiate()
  173.            
  174.             new_sprite.name = str(first_index + num)
  175.             mr_scrumples_node.add_child(new_sprite)
  176.    
  177.     for node in mr_scrumples_node.get_children():
  178.         var node_num : int = int(node.name)
  179.         var body_connection : String = ""
  180.         var dir_list : Dictionary[Vector2i, String] = {
  181.             Vector2i(-1, 0) : "l",
  182.             Vector2i(1, 0) : "r",
  183.             Vector2i(0, -1) : "u",
  184.             Vector2i(0, 1) : "d"
  185.         }
  186.        
  187.         if (node_num != 0
  188.         and node_num != mr_scrumples_entity.size() - 1):
  189.             body_connection += dir_list[
  190.                 mr_scrumples_entity[node_num]["origin_tile"] -
  191.                 mr_scrumples_entity[node_num]["self_tile"]
  192.             ]
  193.             body_connection += dir_list[
  194.                 mr_scrumples_entity[node_num]["after_tile"] -
  195.                 mr_scrumples_entity[node_num]["self_tile"]
  196.             ]
  197.        
  198.         if (node_num != 0
  199.         and node_num != mr_scrumples_entity.size() - 1):
  200.             if body_connection == "lr" or body_connection == "rl":
  201.                 node.texture = body_straight_left_right
  202.             elif body_connection == "ud" or body_connection == "du":
  203.                 node.texture = body_straight_up_down
  204.             elif body_connection == "lu" or body_connection == "ul":
  205.                 node.texture = body_turn_1
  206.             elif body_connection == "ur" or body_connection == "ru":
  207.                 node.texture = body_turn_2
  208.             elif body_connection == "dr" or body_connection == "rd":
  209.                 node.texture = body_turn_3
  210.             elif body_connection == "ld" or body_connection == "dl":
  211.                 node.texture = body_turn_4
  212.            
  213.         elif node_num == 0:
  214.             var head_list : Dictionary[Vector2i, Array] = {
  215.                 Vector2i(-1, 0) : [load("res://Graphics/head side.png"), false],
  216.                 Vector2i(1, 0) : [load("res://Graphics/head side.png"), true],
  217.                 Vector2i(0, -1) : [load("res://Graphics/head up.png"), false],
  218.                 Vector2i(0, 1) : [load("res://Graphics/head down.png"), false]
  219.             }
  220.             var head_dir : Vector2i = (
  221.                 mr_scrumples_entity[node_num]["self_tile"] -
  222.                 mr_scrumples_entity[node_num]["after_tile"]
  223.             )
  224.            
  225.             node.texture = head_list[head_dir][0]
  226.             node.flip_h = head_list[head_dir][1]
  227.            
  228.         elif node_num == mr_scrumples_entity.size() - 1:
  229.             var butt_list : Dictionary[Vector2i, Array] = {
  230.                 Vector2i(-1, 0) : [load("res://Graphics/butt side.png"), false],
  231.                 Vector2i(1, 0) : [load("res://Graphics/butt side.png"), true],
  232.                 Vector2i(0, -1) : [load("res://Graphics/butt up down.png"), false],
  233.                 Vector2i(0, 1) : [load("res://Graphics/butt up down.png"), true]
  234.             }
  235.             var butt_dir : Vector2i = (
  236.                 mr_scrumples_entity[node_num]["origin_tile"] -
  237.                 mr_scrumples_entity[node_num]["self_tile"]
  238.             )
  239.            
  240.             node.texture = butt_list[butt_dir][0]
  241.            
  242.             if butt_dir == Vector2i(-1, 0) or butt_dir == Vector2i(1, 0):
  243.                 node.flip_h = butt_list[butt_dir][1]
  244.                 node.flip_v = false
  245.             elif butt_dir == Vector2i(0, -1) or butt_dir == Vector2i(0, 1):
  246.                 node.flip_v = butt_list[butt_dir][1]
  247.                 node.flip_h = false
  248.        
  249.         node.position = Vector2(mr_scrumples_entity[int(node.name)]["self_tile"] * TILE_SIZE) + Vector2(TILE_SIZE, TILE_SIZE) / 2
  250.    
  251.     var _count : int = 1
  252.     for node in mr_scrumples_node.get_children():
  253.         print(_count)
  254.         print("Position: " + str(node.position))
  255.         print("Path: " + node.texture.load_path)
  256.         _count += 1
  257.  
  258. func game_over() -> void:
  259.     state = STATE_LIST.starting
  260.     print(score)
  261.  
Advertisement
Add Comment
Please, Sign In to add comment