![]() |
Алгоритм расположения клипов разного размера на сетке
Здравствуйте!
Мне нужно реализовать расположение на определённой сетке, состоящей из клеток, клипов разного размера (1х1 и 1х2 клетки). С размером 1х1 я разобрался, и реализовал перетаскивание и отпускание. Мой алгоритм вычисляет математически координаты ближайшей к перетаскиваемому клипу клетки, и при отпускании ставит его именно в ячейку. Если клетка занята другим клипом, то перетаскаваемый клип возвращается при отпускании на своё место. Клипы сортируются при создании, Но вот с элементами неквадратной формы (1х2) возникли проблемы. Непонятно, как именно реализовать размещение и сортировку таких элементов. Можете подсказать принцип? |
Что вы подразумеваете здесь под сортировкой?
Где именно трудность с размещением? Они у вас первоначально где-то на панели, и вы их перетаскиваете в рабочую зону? Постоянна ли ориентация этих элементов 1x2 или предполагаются повороты? В общем, информации мало. Если изначально они на панели и их надо сориентировать, то можно элемент поворачивать последовательно на 90 гр. по клику на элементе в этой панели, перед перетаскиванием. Была такая игра - NetStorm, там из элементов различной формы (1x1, 2x1, Г-образ.) надо было собирать конструкцию-мост. Этот алгоритм был реализован, но там можно было крутить элемент по клику правой, пока он оставался "приклеен" к мыши. А по клику левой, если место было выбрано удачно, он на него вставал. Расчет также можно вести математически, создав модель сетки и проверяя при выборе места, не занято ли выбранное место (как для 1x1, так и 1x2 элементов). |
В целом, это похоже на инвентарь, как в сталкере. Предметы появляются по вызову функции на сетке, в свободном месте, которое определяется функцией. Есть 2 типа иконок - квадрытные, и прямоугольные. Программа должна определять расположение, перетаскивание и отпускание элементов.
|
Ну она же из каких-то соображений определяет это расположение?
И что значит "определять... перетаскивание и отпускание"? Что конкретно у вас не получается? |
Вы в сталкер играли? Там можно перетаскивать иконки как угодно по сетке. Когда подбираешь новое оружие, оно появляется в инвентаре на сетке. Алгоритм определяет координаты для каждого элемента, и размещает их. Это расположение.
При перетаскивании элементов опять же проверяется отпускание элемента - свободно ли место под ним ,или нет? Это перетаскивание и отпускание. Я это имел ввиду. Всё это работает для квадратных элементов в моём алгоритме. Но я не знаю, как сделать работу с элементами размера MxN. По сути, мне нужно каждый раз определять сколько клеток занимает элемент, брать левую-верхнюю клетку на сетке под элементом, отсчитывать от неё количество занимаемых элементов и проверять свободны ли они. Но какую модель нужно разработать, чтобы она была универсальна? Можете подсказать, или показать? |
Понятно. Нет, в Сталкера не играл, но в Диабле и Невервинтере такой же принцип, с ними я знаком. Лучше конечно, не городить огород, а сделать все итемы однослотными, как в иных играх - и производить оценку по "весу" + количеству слотов (в Линейке и других MMORPG, например, так). Это на много бы упростило вам мат. модель инвентаря.
А уж если на то пошло, и хочется как-то учитывать габариты итемов, то игрока стоило бы разгрузить от перепаковки инвентаря и производить ее автоматически всякий раз при получении итема. Тогда задача тоже бы упростилась. Но это ваше, конечно, дело. По сути есть две части задачи: автоматический прием очередного итема в сразу "правильное" место при поднятии и расстановка итемов игроком. Что касается второго, то нужно создать "двумерный" массив, отражающий инвентарь и при добавлении в него итема производить запись в соотв. клетки значения, можно простое булево true. При попытке опустить итем в слоты определять позицию элементов в "двумерном" массиве и делать их проверку на true по заданной конфигурации. Если не понимаете, как эмулируется двумерный массив в AS2, почитайте или спросите, если не поймете. Что касается первого, т.е. алгоритма оптимальный автоматической укладки, сейчас не смогу ничего выдать, возможно, кто-то подскажет. |
Спасибо!
|
| Часовой пояс GMT +4, время: 07:00. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.