Форум программистов, компьютерный форум, киберфорум
Игровые движки
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 436

AstarGrid2D

26.02.2026, 19:16. Показов 1729. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у МЕНЯ ПРОБЛЕМА, я кликаю на юнита и всё время пишет ветка " Клик за пределами хода "
ГДЕ ОШИБКА ? Я просил разных ИИ переписать мой код по другому, но всё равно эта проблема не исчезает
я уже не знаю где искать ошибку ? При клике текущего юнита на юнита другого должно писать " Начало атаки"
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
extends Node2D
 
@onready var tile_map: TileMap = $TileMap
@onready var label_1: Label = $Label1
@onready var label_2: Label = $Label2
 
var units_data = {
    "unit1": {"texture": preload("res://u1.png"), "move": 3},
    "unit2": {"texture": preload("res://u2.png"), "move": 4},
    "unit3": {"texture": preload("res://u2.png"), "move": 5}
}
var slots = {1: "unit1", 2: "unit2", 3: null, 4: "unit3"}
 
var astar = AStarGrid2D.new()
var unit_nodes = {} # Словарь для хранения Sprite2D юнитов
var current_slot_index = 0
var slot_keys = []
var active_unit_id = ""
var is_moving = false
 
func _ready():
    slot_keys = slots.keys()
    slot_keys.sort()
    setup_astar()
    spawn_units()
    next_turn()
 
func setup_astar():
    var map_limits = tile_map.get_used_rect()
    astar.region = map_limits
    astar.cell_size = tile_map.tile_set.tile_size
    astar.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER # Ход только по горизонтали/вертикали
    astar.update()
    
    # Помечаем непроходимыми все клетки, кроме ID = 0
    for x in range(map_limits.position.x, map_limits.end.x):
        for y in range(map_limits.position.y, map_limits.end.y):
            var coords = Vector2i(x, y)
            var data = tile_map.get_cell_source_id(0, coords)
            if data != 0:
                astar.set_point_solid(coords, true)
 
func spawn_units():
    for slot in slots:
        var unit_id = slots[slot]
        if unit_id == null: continue
        
        var sprite = Sprite2D.new()
        sprite.texture = units_data[unit_id]["texture"]
        sprite.centered = false
        # Размещаем в (1, номер слота)
        var grid_pos = Vector2i(1, slot)
        sprite.position = tile_map.map_to_local(grid_pos) - (astar.cell_size / 2.0)
        add_child(sprite)
        unit_nodes[unit_id] = sprite
        # Юниты блокируют клетки для AStar
        astar.set_point_solid(grid_pos, true)
 
func next_turn():
    clear_highlight()
    
    # Поиск следующего живого слота
    var attempts = 0
    while attempts < slot_keys.size():
        var key = slot_keys[current_slot_index]
        active_unit_id = slots[key]
        current_slot_index = (current_slot_index + 1) % slot_keys.size()
        
        if active_unit_id != null:
            show_move_range()
            return
        attempts += 1
 
func show_move_range():
    var start_pos = tile_map.local_to_map(unit_nodes[active_unit_id].position)
    var move_dist = units_data[active_unit_id]["move"]
    
    label_1.text ="Ходит "+str(active_unit_id)+"- из координат "+str(start_pos)
    #наложим маркер на текущего юнита
    tile_map.set_cell(1, start_pos, 2, Vector2i(0,0)) # Слой 1, ID тайла 1
    # Временно открываем клетку юнита для расчета путей
    astar.set_point_solid(start_pos, false)
    
    for x in range(start_pos.x - move_dist, start_pos.x + move_dist + 1):
        for y in range(start_pos.y - move_dist, start_pos.y + move_dist + 1):
            var target = Vector2i(x, y)
            if not astar.is_in_boundsv(target) or astar.is_point_solid(target):
                continue
            
            var path = astar.get_id_path(start_pos, target)
            if path.size() > 1 and path.size() <= move_dist + 1:
                tile_map.set_cell(1, target, 1, Vector2i(0,0)) # Слой 1, ID тайла 1
    
    astar.set_point_solid(start_pos, true)
 
func clear_highlight():
    tile_map.clear_layer(1)
 
func _input(event):
    if is_moving or not event is InputEventMouseButton: return
    if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
        var target_map_pos = tile_map.local_to_map(get_global_mouse_position())
        process_move(target_map_pos)
 
func process_move(target_pos: Vector2i):
    var unit_sprite = unit_nodes[active_unit_id]
    var start_pos = tile_map.local_to_map(unit_sprite.position)
    var move_dist = units_data[active_unit_id]["move"]
    
    # Проверка на другого юнита
    var target_unit_id = ""
    for id in unit_nodes:
        if tile_map.local_to_map(unit_nodes[id].position) == target_pos:
            target_unit_id = id
            break
    
    astar.set_point_solid(start_pos, false)
    var path = astar.get_id_path(start_pos, target_pos)
    astar.set_point_solid(start_pos, true)
    
    if path.is_empty() or path.size() - 1 > move_dist:
        label_1.text = "клик за пределом хода"
        return
 
    if target_unit_id != "" and target_unit_id != active_unit_id:
        label_1.text = "начало атаки"
        path.remove_at(path.size() - 1) # Останавливаемся перед целью
    else:
        label_1.text = ""
 
    if path.size() > 1:
        label_2.text = str(path)
        move_along_path(path)
    else:
        next_turn()
 
func move_along_path(path: Array):
    is_moving = true
    clear_highlight()
    
    var old_pos = path[0]
    var new_pos = path[-1]
    
    astar.set_point_solid(old_pos, false)
    
    for i in range(1, path.size()):
        var target_world = tile_map.map_to_local(path[i]) - (astar.cell_size / 2.0)
        var tween = create_tween()
        tween.tween_property(unit_nodes[active_unit_id], "position", target_world, 0.2)
        await tween.finished
        await get_tree().create_timer(0.05).timeout # Небольшая задержка
    
    astar.set_point_solid(new_pos, true)
    is_moving = false
    next_turn()
0
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 436
03.03.2026, 17:32  [ТС]
Студворк — интернет-сервис помощи студентам
Royal_X, там надо доделывать урон и здоровье мобов суммарное в стаках. Потом на 3D перенесу если всё будет чётко работать.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3073 / 1064
Регистрация: 01.06.2021
Сообщений: 11,809
03.03.2026, 17:34
Mr_den, добавь больше смешных фраз.
0
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 436
29.03.2026, 23:14  [ТС]
Royal_X, так ты учавствовал в моём опросе Какой ОС вы пользуетесь? ? Я в 2D сделал рабочую схему. Ща мучаюсь в 3D переношу. Одного юнита было просто перенести, а чтобы всех со всеми связями - очень запарно.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3073 / 1064
Регистрация: 01.06.2021
Сообщений: 11,809
30.03.2026, 11:07
Mr_den, проголосовал
0
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 436
30.03.2026, 21:39  [ТС]
В общем какое то порно твориться я дал ИИ доделать и меши когда занимают новую позицию - не удаляються со старой и ИИ начинает с этим бороться методом принудительного удаления мешей Я не могу понять почему это происходит. А причём в первые 2 хода меши удаляются принудительно, а потом нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru