Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2008, 14:19   #1
Пальмира
Пользователь
 
Аватар для Пальмира
 
Регистрация: 01.04.2008
Сообщений: 10
По умолчанию Puzzle... Помогите со склеиванием кусочков

Здравствуйте! Помогите пожалуйста в написании игры Puzzle.

Загвоздка в том, что я никак не могу додуматься, как склеивать между собой подходящие фрагменты изображения, т.е. если игрок соединяет два подходящих кусочка, то они склеиваются в один большой кусочек

Заранее благодарна
Пальмира вне форума Ответить с цитированием
Старый 01.04.2008, 15:28   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

А Вы какими методами собираетесь отрисовывать частички пазла? ...логика в индексах конечно же, ...храним в памяти правильную карту индексов принадлежности кусочков с индексами поворотов, и соответственно, при установке в нужное место карты скелета при совпадении индексов делаем процедуру отрисовки кусочка в общую картинку пазла.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.04.2008, 18:45   #3
Пальмира
Пользователь
 
Аватар для Пальмира
 
Регистрация: 01.04.2008
Сообщений: 10
По умолчанию

Большое спасибо за быстрый ответ

Цитата:
А Вы какими методами собираетесь отрисовывать частички пазла?
на данный момент это реализовано так:
Открывается картинка и режется на 16 кусочков (4*4), каждый кусочек отрисовывается в Image (т.е. получается, что у меня 16 компонентов Image на форме). Возможно, есть какие-то более удобные способы сделать это Была б очень благодарна за подсказку.

А теперь вновь возникшие вопросы...
Цитата:
храним в памяти правильную карту индексов принадлежности кусочков с индексами поворотов
а можно поподробнее? Нужно хранить координаты или лучше сделать индексы, как в массиве (например,"12" - 1 строка 2 позиция)? Поворачивать фрагменты в мои планы не входит (я так полагаю индексы поворотов нужны бы были только в этом случае).

Цитата:
делаем процедуру отрисовки кусочка в общую картинку пазла.
допустим, склеили таким образом два кусочка - не могу взять в толк, как в этом случае полученный фрагмент будет взаимодействовать с другими. Какой индекс следует ему задавать?..

Последний раз редактировалось Пальмира; 01.04.2008 в 19:02.
Пальмира вне форума Ответить с цитированием
Старый 01.04.2008, 19:52   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Пальмира Посмотреть сообщение
допустим, склеили таким образом два кусочка - не могу взять в толк, как в этом случае полученный фрагмент будет взаимодействовать с другими. Какой индекс следует ему задавать?..
А если так:

На поле сетка (невидимая). Фрагменты можно помещать только в ячейки сетки.

Один массив [1..4,1..4] of TImage хранит правильное расположение фрагментов.

Второй такой-же - текущее состояние. Незанятые клетки = nil. Очень легко рисовать. И даже если нужно будет переместить "склеенные" фрагменты,
их легко вычислить просто просмотрев соседние ячейки.

Если нужно будет усложнить в дальнейшем, можно сделать например фрагменты в виде шестиугольников или с вырезами (как в бумажном варианте). Структура программы практически не изменится. Разве что нужно будет хранить угол поворота фрагмента.
alexBlack вне форума Ответить с цитированием
Старый 01.04.2008, 20:57   #5
Пальмира
Пользователь
 
Аватар для Пальмира
 
Регистрация: 01.04.2008
Сообщений: 10
По умолчанию

To alexBlack, спасибо за внимание
Цитата:
На поле сетка (невидимая). Фрагменты можно помещать только в ячейки сетки.

Один массив [1..4,1..4] of TImage хранит правильное расположение фрагментов.
А сейчас примерно так все и выглядит, только сетка видимая (т.е. это своего рода регион проверки). А хотелось бы соединять в любом месте игрового поля.

Все же скланяюсь к индексации и даже попробовала кое-что. "Склеила" 2 фрагмента: проверила правильность положения по индексу, а после начала вместе их перемещать (т.е. при перемещении 1-го кусочка второй двигается рядышком как хвостик). Правда сразу возник вопрос: два то передвинуть не проблема, а как быть с большим числом?

Вобщем мыслительный процесс в разгаре...

Если есть идеи - высказывайте любые Даже если напрямую не поможет - возможно натолкнет на какую-нибудь интересную мыслю
Пальмира вне форума Ответить с цитированием
Старый 01.04.2008, 21:02   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

У каждого кусочка хранить по четыре ссылки - на то, что должно быть справа, снизу и т.д. Перед перемешиванием инициализировать, в процессе "работы" - проверять совпадает/не совпадает
B_N вне форума Ответить с цитированием
Старый 01.04.2008, 22:51   #7
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Подробнее...

Чтобы двигать и соединять части пазла в любом месте, нужно отказаться от создания множества объектов Image. Используйте PaintBox, отрисовывайте через Canvas кусочки в нужном положении.
Создайте сперва свой тип:

Код:
type
  TPuzzle = object
    Map: TBitmap; // картинка кусочка
    Width: Word; // длина кусочка
    Height: Word; // высота кусочка
    Top: Word; // координата положения по-Y
    Left: Word; // координата положения по-X
    IdLeft: Word; // индекс скрепки слева
    IdRight: Word; // индекс скрепки справа
    IdUp: Word; // индекс скрепки сверху
    IdDown: Word; // индекс скрепки снизу
    IndexAttach: Word; // привязка кусочка
  end;
Вот это будет основа, позже добавите необходимые параметры. Свой массив назначаете типом TPuzzle (Mas: array[1..4,1..4] of TPuzzle). В процессе резки исходного образца запоминаете кусочки изображения в Mas[i,j].Map, размеры картинки в Mas[i,j].Width, Mas[i,j].Height. Индексы проставляются по строкам массива, начиная с верхних индексов (задайте 0 для случая "нет стыковки"), затем левые и правые, причем левый индекс последующей картинки равен правому индексу предыдущей, а верхний индекс картинки нижнего ряда равен нижнему индексу картинки верхнего ряда в том же столбце.
Mas[i,j].IndexAttach Вам будет нужен для ссылки на другую картинку, к которой данная прикрепилась, если совпали индексы и координаты на плоскости.
Сделайте флаг Drag: Boolean, в OnMouseDown PainBox'а придавайте ему истину, в OnMouseMove PainBox'а проверяйте флаг, если он истинный, то считывайте координаты мыши (Mouse.CursorPos.X и Mouse.CursorPos.Y) тот кусочек что попал координаты мыши должен сохранять в себе новые свои координаты в массиве пока мышь двигается, (а вместе с ним и те, что привязаны к нему) и клавиша нажата. В OnMouseUp PainBox'а пропишите ложь флага.
Прорисовка через Canvas идет отдельной процедурой. В ней первым делом затирается поле, дальше просматриваются все ячейки в массиве, отображаются картинки с их координатами (PaintBox.Canvas.Draw(Mas[i,j].Top,Mas[i,j].Left,Mas[i,j].Map));
Вот в принципе, основа, остаются нюансы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.04.2008, 23:34   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
У каждого кусочка хранить по четыре ссылки - на то, что должно быть справа, снизу и т.д. Перед перемешиванием инициализировать, в процессе "работы" - проверять совпадает/не совпадает
А по-моему, в процессе ухаживания за девушкой вы все несколько отвлеклись от сути задачи.
По-моему, это не что иное, как разновидность известной игры в "пятнашки". И пронумеровать нужно всего лишь сами "кусочки", а кто сверху, снизу, сбоку - определяется исходной матрицей.
Да и исходники для "пятнашек" и на форуме где-то были...
mihali4 вне форума Ответить с цитированием
Старый 01.04.2008, 23:40   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А по-моему, в процессе ухаживания за девушкой вы все несколько отвлеклись от сути задачи.
По-моему, это не что иное, как разновидность известной игры в "пятнашки". И пронумеровать нужно всего лишь сами "кусочки", а кто сверху, снизу, сбоку - определяется исходной матрицей.
Да и исходники для "пятнашек" и на форуме где-то были...
mihali4, не совсем. В пятнашках ездит один кубик, вообще говоря, а здесь, как я понял, должны перемещаться структуры (может быть даже нерегулярные, почему я и предложил списки) из многих "кубиков".
B_N вне форума Ответить с цитированием
Старый 02.04.2008, 06:57   #10
Пальмира
Пользователь
 
Аватар для Пальмира
 
Регистрация: 01.04.2008
Сообщений: 10
По умолчанию

Beermonza
Большое спасибо за подробный ответ Мне кажется это как раз то, что нужно!

mihali4
Если бы все было так просто - я бы даже не стала создавать тему, потому что исходник пазлов-пятнашек у меня есть в книжке, а уж в интернете он выложен чуть ли не на каждом ресурсе, посвященном программированию
Пальмира вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц