Моя новая попытка сделать хентайную игру на Патреон.
Всем привет!
Дни идут, моложе я не становлюсь, часики-то тикают, а коммерчески-успешным хентай-инди разработчиком я пока что так и не стал, непорядок.
Поэтому, даже понимая, что проблемы кроются где-то внутри меня и что отдельные челленджи скорее всего сами по себе не помогут, я всё-таки хочу кое-что замутить.
Мою собственную личинку игры.
И хочу под такое дело установить срок сдачи работы, условия и новый взнос в наградный фонд в случае обосрамса.
Срок: до 13-го августа нынешнего года.
Взнос: 10k рублей.
Условия: 10 минут геймплея; сексуальная сцена с монстро-девушкой; вся эта херня должна оказаться на Патреоне.
Вроде всё простенько, есть какие-то шансы даже и справиться.
В ближайшее время выкачу идеи по игре и чуть по чуть начну крафтить гаму.
Ну чё, народ, погнали?!
- 11 июня 2019, 23:59
- 014
Я бы сказал что срок великоват, но если ты будешь делать только по выходным по 8 часов, то - норм.
Тебе программист не нужен?
Я очень тормозной в плане создания контента, так что два месяца может и мало ещё будет.
Насчёт помощи программистом - подумаю, серьёзно.
Хочу взять ещё денёк-другой на утрясание мыслей по игре и подготовку раскрывающих суть картинок и мокапов.
А предыдущая попытка чем кончилась ?
Попытка рисовать 100 дней подряд, когда я ставил бабосики - успешно.
Попытка сделать хентайную игру про покемонов, когда я ничего не ставил - провально.
Как мне кажется: не надо было начинать с домиков и карты, во многих подобных играх задники плохо прорисованы, задники в последнюю очередь, главный контент в первую.
Не, я бы доделал.
Проблема была в том, что я охладел к предполагаемой механике (т.е., к главному).
Ну йобана, предупреждать же надо. Шок-контент нам в группе в VK не нужон.
Что-то как-то поздно ты проснулся делать хентай на патреоне. Все равно, что бросится сейчас биткоин попать. Поезд ушел не то, что давно, там железнодорожные пути уже молодым ельником поросли.
А что там на Патреоне? Вроде же не банят хентай, в отличии от тамблера.
Просто там игр уже как нейтронов в нейтронной звезде.
Конкуренция большая, нужно очень постараться, чтобы обратить на себя внимание.
Но там всё равно свободнее, чем в среднем по индустрии.
Мне уже скоро 28 будет, а никаких особых достижений или даже серьёзных увлечений нет.
Либо это, либо начинать косплеить 2B, как автор канала CustomStories.
Делать игры круто.
Я хочу делать игры.
Хентайные.
2В лет
А я уж подумал, что это Raseri на фотке. Чем-то похож:3
Однозначно меч за кам бек и мотивацию!
Откуда такой классный скриншот?
Два месяца делать игру на 10 минут геймплея? Отдай эти 10к лучше мне. Найму художника, завезу в Хау арты...
Суть планируемой игры.
Предыстория.
Игра разворачивается в магическом средневековом мире; в большом городе, выстроенном вокруг Подземелья.
В городе существует Гильдия Искателей, члены которой имеют дарованное королём право набирать, вооружать и обучать отряды наёмников, заключённых или проданных за долги, для исследования и лутания магического Подземелья. Взамен они обязаны отдавать процентик от любых продаж того, что не используют и не экипируют сами, а так же абонентскую плату за нахождение в гильдии.
Вся судебная система выстроена вокруг обеспечения Искателей расходным человеческим материалом - любого рода преступники содержатся в заключении до того момента, пока кому-нибудь не потребуются мясные щиты и носильщики - в этом случае на них одевается ошейник, способный оторвать им голову или доставить невообразимые мучения по желанию Искателя или в случае попытки напасть на него.
В качестве пряника - служба Искателю является путём к свободе.
Любое преступление имеет свою цену в количестве походов в Подземелье; оттарабаниваешь нужное число ходок - и свободен.
Аналогично работает взаимодействие с проданными, но они освобождаются тогда, когда набирается нужная сумма с процента общей ценности добытого с их участием лута (даже без продажи).
Королевство выкупает должников или отчаявшихся людей, а те расплачиваются, добывая ценности и прокачивая Искателей или стимулируя торговлю в стране, принцип таков.
Каждый Искатель перед каждым входом в Подземелье одаривается одноразовым Амулетом Возвращения, который позволяет Искателю в абсолютно любой момент ливнуть с катки (правда, без тимы и лута), либо автоматически срабатывает в момент получения Искателем смертельного удара (отменяя оный).
Под управление игрока поступает ньюфаг с вип-карточкой, с возможностью пойти в тюрьму и выбрать себе трёх заключённых/проданных из некоего списка, а затем начать свой путь к магическо-средневековому успеху.
Основной гейплей.
Игрок выбирает себе компаньонов (каждый со своей фотокарточкой, причинами залёта, сроком использования и набором навыков/характеристик/недостатков и, реже, достоинств), наделяет их именами Сдох1, Сдох2, МояВайфу, кое-как на свои гроши экипирует и пускается во все тяжкие, отправляясь в подземелье.
В подземелье огребает и что-то хапает.
Вернувшись в гильдию, лечится и лечит выживших; пополняет тиму до полного стака; продаёт говно; покупает шмот и пока идёт постепенный отхил, ходит на учёбу/водит на учёбу дронов; разговаривает и хентайно взаимодействует с подчинёнными.
Подталкиваемый абонентской платой и желанием что-то кушать, снова идёт в Подземелье.
Повторить.
Перед входом в подземелье предлагается на выбор несколько вариантов, с разными параметрами размера карты, сложности врагов, количеством и видом ожидаемых ништяков, а также разным гарантированным ценным лутом в главном сундуке.
Враги отличаются друг от друга не только какими-то обычными параметрами, но и резистами и опасными для героев способностями/типами атаки.
Например, зомби будут через некоторое время подниматься снова, если по ним не критануть режущим оружием или не ударить огнём/уроном света; по призракам 100% шанс попадания имеет только серебряное оружие; гоблины могут повесить статус отравления; колдуны призывают много врагов, если только не успеть вынести их дистанционным оружием, застанить или, незаметно подобравшись, убить при помощи навыков скрытности.
В итоге каждый вариант подземелья будет требовать своей экипировки и состава команды.
Если в начале с некоторыми вражинами будет слижком уж тяжко и из-за этого некоторые подземелья будут казаться непроходимыми, постепенно, при наборе эквипа, дела будут становиться лучше и это, как мне кажется, должно давать чувство прогресса.
Список монстров тоже нужно будет куда-то тиснуть на экране выбора подземелья.
Механика.
В подземелье - пошаговая РПГ на локациях, собранных из тайлов.
В городе - аналог Slave Maker'a, Валета Плетей и иже с ними.
Хентай-контент.
Он займёт у меня очень много времени (как и в целом какие-либо работы по введению возможности общения с НПЦ), так что для начала ограничусь одной штукой.
В тюрьме, среди прочих вариантов, будет доступна пойманная на этом самом проститутка.
При выборе, она сразу же обратиться с игроку с просьбой присмотреть за ней в подземелье и сильно не рисковать её жизнью, а взамен предложит свою дырку; столько раз, сколько игрок её пожелает.
Порядок выполнения работ.
Я отдаю себе отчёт в том, что по части крафта контента я тормозок, так что в самом начале я полностью откажусь от рисования своей графики, заменив её какими-нибудь заглушками или натыренными в интернете картинками, с прицелом на то, чтобы перерисовать всю эту срань позже, когда будет готов функционирующий скелет игры.
Порядок работы над игрой следующий:
1) Генерация карты (комнаты, коридоры, расстановка персонажей, врагов, лута).
2) UI, передвижение персонажей по карте, реализация возможности подбирать вещи, инвентарь и экран экипировки.
3) Простенький ИИ врагам, заставляющий их атаковать персонажей после входа последних в комнату, в которой монстры находятся, боевая система.
4) Экран выбора заключённых в тюрьме; магазин, больница, школа; экран подготовки пати к походу в подземелье.
5) Какая-никакая система диалогов, позволяющая на этапе выбора заключённых и в доме немного поговорить с ними.
6) Кнопочка активирования хентайной сцены и сама хентайная сцена.
7) Вступление.
8) Главное меню.
9) Любые другие хотелки, если успею (нет).
Звучит не сильно вкусно на самом деле.
Тут либо сильные сцены нада, либо... одно из двух. Если бы были диалоги, сюжет, мотив ещё куда не шло. А так... На РПГ мукере я б это и за неделю реализовал при свободном графике.) Ну не считая рисовки.
Собственно, да. Читается как очередное... Ну это имхо конечно.
Возможно так игра будет восприниматься на ранних этапах лучше, но возможно , стоит попробовать использовать какие-нибудь свои кривые заглушки. Максимально кривые, чтобы сразу видно было что плохо! Чтобы было больше мотивации исправить это в будущем \ нарисовать контент.
А движок ты уже выбрал?
Вообще, читая описание, сразу ощущается данж-кроулер. При этом конечно в моём случае - от первого лица, хех.
Делаю на Lӧve, т.к. уже раньше пытался что-то мутить на нём + знаю lua более-менее (хотя многие вещи приходится вспоминать заново из-за длительного простоя, хнык)
Надеюсь, это ты будешь платить на патреоне, чтобы в игру поиграли?)
День 1. Ну, типа.
Настолько обнаглел, что решил сделать карту аж по такому принципу.
С высокими стенами, которые будут мешать другим комнатам и которые вследствие этого в нужные моменты времени будут по-нужному обрезаться.
Здоровья и счастья погибшему.
А не слишком ли заморочено все это реализовывать?
Какой смысл в масле, если в нём нет масла?
* вместо "масл" подставить "челлендж"
ну хз, если механику будет сложно делать, то на неё вся творческая энергия и уйдёт, и главный контент опять за бортом останется, а если легко, то ок
День 2.
Для начала решил сделать кой-какой генератор подземелья, чтобы он расставлял клеточки пола всяко-разно красиво и связно.
Тема оказалась достаточно сложной и матано/алгоритмо-ёмкой, я охренел просто от разнообразия и запарности используемых в сабже методов. Тем не менее, кое-что я для себя подобрал и потихонечку сделаю.
Пока что могу похвастаться тем, что освежил свои навыки погромирования на Луа и организовал аккуратненький вывод косоугольных тайлов на экран.
Полосочка тёмно-красных клеток понадобиться мне позже, чтобы лучше видеть, сколько свободного места будет оставаться после окончания генерации.
Есть несколько полезных мыслей (или вредных советов) по поводу желания сделать, а не по поводу конкретики того, что ты собираешься сделать. А именно:
представь, что весь мой ответ который я здесь напишу, это игра, а каждое слово или даже символ - элемент игры.
Я могу написать красивое предложение, но это еще не красивая игра (в том смысле что полноценная, успешная и логически завершенная).
Я могу написать красивый рассказ. Это будет немного сложнее и дольше. Это уже близко к полноценной, успешной и логически завершенной игре, но еще не игра).
И наконец, я могу написать целый роман. Могу, но шансов, что работа действительно будет завершена не так уж много.
В этой жизни ты можешь быть тем, кто что-то создает, тем кто берет что-то готовое или и тем и другим, но чем крупнее твой проект, тем меньше времени ты сможешь уделить графике (очень мало), программированию (больше, но тут требуется опыт) и больше времени сможешь уделить развитию интересных идей и сюжета.
Очень много времени от твоего проекта будет отнимать твоя основная деятельность (работа) и поэтому в рабочее время ты не сможешь делать проект, даже возможно не сможешь думать о нем. В оставшееся время не всегда есть желание делать, потому что ты устал, тебе хочется отвлечься и масса других причин.
Кем ты хочешь быть в своем проекте ? Руководителем, тем кто будет что-то создавать, но слушать руководителя или человеком-оркестром ? Руководитель вообще говоря озабочен совершенно иными проблемами нежели непосредственно вопросы разработки. Он включает в работу тех, кто в теме. Участники проекта - непосредственные его исполнители - могут быть совершенно не осведомлены о том, что собой будет представлять проект в целом, но зато они хорошо представляют именно ту часть проекта, за которую отвечают. Ну и наконец человек-оркестр - руководит сам собой.
Первые 2 типа людей - руководители и исполнители в принципе не создают проект, а лишь включаются в работу с ним на определенных этапах, а значит - их роль в проекте стремится к нулю, хотя это не значит что они не вносят в него ценный вклад. Точно также результат их деятельности им по сути не принадлежит и они не могут сказать: мой. Они могут лишь сказать - я в нем участвовал.
Человек оркестр отвечает за все в своем проекте. Однако то, что он получит на выходе далеко не всегда окажется тем, что называется успешным проектом.
Как видишь эти две крайности являются своими прямыми противоположностями. Узкая специализация позволяет добиваться высокого качества. Широкая специализация достичь высокого качества позволяет лишь ценой значительных упрощений и использования таких методов, которые командная разработка не будет использовать никогда.
Красивая и хорошо проработанная игра делается долго, упорно и мучительно. Чаще всего не одним человеком и чаще всего от выполненной работы устают настолько, что потом просто уже не могут видеть свое творение.
С другой стороны человек оркестр делает мало и в целом для самого себя. Полученный результат может оказаться интересным лишь ему самому и лишь с точки зрения того опыта, который он почерпнул в ходе разработки и что нового узнал о самом себе. Для постороннего эта информация не несет никакой пользы и смысла, он видит только внешние результаты, которые чаще всего лишь разочаровывают.
С моей личной точки зрения нет ничего такого, чего бы ты не смог освоить (в меру своих способностей конечно и главное, интересов, ведь вряд ли мы будем усваивать то, что нам малоинтересно или вообще противно). Но описанные выше крайности можно умело сочетать и они могут вполне гармонировать между собой.
Ничего не мешает тебе сделать не крупную нереализуемую в ближайшие 100 лет игру, а маленький проектик, который можно сделать в течение дня. Однако помни, этого дня у тебя тоже нет. Ты не можешь делать игру с утра до самого позднего вечера, забыв о еде, сне и других повседневных делах. Да это и не нужно наверное. Скорее нужно уметь находить интересное в малом, уметь использовать небольшие отрезки времени с пользой или же просто отдыхать от всех забот и проблем.
Увы потраченные усилия никогда не окупаются в полной мере. И лишь иллюзии тешат нас тем, чем они не являются никогда на самом деле. Хорошо там, где нас нет. Успешный проект это мучения, боль и тяжелый изматывающий труд. Делая игру, или начиная это делать, постарайся теперь и впредь не забывать об этом.
Молчание золото. А пустая болтовня это зло. Не обещай никому и ничего, а просто делай это, а затем покажи результат.
Все эти псевдомотивационные посты, на самом деле лишь отнимают твое время и усилия от главной задачи.
Зачем пытаться объяснять и доказывать что-то и кому-то, когда все то же самое ты можешь просто записать в свой личный блокнот и не показывать никому.
Но когда придет время, обязательно показать какие результаты на данный момент достигнуты.
Спасибо за простыню.
У этого челленджа есть два возможных исхода:
1) Я учусь чему-то новому + получаю игру
2) Я учусь чему-то новому + наградный фонд Гамина пополняется на 10k
Оба варианта великолепны, каждый по-своему.
Было бы из-за чего переживать.
шикос)
День 3. (осталось 54 дня)
Разобрался с модулями, функциями, действиями над таблицами.
Организовал создание стартовой комнаты, не выходящей за пределы карты с двумя дверьми (и будущими местами крепления "Конструкторов коридоров/комнат"), которые никогда не смотрят на те направления от комнаты, где слишком мало места.
День 4. (осталось 53 дня)
Пошагал по пути завершения генератора семимильными шагами (нет)
На самом деле я всё равно молодец.
1) Обнаружил совершенно дичайшую ошибку, при которой функция рандома выдавала один и тот же результат на разных итерациях цикла даже при использовании повторной команды взятия ключа по системному времени.
Что-то вроде этого
For i=1,2 do
math.randomseed(os.time())
local x = math.random()
end
выдавало одинаковые х, тогда как
For i=1,2 do
math.randomseed(os.time()+i)
local x = math.random()
end
наконец-то заработало!
Может, я что-то не понял про системное время?
2) Ввёл концепцию направления N-S-W-E в условиях двумерного дискретного пространства, с возможностью повернуть только на 90 гр. за раз.
3) Организовал поочерёдную работу (по одному действию на "ход") любого числа конструкторов со своими параметрами длинны/ширины коридора, шанса поворота, времени жизни и шанса появления нового конструктора.
Красава, только я все равно не понимаю, зачем геймплей в хентай игре?
А мне нужен гемплей в эротических и подобных играх)
Сам мечтаю об эротической игре (может придётся самому разрабатывать),
с открытым миром, но короткими сессиями, где можно как попасть в плен,
так и самому пленить, с минимальным крафтом, готовкой, сменой суток,
сменой погоды, смены сезонов, возможность короткую сессию продлять на сколько угодно времени,
пока самому не надоест, но и чтобы игра не тянула время, если захочешь быстро пройти игру.
Также чтобы можно было покупать и обустраивать дома, а также кастомизация персонажа максимальная, одежда, причёска, пол, цвет кожи, рога, хвост, уши, крылья и прочее, различные расы и форма тела.
Глубокие разветвления переходов, можно из подвала какого-нибудь дома попасть в подземелье, которое будет вести в несколько различных мест. Куча тайн и секретов, чтобы было много секретных концовок.
Параллельные миры или загробные миры. С различным транспортом и напарниками.
С хорошей и продуманной боёвкой, но можно всю игру пройти не сражаясь. Всё это хочется в одном проекте)
На Скайрим уже давно есть много секс модов.)
сменой пола
лол :D
Геймплей нужен. Иначе это не игра, а кинцо какое-то.
Но тут чувак явно перебарщивает с этим. А вообще... игра не может считаться хентаем, если в неё нельзя играть одной рукой.)
Ты делаешь неправильно.
math.randomseed(seed) нужно вызывать 1 раз, в love.load.
После этого каждый вызов math.random() будет выдавать новое значение.
Если тебе нужно более 1-го рандомного генератора (например, основной для генерации подземелья и другой для случайных событий), то используй вместо них rnd = love.math.newRandomGenerator(seed) и rnd:random().
В таком случае тебе не придется сохранять всю геометрию подземелья, достаточно будет сохранить только seed - тогда подземелье будет генерироваться каждый раз одинаковое.
Большущее спасибо.
День 5. (осталось 52 дня)
Начал делать проверку области перед постройкой коридора.
Это говнище уезжает куда-то не туда, так что завтра засяду и спокойно и терпеливо пересоберу формулу, чтобы всё было пучком.
Сам кусочек программы по проверке области (с учётом того, что ширина и длинна коридора это очень относительные вещи с учётом направления постройки) выглядит примерно так:
for j=1,(CT[i].Width + 2) do
for k=1,CT[i].Length do
if Map.Cells[CT[i].X-math.abs((math.floor((CT[i].Width+2)/2)+j)*CT[i].Rot[2])+(k*CT[i].Rot[1])][CT[i].Y+(k*CT[i].Rot[2])-math.abs((math.floor((CT[i].Width+2)/2)+j)*CT[i].Rot[1])] ~= 0 then
-- ...
end
end
end
Короче говоря, ебалово ещё то.
Не удивительно, что где-то ошибся.
UPD.
Почти починил.
Осталось только кое-откуда единичку по-умному вычесть.
Код показывать не буду - он стал ещё страшнее.
UPD 2.
Короче, сегодня я тоже всё-таки молодец.
да не так ведь! 11 сна 6 фрустрации и 3 работы!
День 6. (остался 51 день)
Обнаружил проблемку с постройкой повёрнутого коридора (относительно первоначально имеющегося вектора) - коридор некрасиво прижимается с родительской комнате.
Пытался решить через магию чудовищного усложнения формулы построения, но не особо удачно.
Решил, что буду брать некоторое пространство, проверять на наличие препятствий, а затем просто сдвигать коридор перед постройкой.
UPD не будет, сегодня я не победил.
Завтра снова блядский полноразмерный рабочий день, так что просто иду спать.
Не делай пока генератор подземелий. А то так ты кучу времени потратишь на ерунду и кроме генератора подземелий ничего не получится.
Сделай одно, фиксированное подземелье и начни с геймплея. Перемещение, потом наступание на клетки с объектами и врагов. Затем - экран битвы и боевка, возврат на экран подземелья.
Тебе надо сделать хотя бы 1 объект (тот же фонтан с эффектом), 1 врага с битвой, и 1 объект, при достижении которого происходит конец игры. Потом когда это будет работать - нарисуй для этого графику, сделай звуки и возьми бесплатную музыку. Когда эти 10 минут геймплея будут играбельными (и у тебя все еще останутся силы и время) - можно будет начать расширять игру вширь, используя ранее написанный код (добавлять врагов, воинов, графику, объекты и прочее).
Генератор уровней лучше делать в самом конце, когда тебе уже известно какие объекты есть в твоей игре и где им лучше располагаться (то есть набор всего того что должно генерироваться).
По моему опыту - наиболее сложный и основной код геймплея (который ты будешь использовать повторно) лучше писать в выходные. На него уходит больше всего времени и этот код важнее всего написать правильно и удобно для дальнейшего использования. В выходные ты будешь более свеж и сосредоточен, насажаешь меньше ошибок чем уставший после работы.
В будни, по вечерам, лучше писать мелкий "одноразовый" код, формирующий контент игры. Там легче отлаживать баги, они более заметные и не такие критичные. А самое главное - за 1 вечер можно сделать законченный кусочек игры, к к-му больше не придется возвращаться.
Ок, нормальный совет, воспользуюсь.
День 7. (осталось 50 дней)
Начал искать способ сделать скроллинг экрана при перемещении мышки (в показанных примерах я выкручивал graphics.scale до 0.2, но в будущем он должен вернуться в норму и для осмотра карты мне всё равно придётся скроллинг реализовывать).
И... во всяких туториалах это выглядит довольно мудрёно.
Есть умельцы по löve?
Изменять координаты всех отрисовываемых объектов или какие-то встроенные функции использовать, и если да, то как?
ну проще, возможно, делать преобразование координат. типа love.graphics.translate(тут циферки). и love.graphics.push() и love.graphics.pop().
Тогда тебе не надо ковырять отдельно координаты при отрисовке. Один раз сделал преобразование - всё само отъезжает как надо
Можно немного подробнее про push и pop?
Ну, то есть, я понял про сохранение и восстановление графических параметров, но зачем оно мне вообще надо, если я буду просто постоянно двигать экран, без необходимости возвращаться в исходную точку?
да всякое может быть. вот хочешь ты отрисовать данж, а сверху интерфейс, к примеру
love.graphics.push()
love.graphics.translate(сдвиг_камеры_по_х, сдвиг_камеры_по_y)
--тут рисуешь данж и всё такое прочее, координаты нигде менять не надо при этом - умный движок всё за тебя сделает
love.graphics.pop()
--тут рисуешь всё остальное, для чего сдвига камеры не надо.
К примеру - кусок UI нужно отрисовать с координатой (0,0). А если не отменить translate, то он уедет вообще за пределы экрана
Понятно, большое спасибо.
День 8. (осталось 49 дней)
Очень лень пытаться пилить гифку, но мне удалось приделать скроллинг экрана при подведении мышки к одному из краёв.
Немного беспокоит тема выбора мышкой конкретного тайла.
Ну, вот, чтобы я наводил мышкой на клеточку и программа понимала, над чем именно находится курсор.
Во-первых - тайл косоугольный, причём конкретно.
Это даже не повёрнутый квадрат (тогда бы я мог легко решить проблему поворотом оси координат).
Плюс ещё скроллинг карты, может меняться параметр translate.
Страаашно.
Есть какие-нибудь идеи, как победить?
Рэйтрейсинг или обратное преобразование координат, наверно. (не сварщик я)
Какой еще ретрейсинг в Love?
Обычная математика!
Тип как псевдо-3д рисовать.
Думай, напрягай извилины! Все решается обычной математикой.
Приделай в игре отладочную печать, выводи на экран положение курсора, положение камеры, масштаб камеры. Так тебе будет проще понять какая между этими вещами зависимость.
Может у тебя и конкретика есть?
http://clintbellanger.net/articles/isometric_math/
Попробуй глянуть "Projecting from Screen pixels back to Map position" на этой странице.
Обычная система координат, поделенная на клетки - слева. Вид справа - ближе к твоему.
Красная точка - точка где кликнули. Синяя - начало координат. Альфа - угол поворота системы координат
Поворот точки (ox,oy) на угол a:
В твоем случае угол поворота горизонтальных и вертикальных линий будет разный (у тебя же угол не 90 градусов).
Масштаб и скролл экрана пока отключи - для этого нужна отдельная функция перевода экранных координат в игровые (это отдельный вопрос). Просто рисуй в игре кружочек, куда по-твоему мнению кликнул игрок - и ты сам увидишь правильно ты сделал или нет.
Чуть по-позже нарисую тебе более понятный вариант.
Тебе надо определить - между какими 2-мя соседними синими и фиолетовыми линиями лежит точка.
Только на рисунке у оси X номера должны идти в обратном порядке (я перепутал).
Угол линий: +30 и -30 градусов.
Это можно сделать так, как я тебе описал в пред. комментарии, только в одном случае поворачиваешь точку клика на -30 градусов (в обратную сторону) и делишь координату Y точки на высоту клетки в твоей игре, а во втором случае - поворачиваешь на +30 градусов и делишь Y на ширину клетки.
Есть еще один вариант, но он лучше подходит для сложных форм и используется в AGS для масок геометрии и точек интереса.
Рисуешь текстуру своими изометрическими квадратами. Цвет квадрата определяет его координаты. R - координата клетки по оси X, G - по оси Y. При клике просто читаешь пиксель из картинки (картику нужно создать как ImageData, а не Image). По значениям R и G этого пикселя определяешь X, Y клетки, куда кликнул.
Теперь про экран => координаты мира. Тут все просто.
Если ты делаешь translate, потом scale, а потом рисуешь картинку, то:
Дальше по координатам клика в мире игры определяешь в какую клетку кликнул, то что я написал до этого.
Точку, куда кликнул, лучше рисовать кружочком прямо в игре чтобы ты сразу увидел - правильно ты сделал или нет. Также пиши на экране номер клетки по X и Y.
Я то думал чувак реально на патрон хочет... А он уже больше недели квадратиками балуется...
М-да... Понятно почему прошлые попытки провалились...
У меня такое же состояние)
Решил пилить игру на патреон, а вместо этого занялся вторичными фишками:
1) их прикольно пилить
2) но время тратится на мелочи и кончается мотивация
3) на главный контент уже не хватает творческой энергии, потому-что растратил на другое)
4) в конце я забросил, и начинаю делать другую игру, создавая новые фичи) зато мотивация снова высокая
ЗЫ Я вот уже третий проект начал и забросил, хоть и интегрировал старые фишки в новый проект, думаю пора прекращать так делать, и вначале стоит начинать с главного содержания игры, чтобы привлечь аудиторию.
Тебе надо задумывать игру таких размеров, чтобы в конце у тебя как раз кончилась энергия.
Лучше сделать маленькую игру. А уж будешь ты ее расширять или нет - зависит от оставшейся мотивации. Правда переделывать придется больше, чем если бы ты задумал это изначально.
Да ладно тебе, попытка - не пытка. У каждого свои возможности и мотивация.
Кто-то упорно иконки рисует полгода, а кто-то игру хочет сделать за 3 месяца.
По-моему прогресс на лицо.
Вот. Самую первую версию сделал на конкурс Игра за неделю.) Доделывал потом ещё примерно неделю.
Перенёс на новую версию конструктора ещё за две недели. Итого полностью готовая игра примерно за месяц. И лишь потому, что я знал, что хочу сделать, а главное знал как это сделать. Ибо на тот момент уже 2 года как изучал мукер.
https://gamin.me/games/uroki-tsunade
Я собственно про то, что нужно уметь рассчитывать свои силы и не гонятся за фантазиями(в очередной раз). А уж тем более ставить что-то там на кон. Это круто и весело, но, к сожалению, неэффективно. Хочешь просто поиграться в очередной раз, играйся на здоровье. Чё из этого шоу устраивать...
Как-то так.
День 9. (осталось 48 дней)
Победа!
Обратная связь между положением курсора и клеточками тайлов есть, это открывает дорогу как к перемещению персонажей, так и к довольно удобному способу нарисовать карту, кстати о_0
Я молодец!
А ввиду того, что вы мне активно помогали, молодцы ещё и вы.
День 10. (осталось 47 дней)
Пытался разобраться с записью в файл, чёт вообще не пашет.
Буду снова пытаться разобраться завтра.
function write(filename, contents)
local fh = assert(io.open(filename, "wb"))
fh:write(contents)
fh:flush()
fh:close()
end
write('Map.txt',131313)
Map.txt заранее создал, ошибки никакой не выдаёт (когда программа не могла найти файл - выдавала), просто в файл ничего не сохраняется.
Боже, да забей ты на эту белетристику, делай игру уже. Жестко пропиши карту уровня в игре двумерным массивом и все.
А чтение/запись лучше делать кодом в lua-файл. Его потом проще грузить и не надо ничего парсить.
Для работы с файлами в Love есть отдельный модуль: love.filesystem.
Квадратики? Это точно хентайная игра?
Там под этими квадратиками скрыто что-то интересное. Их надо подвигать особым образом.
Не только двигать, но и поглаживать, иногда посасывать и даже облизывать.
Да там походу пока хентай только у разработчика судя по тому с каким потом он рожает этот генератор/редактор карт =)
На заметку разери. Уже сейчас можно сделать кучу тайлов в виде частей тела и внутренних органов. Получится очень крутой данжен в почти гигерской тематике.
День 11. (осталось 46 дней)
Разобрался с чтением/записью и всё-таки сделал себе удобненький редактор, уииии =<^_____^>=
Ну что теперь можно Lewdest Labirint лепить
День 12. (осталось 45 дней)
Нарисовал карту, сделал несколько отметок для случайного старта, убедился что всё нормально загружается.
День 13. (осталось 44 дней)
Начал аккуратненько прорисовывать стеночки во всяких разных ситуациях.
Рисовать придётся много.
А ещё потом кодить их применение в разных ситуациях.
И мудохаться с правильными координатами кусочков.
Бли-ин, во что я ввязался? --_--
Если до этого был просто разработческий хентай, то сейчас будет разработческий хентай лолей-трапов с минотаврами.
Нахер тебе это сейчас? Просто ромбиками сделай.
И сразу контент, геймплей.
Сделай стены и двери в 2 раза ниже.
Не могу - специально подбирал, чтобы красиво с такими фигурками смотрелось.
ну тут можно на 20-25% хотя бы снизить размер стен
Тогда ты потом замудохаешься с правильной отрисовкой стен, чтобы они не загораживали собой персонажей.
Вообще изометрия - это хорошо только для художника, а для программиста - сплошной гемор. Поэтому я никогда не делал 2D-игры с изометрией (только с видом сверху или сбоку), мне лень ковыряться с тем чтобы все правильно отрисовывалось и декорации не загораживали персонажей и объекты.
хорошее предложение, а то в узких коридорах и рядом с ближними стенами многие вещи будут совсем теряться, например мелкие враги или лежащая вещь/кнопка
День 14. (осталось 43 дня)
Сегодня я... эмм... просто взял и проебал выходной впустую...?
Оу.
Упси-и-и ~♡
Зато здорово мангу удалось почитать.
Манги.
Несколько их.
Задолбал, сделай аляповатые стены хуже РПГ-мейкера, минимум геймплея и максимум хентая.
Согласен, лучшее - враг хорошего) перфекционизм (желание сразу сделать всё хорошо, часто заставляет оттягивать время и заниматься, чем угодно другим) в идеале нужно наоборот, вначале набросать, как попало задники и второстепенные элементы, и заниматься главными вещами: если это файтинг, то боёвкой, а если хентай, то картинками.
А если например в файтинге начать пилить задники с самого начала, оттягивая разработку боёвки, то это выглядит как минимум странно.
День 15. (осталось 42 дня)
Из всего разнообразия кусочков стен решил пока что сделать только куски, прилегающие к дверям (т.к. мне всё равно нужны двери в качестве объектов для взаимодействия и у них должна быть какая-то зона для выбора мышкой, а эта зона не должна заезжать на будущие стены слева/справа от двери).
Ещё я обнаружил, что с очерёдностью отрисовки тайлов и стен проблем не может быть в принципе, просто за счёт того, как именно направлены "оси" Х и У в таблице, описывающей устройство карты.
Достаточно просто начать проходиться по рядам.
День 16. (остался 41 день)
Просрал очень много времени на фигню, а затем спешно делал необходимые домашние дела.
Чуть порисовал чтобы хоть что-то сегодня поделалось.
День 17. (осталось 40 дней)
Дорисовал наброски дверей с вариантом при наведении (а также оставшиеся варианты стен рядом с дверьми), вспомнил про способ подгрузки множества изображений из одного файла-атласа, высчитал координаты смещения всей херни при отображении на экране и морально приготовился это всё уже потихонечку показывать прямо на карте.
День 18. (осталось 39 дней)
Сделал отображение штук на карте.
Дальше буду думать про выбор дверей мышкой.
Насчёт проверки по цвету помню, но в будущем, когда двери будут сильно цветными, такой способ всё равно не прокатит.
скорее всего маска столкновений это самое нормальное будет...
Можно хранить отдельно маску объекта и кликать на нее.
На экране, рисовать, конечно, надо уже спрайт объекта, а не его маску.
Та-а-ак... а в Löve ещё и получения цвета пикселя по координатам нету, да?
Библиотеки графические какие-то искать?
чтобы получить цвет пикселя, тебе надо imageData смотреть, то есть текстура должна быть в оперативной памяти, а не в видео. Если рисуешь всё в канвас, то надо делать вот это -https://love2d.org/wiki/Canvas:newImageData
но это времяёмко! Или просто сделать один раз это и не трогать более
Ну или если у тебя маска прям нарисована, то сделать из неё imageDate
Так?
если ты будешь это делать каждый кадр, то это немало ресурсов захавает у тебя. Вычислительных, в смысле. Гонять текстуру между оперативкой и видеопамятью - затратная операция.
Почему тебе не сделать для каждой двери (и других нажимательных объектов) свой коллайдер и не проверять попадает ли координата мыши в один из коллайдеров?
Не, я имел в виду, что тот самый канвас можно один раз сделать, а потом к нему обращаться.
Двери ж местоположение менять не будут.
Да?
А каков принцип работы коллайдеров?
Ну в принципе можно, но как ты будешь двери различать? Каждой двери - свой цвет? не знаю, сомнительно
Ну какой сделаешь) Я не знаю как ты данные хранишь, но если у тебя двери - это типа объекты, то можно для каждой двери сделать четырехугольник (или любую другую фигуру). И когда ты жмешь мышью, то программа ищет - попала ли мышь в какой-то коллайдер, и если да, то возвращает ссылку на объект, к которому этот коллайдер прикреплен.
Короче просто находишь - лежит ли курсор внутри одного из четырехугольников (или любой другой фигуры), и если да, то потом делаешь, что надо.
Термин "коллайдер" я просто в вульгарном смысле использовал - некоторая форма, для которой можно проверить столкновение с чем-то. В твоем случае - столкновение с точкой, куда указывает курсор
В твоем случае правильнее и экономичнее сделать обычной математикой.
Каждая дверь - это трапеция. Проверяй - попадает ли точка, куда кликнули, в трапецию. Тебе же не надо чтобы игрок точно по пикселям двери попал?
С каких пор параллелограмм это трапеция?
Маст перепутал, но вообще говоря, так удобней в разы. Да, появляется гемор с понятием равнобокой трапеции, зато всё остальные свойства автоматически переносятся с трапеции на параллелограмм. Программисту довольно логично так на вещи смотреть: если есть алгоритм для трапеций, он прокатит и для параллелограммов тоже.
Какой-то странный метод рассуждения, будто алгоритм для трапеций есть, а для параллелограммов нету, и нам нужно строить всё вокруг него. Можно вообще просто обобщить параллелограмм до 4-угольника и проверять захождение точки за 4 его линии, по типу: если точка находится справа от левой линии, слева от правой, ниже верхней и выше нижней, значит она внутри.
А можно разбить этот обобщённый 4-угольник на два треугольника и проверять входит ли точка в какой-либо из них. Под вхождение в треугольник я встречал функции практически везде, т. к. треугольник это вездесущий полигон, из которых строятся как 3D-модели, так и 2D-канвасы (справка по Love2D мне напомнила что они называются "квады", но я с удивлением обнаружил что они уже устарели в его архитектуре).
https://love2d.org/wiki/love.math.triangulate - даже нашёл функцию разбивающую любой N-угольник на треугольники. А трапеция, как и параллелограмм, это какие-то частные случаи для учащихся средней школы, под которые ничего в движках не пишется.
Ок, кажется понял, почему моя мысль непонятна. Давай немного с другой стороны зайду.
Вот простой пример - подсчёт площади многоугольника. Логика простая - собираем фигуру из трапеций и считаем сумму их площадей, сокращая заранее одинаковые слагаемые в выражении. Естественно, под трапециями в таком контексте подразумеваются любые четырёхугольники с двумя параллельными сторонами, а не четырёхугольники с двумя параллельными и двумя не параллельными. Более того, тут ещё и площадь со знаком, так что "школьное" определение трапеции только мешает пониманию сути происходящего.
???
Ок, рассказываю пруф подробно, раз на вики его нет:
Есть многоугольник с вершинами в точках Ai = (Xi,Yi). Из каждой вершины опускаем перпендикуляр на ось Ox (проекцию точки Ai назовём Bi). Считаем сумму площадей со знаком для "трапеций" A1A2B2B1, A2A3B3B2 ... AnA1B1Bn. Площади со знаком - это как обычные площади, но мы к ним навешиваем отрицательный знак в зависимости от того, по часовой или против часовой мы обходим область внутри фигуры. Их сумма как раз даст площадь фигуры (удобно представлять так - фигуры, границы которых мы обходим против часовой стрелки, вырезаются из суммы фигур, которые мы обходим по часовой).
Так вот, формула площади трапеции сразу выдаёт площади с тем знаком, который нам нужен, если высота и длины оснований тоже берутся со знаком в зависимости от их направления (в нашем случае длины сторон - это просто y-координаты точек, а высота - разность х-координат). То есть их площади равны (X2-X1)(Y1+Y2)/2, (X3-X2)(Y2+Y3)/2, и тд. Если раскрыть скобки и просуммировать получится 1/2 * (X2Y1 - X1Y2 + X3Y2 - X2Y3 + ... + X1Yn - XnY1) - как раз та формула, на которую была ссылка.
Моё недоумение относилось именно к термину "трапеция" - на той странице Википедии нет ни одного упоминания о таковой, а в иерархии четырёхугольников ей отведено вполне конкретное место. У Разери в игре - ромбы и параллелограммы.
Ну, пруф понятен, спасибо за его приведение.
Я только не понял в чём преимущество именно этого метода перед триангуляризацией для, в конце концов, проверки вхождения точки в N-угольник (что собственно и нужно Разери в его игре, только там у него треугольника всего два и решается всё элементарно).
К проверке вхождения эта история не имела отношения. Проверку вхождения точки в многоугольник проще всего делать, пустив луч влево и посчитав число пересечений с границей фигуры. Если чётное - точка снаружи, если нечётное - точка внутри. Ну и не забыть, что если какие-то вершины многоугольника попали ровно на луч, то надо либо разобрать пару частных случаев, либо заранее немного подвинуть саму точку.
Что-то мне подсказывает, что двери в игре Разери будут обычными параллелограммами, всегда.
С чьей стороны проще? Я говорил о триангуляризации, это будет что-то вроде:
Для первого пункта надо вызвать уже приведенную мной выше функцию https://love2d.org/wiki/love.math.triangulate
Для второго - https://love2d.org/wiki/PointWithinShape
То есть, это в прямом смысле три вызова. А сколько вызовов понадобится на этом движке для "пускания луча влево"?
Кроме того, почему влево?
Зачем триангулировать-то? Сразу использовать готовую проверку тогда уж. Как раз та, на которую ты ссылку привёл - CrossingsMultiplyTest, - проверяет что точка лежит внутри многоугольника (если я правильно понял их документацию, то это одна из модификаций метода, что я описывал).
Тем более.
А, ну да, паралле-как-там его.
День 19. (осталось 38 дней)
Разбирался с хранением графической информации в оперативной памяти (канвасами), хочу натолкать туда маски дверей, чтобы по ним уже определять пересечение курсора с силуэтом той или иной двери.
Точно норм идея?
Точно не норм. Тебе в итоге на каждую дверь свой цвет нужен будет примерно.
Сделай просто коллайдер в форме многоугольника для каждой двери, и по клику мыши проверяй - попала ли она в какую-то дверь
Канвас в видеопамяти, к слову)
День 20. (осталось 37 дней)
Сегодня отдыхал.
Надеюсь, что завтра отдыхать уже не буду.
А когда будет кодинг на полном серьезе?
День 21. (осталось 36 дней)
Сделал проверку на выбор двери, в том числе и в сложных случаях.
Выглядит скромно, но я потратил на это ~7 часов, а моя жопа от некоторых моментов горела просто как Дрезден после бомбардировки союзников.
Похвалите меня.
Raseri, чем обоснован выбор движка?
Теперь, узнав, насколько мало функций в нём предоставлено из коробки, могу сказать - невезением.
Godot с подобными тайлами лучше дружит, хотя много не тестировал, может там есть подводные камни.
похвалю так-же и "своё" болото game maker хотя без подводных камней в нем тоже никак...
Вы так говорите как будто где-то этих камней нет. Вопрос в том сколько их и как их преодолевать =) По сравнению с большинством движков в гамаке этих камней не очень много.
зато они особенно больно тыкают ХД
Не понял кстати про взнос в размере 10К рублей. Это типа ты сам с собой поспорил и теперь трясёшься от азарта перекладывая бабосы из кармана в карман? Кому 10К уйдёт в случае "обосрамса", как ты выражаешься?
Явно не указывал, но думаю, что по принципу прошлого челленджа:
День 22. (осталось 35 дней)
Сегодня игрался со шрифтами.
День 23. (осталось 34 дня)
меньше надо на стримы залипать х)
а мог бы сам стримить (я про raseri)
да даже если и про меня! (тоже мог бы -_-)
Story of my life. Все улучшения, которые я ввел в свою игру момента выпуска ее конкурсной версии, при отсутствии прокрастинации можно было бы сделать за недельку.
тоже самое)