Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 02.10.2019
Сообщений: 18

Тайлы с атрибутами

05.12.2019, 23:53. Показов 1601. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, нужна помощь, но скорее в алгоритме, нежели в программировании.
Дано: Пишу игровой движок, где все графика состоит из сетки, каждая ячейка это свой тайл - картинка в виде песка, горы, травы, воды и т.д. По ней перемещаются объекты - танки, машины, солдаты...
Задача: Как реализовать атрибуты в каждой из клеток? ну то есть чтобы можно было задавать, можно ли вступать на клетку или нет, можно ли строить и т.п.

пример на картинке: разные тайлы с разными атрибутами: 1,2,3,4
П.С. заодно пишу редактор карты, где далее дизайнер мог бы не просто нарисовать карту из тайлов, но и выставить атрибуты.

Спасибо.

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2019, 23:53
Ответы с готовыми решениями:

Спрайты и тайлы. как покрыть экран сеткой. Boulder Dash
QBasic Друзья, нужна очень ваша помощь, ибо я ломаю голову не один год. Постараюсь описать задачу. Если совсем просто: должна...

Использование типов DataContract с другими атрибутами. Прокси класс не генерирует DataContract с атрибутами
Такая проблема. Три дня провозился с сервисом, клиент которого по непонятной мне тогда причине кидал Exception, хотя все было написано...

Тайлы
Всем привет ! Решил я склепать себе "Дьяблоун" и тут обнаружил что жутко хочу иметь возможность изменять текстуру каждого отдельного...

9
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
06.12.2019, 10:53
Цитата Сообщение от Russel327 Посмотреть сообщение
Задача: Как реализовать атрибуты в каждой из клеток? ну то есть чтобы можно было задавать, можно ли вступать на клетку или нет, можно ли строить и т.п.
Если это тайлсет, то побитово на каждый тайл. Грубо говоря каждый тайл должен
соответствовать например машинному слову (если вам хватит битов на каждое свойство).
Если свойству нужно больше бита, то просто выделяем нужное кол-во бит в структуре под него.
При загрузке в карту соотв. тайлам значений, это должно быть задублировано в структуре
карты, не ссылочно, а напрямую. И тут важна одна деталь. В этой UDT первый байт должен
так или иначе указывать на наличие юнита в этой клетке(лучше сразу тип объекта в тайле),
чтобы при его наличии как раз загружать все остальные значения. Эта система абсолютно
рабочая и я могу за это поручиться.

Она менее оптимальная, чем юниты в списке, но более гибкая, надёжная в отладке и открывает
больше возможностей.

Какие-то значения свойств тайлов могут быть взаимоисключающими, поэтому они проверяются
программой при записи в ячейки тайлатров. Вообще так сходу не особо понятно по конкретике(по
совокупному набору свойств всех юнитов) и супер точный ответ дать не получится не держа перед
глазами всей документации.

Если у вас нет ни ТЗ ни документации - будет жопа 100%, документируйте каждую писюльку,
все юниты, каждое свойство, все строения и каждое их свойство, нужно определить взаимодействия
между всеми объектами, взаимодействия с тайлами карты любого свойства и т.д..
Документированию подлежит абсолютно всё, слои карты. Причём желательно избегать сложных
словесных оборотов, допустим если харвестер собирает какой-то ресурс, нужно разбить его
действия на однотипные (event 1: стоит ждёт, event 2: тип движение\подтип поворот,
event 3: тип движение\подтип движение, event 4: сбор ресурса, event 5: указание на поиск маршрута и т.д.)
Это всё очень утрированно, название этому - каскадная триггерная логика, программируется непросто,
но по итогу конечно фигня(не работа, а пушечное мясо), основной завтык гарантированно будет в другом.
Думаю вы догадываетесь где.

Цитата Сообщение от Russel327 Посмотреть сообщение
Пишу игровой движок
На каком ЯП? И размер карты? Сразу скажу возможно это в принципе или нет.
0
2 / 2 / 0
Регистрация: 02.10.2019
Сообщений: 18
06.12.2019, 11:15  [ТС]
Quiet Snow, пишу, к бы ни странно, на qb64. Спасибо за ответ. Постараюсь вникнуть
0
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,350
06.12.2019, 11:27
как-то компилировал helloword в qb64. выяснилось, что процесс поджирает память. то ли утечка, то ли. троян, то ли еще что-то. забраковал и удалил и никому не советую
0
2 / 2 / 0
Регистрация: 02.10.2019
Сообщений: 18
06.12.2019, 12:03  [ТС]
Quiet Snow, хотя, зачем я пытаюсь делать вид, что что-нибудь понял. Ничего не понял ((
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
06.12.2019, 12:33
Цитата Сообщение от Russel327 Посмотреть сообщение
Quiet Snow, пишу, к бы ни странно, на qb64
RTS, RPG? Что есть из написанного? Аналог чего предполагается? Размер карты не просто так спросил.

В своё время много лет потратил на реверс D2K. Потом просто собрал все наработки в редактор
и ещё несколько утилит. Человеку(проф. тестировщику), который занимался картами редактор
понравился(он в общем то и формировал требования), карт где-то 30 он на нём сделал, сам я
им пользовался только для редактирования ресурсов карты, на FED2K до сих пор нет ничего подобного,
единственные люди, которые смогли осилить полный рендер карты - OpenRA, но двиг там печальный(кстати
на .NET с соотв. тормозами , оригинал напомню отлично работал на 200-х MMX-ах).
У амеров крупное, гордое и слепое(сильное и независимое) коммьюнити. Хотя надо отдать должное,
MVI - монстр и ещё один чел умудрился генератор карт написать, хуже по алгоритму чем я предположил,
но написал, всё равно красавец, я этот алгоритм отмёл сразу, а более кошерный не осилил(здоровье
просело и бросил), там была недетерминировщина и неподъёмное кол-во аналитики.
Ещё было дофига разных тулз, и формировщик тайлблоков, редактор тайлатров, генератор концептов карт,
редактор смещений юнитов(для центровки), скриншотер карт и что-то ещё по мелочи писал консольное
по ТЗ, когда коллеге ещё всё это было интересно. Редактор смещений недавно одному челу переделал
в редактор анимации по запросу, не за так конечно))) У него свой проект на Unity, а сообщество D2K
к сожалению сдохло в 2009-2011-х когда разбежался duneforum. 245 билдов D2K Hardcore сделали,
с 2009 года как раз, 9 лет считай.
Так весело конечвно было. Сейчас уже этим не занимаюсь(другие задачи), надо будет оформить
несколько утилит, выложить и больше не возвращаться к этой теме. Но если есть конкретные вопросы
спрашивай. Не то что прям чем-то сильно смогу помочь, но если будет не трудоёмко направлю в нужное
русло. Всё таки один человек - мало для таких дел, это говорю без всяких понтов и приколов.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.12.2019, 17:46
Если в вашем языке поддерживаются перечисления, то можно сделать так:

PureBasic
1
2
3
4
5
Enum TileTypes
    Ground ' земля
    Sand    ' песок
    Tree     ' деревья
End Enum
И так далее.

Теперь в самом тайле нужно указать его тип:

PureBasic
1
2
3
4
5
Type Tile
    Dim TileType As TileTypes
    ...
    ' здесь любые другие нужные поля
End Type
Сами тайлы можно хранить в виде массива:

PureBasic
1
2
3
4
Const StageHeight As Integer = 25
Const StageWidth As Integer = 80
 
Dim Tiles(StageHeight * StageWidth - 1) As Tile

Если не поддерживаются, то в структуре Tile для поля TileType указываете тип данных Integer.

(Код указан для FreeBASIC)
1
2 / 2 / 0
Регистрация: 02.10.2019
Сообщений: 18
07.12.2019, 23:19  [ТС]
Спасибо! а вывод на экран? или можно я вам в личку напишу насчет этого?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.12.2019, 23:55
Выбирайте нужный тип квадратика и рисуйте:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
For i As Integer = 0 To StageHeight * StageWidth - 1 - 1
    Select Case Tiles(i).TileType
        
        Case TileTypes.Ground
            ' Нарисовать землю
            DrawGround()
            
        Case TileTypes.Sand
            ' Нарисовать песок
            DrawSand()
            
        Case TileTypes.Tree
            ' Нарисовать деревья
            DrawTree
            
    End Select
Next
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
08.12.2019, 02:37
Цитата Сообщение от Замабувараев Посмотреть сообщение
Выбирайте нужный тип квадратика и рисуйте
Тип тайла нужен не для того, чтобы рисовать каждый отдельно. Для отрисовки это не важно,
это важно для движения объектов по карте и учёта при расстановки объектов в редакторе.
Потому что тайлов в тайлсете может быть под тысячу, документировать каждый - это жесть,
они выводятся в двойном цикле просто из массива карты. Вшивать каждый в код - означает
ограничить последующее создание тайлсетов. Ограничения нужны только частичные в местах,
где стопроцентно должно быть что-то одно и работать одинаково(например сам добываемый
ресурс или иные специфические вещи), а также слои FOW.
И например TileTypes.Ground-ом может быть(обычно так и есть) вполне не один тайл.
Ограничивать же определённым количеством и тем паче конкретной областью простой "пейзаж"
смысла нет, для целей определения этих параметров используют т.н. тайлатры(отдельные файлы,
либо зашиваемые в сам файл тайлсета - атрибуты, по которым программа сможет понять что
это конкретно за тайл и каковы его свойства, куда его можно поставить и что по нему может
бегать и ездить).
Отрисовка это чаще процедура DrawMap, которая выводит несколько слоёв спрайтов.
Предварительно рассчитав границы. И тут есть два варианта, делать клиппинг и не делать,
если мы работаем без внутриэкранного клиппинга, тогда по бокам ставятся бордюры
шириной с тайл(которые могут быть заменены чем-то, что рисуется сверху, например
элементами интерфейса), иначе же либо ставиться хардварное отсечение, либо рендер идёт
непосредственно в спрайт. Каждый вариант - это разные вычисления.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2019, 02:37
Помогаю со студенческими работами здесь

Java тайлы
дайте какой-нибудь урок или статью по работе с тайлами, если есть (гугл не помог)

Многострочные тайлы
Доброго времени суток . Не подскажите как сделать многострочный текст в тайлах . Если не правильно выразился , то пример. Внутри...

Материал, Тайлы
Есть тайл из 55 картинок, поместил его в материал. Как указать объекту, какую из 55 картинок показывать? (На примере КУБ) Надо, чтоб из...

Откуда cmd берет тайлы букв?
читаю форум, в соседней ветке обсуждают коды нажатия клавиш клавиатуры. подумал, как происходит рисование в командной строке, в том...

Тайлы . Движение карты , заполнение тайлами
Всем привет! :) Долго пользовался статичной картой. Но число клиентов растет и границы района тоже расширяются. В программе была карта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru