Game Maker - создание игр | HellRoom Games
Июль 12, 2025, 13:35:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Автоматическое преобразование вида блоков в зависимости от окружения  (Прочитано 26301 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« : Март 28, 2012, 18:06:45 »

Эта тема уже несколько раз затрагивалась на форуме, и где-то даже был работающий пример. Однако вновь и вновь актуальность проявляется, но при этом пример становится найти всё труднее и труднее. Поэтому я решил создать эту тему, в которой разъясняется принцип работы и присутствует пример.

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

Алгоритм весьма прост и для вычисления номера кадра спрайта использует всего 4 двоичных операции.

Итак, чтобы рассчитать номер кадра, мы проверяем блоки вокруг и устанавливаем в переменной соответствующие биты, если какой-либо блок присутствует.

В моём примере за каждый блок вокруг отвечает один бит в переменной env:
Код:
слева - бит 0
справа - бит 1
сверху - бит 2
снизу - бит 3

в итоге у нас получается 16 всевозможных вариантов:
Код:
  нвпл  (низ, верх, право, лево)
0  0000   нет блоков округ
1  0001   блок слева
2  0010   блок справа
3  0011   блок слева и блок справа
4  0100   блок сверху и так далее
5  0101
6  0110
7  0111
8  1000
9  1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
Тут четырьмя цифрами указано двоичное значение, а слева - соответствующее ему десятичное. Оно же и является номером нужного кадра. Секрет в том, что спрайты стоят именно в таком порядке, поэтому нам не нужно ничего дополнительно высчитывать.

Итак, сначала заносим в переменную ноль (сбрасываем все биты). Дальше проверили, есть ли блок слева. Если да, то устанавливаем бит 0. Следующий - справа. Если есть, то устанавливаем бит 1. И так далее. В итоге получили номер кадра.
После этого нужно также не забыть изменить внешний вид прилегающих блоков.

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

upd:
ссылка на вариант с анализом 8 окружающих блоков (то есть используется 8 бит).

* autofill.gmk (17.55 Кб - загружено 986 раз.)
« Последнее редактирование: Август 11, 2013, 10:39:56 от Dmi7ry » Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
lucheus
Free Bird
«Старожил форума»
******

Репутация: 81
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [50 дней на форуме]
API: GameMaker Studio 2
Деятельность: Игростроение, дизайн, музыка, ролики и т.п
Сообщений: 769


« Ответ #1 : Март 29, 2012, 17:02:54 »

Браво  Давно искал нечто подобное. Все понятно обьяснено  Уважуха
Записан

"Глина, из которой ты слеплен, высохла и затвердела, и уже ничто и никто на свете не сумеет пробудить в тебе уснувшего музыканта или поэта, или астронома, который, быть может, жил в тебе когда-то" (с) Антуан де-Сент Экзюпери

Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #2 : Март 30, 2012, 07:27:34 »

http://forum.hellroom.ru/index.php?topic=6009.0
Записан

plomax
Активный участник
*****

Репутация: 24
Offline Offline

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 300


« Ответ #3 : Март 30, 2012, 08:07:39 »

КРУТО 

Я тоже знаю вот в вложение

* Редакторы карта.rar (1047.97 Кб - загружено 731 раз.)
Записан

Я легенда 2525 А.Е.
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #4 : Март 30, 2012, 17:05:48 »

Да, именно оно. А я эту тему искал пол дня, так и не нашел...
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
kashey_immortal
GM Pro user
*

Репутация: 110
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]Настоящий игродел!
API: GameMaker Studio Master
Деятельность: Платформеры
Сообщений: 525



WWW
« Ответ #5 : Апрель 10, 2014, 12:31:39 »

Извините за некропост, но вопрос касается именно этой темы.
Цитировать
upd: ссылка на вариант с анализом 8 окружающих блоков (то есть используется 8 бит)
Может кто нибудь объяснить или сделать пример 8-и окружающих блоков?
Уже 2-й день эта задачка мне покоя не дает. Английский не знаю потому статья по ссылке для меня не совсем понятна
Записан

onChyk
«Старожил форума»
******

Репутация: 170
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Деятельность: Программист GML AAA класса, пиксель-художник, геймдизайнер
Сообщений: 2318



WWW
« Ответ #6 : Август 15, 2014, 12:07:30 »

Сделал скрипт, похожий на этот пример, он из спрайта с 16-ю заранее нарисованными кадрами выбирает нужный исходя из 4-х стен вокруг. Если кому нужно готовое рабочее решение, могу скинуть. Работает безбажно и безбожно.
Записан

S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #7 : Январь 04, 2015, 13:50:53 »

Всё получилось сделать, но возникла проблема. Оказывается, мне не хватает 16-ти кадров спрайта, т.к. у меня генерируется остров с пляжами, а 63 кадра слишком много, мне минимум нужно 32.

Есть ли похожая статья?

Заранее спасибо.
Записан

Коты - Мирители
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #8 : Январь 04, 2015, 14:33:17 »

не хватает 16-ти... а 63... мне минимум нужно 32.
Это ж сколько там измерений...
А что сложного - здесь 4 стороны, 4 цифры в переменной, дальше просто проверка переменной и установка кадра.
Тут автоматическая замена, если сложность в подборе для нее кадров, тогда есть в ссылке из второго ответа ручная.
Записан

S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #9 : Январь 04, 2015, 14:35:30 »

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

---
По поводу "ручного способа". Сначала я так и хотел сделать, но вспомнил, что есть автоматический и не придётся писать кучу лишних строчек кода.
Записан

Коты - Мирители
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #10 : Январь 04, 2015, 16:31:48 »

Вместо текстуры можно использовать градиент, который впоследствии использовать в качестве альфа-канала для наложения любых текстур.
http://forum.hellroom.ru/index.php?topic=20673.msg251096#msg251096
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #11 : Январь 04, 2015, 19:52:05 »

Dmi7ry, вы читаете мои мысли. Я хотел ещё сделать, чтобы разные текстуры накладывались, но пока ещё не начинал это делать.
Записан

Коты - Мирители
SilkSlime
Новичок
*

Репутация: 0
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 7


« Ответ #12 : Сентябрь 19, 2015, 13:20:54 »

Путь просто здесь полежит..
Пример с учетом угловых блоков, основанный на case

* test.gmk (79.54 Кб - загружено 633 раз.)
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #13 : Июнь 02, 2016, 23:24:26 »

По просьбам трудящихся, пример с анализом 8 окружающих блоков.

* autofill_8bit.gmk (72.61 Кб - загружено 589 раз.)
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Fur
Абы-какой
GM Pro user
*

Репутация: 463
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]Третье место на HellRoom Jam #9 [Flucoldache]За лояльность! [+300 репутации]Настоящий игродел!Боже мой, посмотрите на эту медальку! Первое место на HellRoom Jam #6
API: Game Maker 8.0 Lite
Деятельность: Бурная.
Сообщений: 3673


Лисяток тебе.


« Ответ #14 : Июнь 03, 2016, 00:33:31 »

Записан

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

Hyperflex
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.11 секунд. Запросов: 34.