Обсуждаем игру HugeSpace 2 на людуме и направление развития.
У кого-нибудь есть рабочий код чтобы рисовать текстурированные круги в love2D? Я так понял, надо использовать stencil, вот только не пойму как с ним работать. Вроде бы надо сначала рисовать круг в stencil function, а потом — текстуру. Но почему-то не работает.
Кто уже делал такое — помогите сделать такую функцию в игре на людум.
- 23 апреля 2017, 19:55
- 03
Спасибо, самое то. Оказалось все не так просто:
1) Надо использовать отдельную картинку под каждую текстуру, а размер quad'а надо ставить больше размера изображения, а не наоборот. Я же пробовал разместить все текстурки в одном файле.
2) Координаты рисования кружочка и текстуры должны совпадать. При этом кружочек рисуется от центра, а картинка - от левого верхнего угла. Я же полагал что функция myStencilFunction будет считать координаты относительно координат картинки.
Короче, в пост-конкурсной версии сделаю текстурированные планеты.
Что с квадами не так?
Love архив
Это если круг меньше размера квада. А если больше, то квад надо повторять, как в тайлах:
А для этого размер квада должен быть больше размера картинки:
здесь 256 - размер квада, 32 - размер картинки.
Понял. Но ты же можешь нарезать файл с текстурами частями и уже эти части с повтором выводить? (пока нет возможности самому сделать)
Да, точно. Что-то я не догадался.
Правда это лишние drawcall'ы сожрет.
Думаешь, так критично? :)
После 200-300 вызовов уже да (пиксели звезд, планеты, метеориты) - на слабеньких ноутбуках начнет тормозить. Можно рисовать статичные объекты 1 раз в канвас и потом рисовать уже его. Но это в Windows-сборке. Последний раз когда пробовал сделать веб-сборку - канвасы в ней не работали.
Но я имел в виду нарезать файл при загрузке игры в объекты, которые потом использовать. То есть один раз за запуск игры.
Если уже речь про оптимизацию, то все круги можно рисовать в функции стенсила за один раз, а далее уже квады. Тогда стенсил будет вызываться один раз. (Это в голове, на деле может что не предусмотрел)
Нет, тогда может получиться что когда будешь рисовать квад, он наложится еще и на соседний кружочек. Надо рисовать кружочек, квад, кружочек, квад и т. д. Чтобы квад гарантированно рисовался только в один текущий кружочек.
Не зря столько лет делали инструментарий для создания игр. Такие-то технологии. Народ, делайте игры на Лаве.
Дальнейшие размышления. Если ты нарежешь при загрузке файл то тебе и квады не нужны будут.
UPD: Прочёл ещё раз твой коммент, увидел, что ты об этом писал.
Попробовал оптимизацию (предварительное рисование статичных объектов в канвас 1 раз и потом уже рисование только канваса).
До: 341 fps, ОЗУ: 50 Мб, ЦП: 11%
После: 506 fps, ОЗУ: 53 Мб, ЦП: 2%
За счет постоянного изменения координат объектов при рисовании без канваса наблюдается небольшая дрожь границ планет из-за округления координат. С вкл. канвасами такого нет, поскольку координаты рисования канвасов не меняются.
немножко текстурированные планеты
Я могу гордиться, что был на одном сайте с таким-то геймдевелопером.
Я всматривался сколько мог, но где текстуры, Карл?
Поэтому и немножко текстурированные. Если рисовать прям рельеф или атмосферу, то это уже от атмосферы/температуры зависит, такого пока в игре нет.
Взорвать планету!
еще немножко более текстурированные планеты и метеориты
А ты рисуешь круги из секторов или как? Или это просто квадрат с отрезанными углами?
Эээ, планеты? В Love2D круги - это полигоны с N-ым кол-вом граней. Дальше я их заливаю цветом или текстурой. Кружочки, к-е надо собирать, - не заливаю.
А текстура включает в себя углы, которые не попадают в круг, или нет?
Круг работает как маска для текстуры.
А, всего-то. Я думал, рисуешь квадрат, а оно его вплющивает в круг, чтоб не осталось за кадром ничего.