![]() |
Движок для игры "линии"
Всем привет.
Делаю сейчас игру, по типу "линий". Это когда собираешь три или больше кубика одного цвета в ряд - они исчезают. Ну, типа такой игры. И вот, собственно, у меня вопрос - как лучше всего сделать движок для этой игры? Учитывая что новые блоки могут появляться с разных сторон и соответственно - будут двигать ряды или столбцы. Все или выборочно. Я, поначалу, думал что легко сделаю эту игру, но как взялся за реализацию, понял что не всё тут просто. Я сделал так. Создаю стартовый массив: Код AS3:
Код AS3:
Подскажите, может есть более простые способы реализации подобной игры? Чтоб можно было легко отслеживать положение блока на экране и не терять его связь с данными в массиве? Ато что-то мне кажется что что-то я намудрил... Сложная какая-то конструкция получается. |
Я бы для начала использова вместо blank и startingPosition , 0 и 1, ну или тру / фэлсе.
А вообще конечно я бы использовал box2D и методом "сканирования" линий убивал не нужны. Тогда вообще не нужно было б знать что, где и куда ложить. Всё само б собиралось и рассыпалось. |
Цитата:
|
Вложений: 1
ndiezel хм...
|
Цитата:
Тогда можно про вот это поподробней: Цитата:
Это функция, которая будет находить от трёх и больше в одну линию? Или есть какая-то похожая в box2D? |
Не надо бокс2Д, это оверкил.
Посмотрите пример PiratePigs который в пакете демо проектов с OpenFL идет, там все просто сделано тут гайд по ковырянию в openFL Заметьте, я не предлагаю делать на Haxe, я предлагаю посмотреть реализацию (синтаксис языка очень похож на AS3, а openFL апи вообще почти копирует стандартный флешевсий) |
Эммммм.....
Бокс для лайнсов? Может пока не поздно курьером пойти работать и нуевонафиг это программирование? Добавлено через 3 минуты делаешь шаблоны вида: Код:
0, 0, 1Код:
1, 1, 1Код:
1Код:
1, 0, 0Это как самое очевидное и простое решение. Если мозги включить то можно и что-то поизящнее придумать. Мне сейчас этим заниматься не охота. И да. В любом случае или 0, 1 или тру/фолс. Но у тебя там скорее всего будут шарики разноцветные, так что тру фолс наверное нет, а вот номер цвета вполне может быть. Добавлено через 7 минут Еще одно простое решение - пройтись по всем ячейкам и посмотреть на +/- одну в каждую сторону от нее. если и + и - будут такими же как исходная - можно убирать. |
Простого прохода по столбцам и по строкам хватит за уши. Прикручивать что-то левое для такой задачи очень мощный изврат.
|
Я тут подумал.
Всё-таки склоняюсь к реализации через flex DataGrid + ItemRenderer. Метода лучше - для этой задачи не найти. |
Цитата:
Уже лет 7 как. |
Вложений: 1
Цитата:
2. В экземпляре класса храним ссылку на визуальный объект Или, если мы фанаты MVC и не хотим чтобы наш массив что-то знал об отображении, то не делаем ссылку внутри Block, а храним словарь (Dictionary): Код AS3:
Eсли fla не открывается - не обращайте на него внимания - там кода нет, он весь снаружи Вложение 30061 |
Чем вам бокс не угодил?)
Создаем физические карты, генерируем объекты сверху вниз и методом сканирования проходим по телам определяя индекс по остатку от деления index[ X%(CountObjectX/StepX) , Y%(CountObjectX/StepX) ]. Не нужно никаких дополнительных массивов. При клике сдвигаем только отображение, сами тела оставляем в покое, при составлении линий уничтожаем тела, имеем красивую визуализацию взаимодействия объектов, играем с физ свойствами и профит. |
Цитата:
|
Цитата:
|
Наверное поэтому уже и играть не во что.
Добавлено через 39 секунд Потому что "думать не приходится". Ни души ни идеи, ни усилий. Только фреймворк написанный кем-то и непонятно как работающий. Конструктор. |
Цитата:
Добавлено через 7 минут p.s. и не думаю что уступит рукописным методам ТС. |
А разве в случае с Box2D нет вероятности что блок вдруг решит повернуться и застрять? Принципиально дома попробую сделать просто падающие блоки, что-то мне подсказывает что ничего не выйдет. И оно всё развалится.
|
Для этого в Box2D есть физ. свойства объектов. Можно объект на объекте налаживать и ничего не развалиться, не помню точное название свойства но знаю что 100% есть. (
Добавлено через 2 минуты Вот визуально выглядит на 11 Шаге с выключенным балансированием и включенным |
Ага, понял. Спасибо. Идея неплохая, но всё же кажется что физ.движок здесь лишний.
Разве что сделать так, чтобы физика использовалась по делу. Эффекты какие-то, или в конце игры взрыв кубикам делать) |
Да можно просто изменить вес объектов и их пружинные свойства, etc. В соответствии будут разные визуальные эффекты как одно на другое падает. Так же можно вконце игры или взрывать или сглаживать углы чтобы все ящики сползли, вообще м вариаций множество. Опять таки соглашусь с тем что физ. движок здесь избыточен но он решает вопрос игровой логики, остается только генерить с условие сверху объекты и механизм определяющий линии. профит.
|
Как раз сейчас балуюсь с JS + Box2D, тема для эксперимента вполне подойдет.
|
Цитата:
|
В общем-то мысль про box2D у меня была... Когда я взялся за функцию появления новых блоков.
Нахождение схожих и общая, стартовая, расстановка блоков, падание блоков после убирания схожих - уже было сделано. Загвоздка стала именно с появлением новых. Потому что они сдвигали все блоки на одну ячейку влево. И нужно было ещё учитывать пустые ячейки, которые могли быть между основной "кучей" блоков и каким-нибудь остатком. В общем - после попыток всё это собрать, я посмотрел в сторону box2D. Но, как писал выше - после двух часов бесплотных попыток заставить его работать - плюнул и таки собрал нужную функцию. Которая сейчас благополучно прошла тестирование и работает :) К слову, кто хочет попробовать написать движок, я делаю аналог вот этой игры - http://www.deadwhale.com/play.php?game=2124 Чтоб я не расписывал все правила, так проще показать. |
Вы че, прикалываетесь все?
Тут поле ограниченных размеров - массив двумерный. Значение от ноля (пусто) до кол-ва цветов на поле. Плюс какой-то уникальный для взрывчатки. По клику: 1. Отловить всех соседей, если >= 2 - взорвать. (если взрывчатка то весь ряд) 2. Далее сдвигаем сверху вниз. Можно если не заморачиваться - пройтись по всему полю, начиная от самых верхних рядов, и если под ячейкой есть дырка - уронить ее. Если заморачиваясь, то волнами вокруг образовавшейся дырки. 3. Раз в несколько кликов - сдвинуть всю конструкцию влево. Опять же начиная от дальшнего ряда. Это работа модели и массива-карты поля. А вью по этим даным отрисовать вообще не проблема. |
В классических линиях никто никуда не падает
|
Классические линии реализовать сложнее в плане анимаций.
Там еще и поиск пути прикручивать надо. А тут вообще нифига нету. Взял и сделал. |
Обычная задача на логику. Че тут делать то. Все сводится к поиску в массиве по определенному правилу, удалению элементов и последующей сортировке. Просто надо взять личт бумагии на нем для себя зарисовывать варианты и в голове прогонять алгоритм.
|
Да, я посмотрел какую именно вы игру делаете, думаю с Боксом Вы намучаетесь, я подумал за игру где кубы меняются местами. Первая сложность какая будет у Вас, это двигать их всех. А создавать виртуальный мир на каждый столбец не логично.
Лучше всего Вам работать с массивами. Примерно я думаю так Код AS3:
конечно, нужно пихать экземпляры боксов в массив и не придумывать велосипеды с sprite.name но мне просто было лень создавать отдельный класс, хотя и можно было б в internal. Добавлено через 4 минуты да и там с проверкой чуток наворотил, можно обойтись одной рекурсией. Добавлено через 6 минут oops... бажит) Ну извините) |
AlexCooper игра у Вас вообще не работает, она живет своей жизнью)
|
Akopalipsis у меня работает, бажит правда)) Но можно взять за основу подкорректировав. Небыло времени дотачивать.
|
AlexCooper у меня к Вам вот какой вопрос, да и вообще ко всем кто сможет ответить - я у Вас в коде не нашёл методов удаления элементов массива, и что мне первое пришло в голову, когда я думал как это сделать, это тоже не удалять или просто нулить элементы. Но если играть два часа, то не получится так, что память уронится?
|
AlexCooper, спасибо вам за труды. Вы, пока что, один из не многих кто не доказывал мне как просто это сделать, а взял и попробовал сделать сам. (Да-да, это камень в огород некоторых :) )
Но к сожалению, я почти ничего не понял в вашем коде. Сначала я даже засомневался - на AS3 ли это?.. Попытался разобраться, но видимо, я ещё не так хорошо знаю язык. Я надеялся что отпишется кто-нибудь кто занимался разработкой именно такой или похожей игры, игра-то популярная, шансы были. Но всё скатилось к обсуждениям в стиле "как я бы это сделал" или "как я считаю это должно работать в теории". А такие обсуждения я считаю безсмыссленными, в силу уже написанного ранее: "Сам был такой же умный, пока не взялся сделать". Ну и поскольку в обсуждении не было ничего такого, что кардинально бы отличалось от способа, которым сделал я, буду надеяться что движок выдержит все последующие мои "фичи", а если где не выдержит - мне хватит извилин в тыковке, чтоб его допилить) В общем - буду делать по своему, тем более что пока что - всё работает. А там посмотрим. Благодарю всех за ответы. Пы.Сы. К слову, кто хочет посмотреть на игрушку, которая уже потихоньку рождается - пишите в личку, дам доступ к ней на фгл. |
А мне наоборот интересно сам принцип реализации, так как я много ещё чего не знаю, то очень хотел бы получить названия способов реализации. Меня интересует -
1) Стоит ли создавать обьекты заново или же стоит в самом начале создать максимум квадратов, а потом их перекладывать из массива в массив? 2) Как узнавать всб цепочку совпадений цветов? Это обход пути? |
Это задача из разряда тестовых заданий при приеме на работу. Так что извините. На камень не откликнусь.
|
Цитата:
Если игра не закончилась и в последующем будут новые объекты, то обычно "отработавшие" объекты не удаляют, а скрывают. Лично я перемещал "отработанные объекты" в отдельный массив и если мне нужен был "новый" объект - выдёргивал мувик из вот этого, массива отработавших объектов. Задавал ему нужные параметры, размещал там, где мне нужно, удалял из отработанного массива и размещал в новый, с рабочими мувиками. Это позволяло снижать нагрузку на процессор, когда мувиков оказывалось много. Код AS3:
Вот функция: Код AS3:
Цитата:
|
Я в данной теме обсервер:) Хоть направление уже ближе к верному избрали))))
|
А если уйти от слов "тестовых заданий" и представить, что знания одного кода мало, нужен ещё опыт, которого лично у меня нет и скоро не предвидится. То как должна быть построена сама игра?
То есть не логика, а механизм игры? Ряды кубиков, это отдельные массивы? Если это все один массив, то как он двигает только часть его? Ведь когда между рядами пробелы, то ряды за пробелами не двигаются. Может тут есть сетка, которая каждый ход обновляет данные о своем состоянии?) |
Я бы во-первых рекомендовал мвц.
Все изменения производить с двумерным массивом интовых кодов в модели. Далее уже думать как рисовать вью. И вот тут уже однозначного ответа дать не могу. Тут уже хоть бокс2д может по этому массиву рисоваться с физ-эффектами. Могуть быть партиклы, может быть плавное переекание одного кубика в другой как лава или кисель. От этого всего очень сильно может отличаться реализация вьюхи. Модель же при любых раскладах проще всего сделать именно двумерным массивом и просто сортировать и двигать ячейки в нем. Если берем за основу пример по ссылке - то тут один из самых простых вариантов - во вью тоже двумерный массив. Т.е. и во вью и в модели два идентичных массива данных, но в модели просто код цвета, а во вью уже мувики. Далее просто остается научить каждый мувик в массиве вью научить удаляться и двигаться и всё. (Добавляться они все будут стандартно и по целому столбцу слева, это другой механизм, это уже в каждый кубик пихать не стоит) |
Цитата:
|
Написал же выше.
Цитата:
Можно: Код AS3:
Хотя я бы использовал битмапдату как массив. И брал бы один элемент массива как один пиксель и по цвету бы уже смотрел. Но это уже высокая материя. (примерно так) |
| Часовой пояс GMT +4, время: 07:32. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.