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

AstarGrid2D

26.02.2026, 19:16. Показов 1477. Ответов 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
Сообщений: 425
03.03.2026, 17:32  [ТС]
Студворк — интернет-сервис помощи студентам
Royal_X, там надо доделывать урон и здоровье мобов суммарное в стаках. Потом на 3D перенесу если всё будет чётко работать.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,573
03.03.2026, 17:34
Mr_den, добавь больше смешных фраз.
0
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 425
29.03.2026, 23:14  [ТС]
Royal_X, так ты учавствовал в моём опросе Какой ОС вы пользуетесь? ? Я в 2D сделал рабочую схему. Ща мучаюсь в 3D переношу. Одного юнита было просто перенести, а чтобы всех со всеми связями - очень запарно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,573
30.03.2026, 11:07
Mr_den, проголосовал
0
 Аватар для Mr_den
12 / 10 / 2
Регистрация: 06.09.2022
Сообщений: 425
30.03.2026, 21:39  [ТС]
В общем какое то порно твориться я дал ИИ доделать и меши когда занимают новую позицию - не удаляються со старой и ИИ начинает с этим бороться методом принудительного удаления мешей Я не могу понять почему это происходит. А причём в первые 2 хода меши удаляются принудительно, а потом нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru