Войти
ПрограммированиеФорумОбщее

SDL2 и Android : нормально работает со 2-го раза и висит в памяти (2 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#15
7:47, 7 янв. 2021

Vitorio
> В манифесте no title bar прописать.

Помогло,  спасибо.

Vitorio
> Для скрытия софотовых кнопок операционки (back, home и т.д) курить immersive mode.

Оставил их. Иначе придётся делать дополнительную кнопку выхода.


#16
8:34, 7 янв. 2021

Gradius
> Оставил их. Иначе придётся делать дополнительную кнопку выхода.
они не полностью убираются, слайдом можно достать
Gradius
> Как залицензировать?
создаешь ключ в keytool, подписываешь apk/aab этим ключом (не забудь логи иначе не восстановишь). Идешь в маркет, новый проект, закидываешь свою приложуху и ждешь пару дней. потом можешь скачивать из оф источников подписанное приложение. (там не обязательно сразу релизить)
Gradius
> Сенсорное управление в платформерах-экшенах, где требуется быстрая реакция - не
> лучшее.
Просто у тебя не лучшая механика, почему не классические joysticks?
Gradius
> Очень медленная работа на чтение файлов из assets.
Используй параллельный поток и экран загрузки

#17
(Правка: 13:54) 13:50, 7 янв. 2021

Переделал "кнопки" для сенсорного управления. Надеюсь, что дизайн кнопок более не придётся менять.
Кнопки сделал наподобие как тут (скачал APK и посмотрел PNG в нём):

screen-1 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Сделал масштабирование кнопок - вычисляется свободная область по ширине как разница ширины дисплея и ширины кадра игры (800 пискселей, кадр увеличен в 2 раза по каждой оси).  Полученная разница делится пополам.  Слева и справа рисуются кнопки с учётом масштабирования.  Прямоугольный регион каждой кнопки также вычисляется в зависимости от размеров дисплея.  Проверил - всё работает.  Дополнительно сделал подсветку кнопки при касании. Площадь кнопок увеличена, надписи на кнопках очень лаконичные,  размер шрифта увеличил.  Сделано сглаживание при масштабировании кнопок (билинейная фильтрация - поддерживается OpenGL).

Дополнительно задействовал SaI2x фильтр для игры:  он включается при нажатии кнопки Super  в меню выбора персонажа. Выключается - кнопкой Fire там же.

Также сделал показ FPS.

result | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

В идеале конечно хочу убрать андроидную белую полоску справа.  Тогда размер управляющих кнопок станет ещё больше.  У телефона 1520x720, для него кнопки станут во всю высоту его дисплея.


Gmassta
> Используй параллельный поток и экран загрузки

В игре всего 1 файл - это бандл с данными, который представляет свою файловую систему с зашифрованными пожатыми данными.  Работа с ним идёт через SDL-ные функции SDL_RWOps.

А вот прикрутить надпись Loading... скорее всего придётся.


Gmassta
> создаешь ключ в keytool, подписываешь apk/aab этим ключом (не забудь логи иначе
> не восстановишь). Идешь в маркет, новый проект, закидываешь свою приложуху и
> ждешь пару дней. потом можешь скачивать из оф источников подписанное
> приложение. (там не обязательно сразу релизить)

Займусь этим как только вышлифую приложение до конца.
Нужно сменить назание приложения, поменять иконки и по мелочам пройтись...

#18
(Правка: 8 янв. 2021, 5:14) 16:10, 7 янв. 2021

Vitorio
> Для скрытия софотовых кнопок операционки (back, home и т.д) курить immersive
> mode.

Сделал как написано здесь: https://discourse.libsdl.org/t/sdl2-code-change-to-make-android-r… lscreen/26868

Софтовые кнопки действительно исчезли, но в освободившемся пространстве ничего не нарисовалось, так как SDL по-прежнему возвращает ширину(точнее высоту) дисплея меньше - с учётом полоски.  Мало того, прямоугольные области нажатия кнопок съехали вправо на величину ширины полоски софтовых кнопок.

1 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Попробовал захардкодить размеры дисплея константами, в итоге всё нарисовалось на весь экран, но с углов срезалось, так как телефон имеет закруглённый по краям дисплей. И прямоугольные регионы на касание кнопок тоже съехали.    Значит,  ведроид не корректирует X и Y коррдинаты каcания тача с учётом полоски.

#19
(Правка: 21:19) 21:19, 7 янв. 2021

Gradius
> Сделал как написано здесь: https://discourse.li… lscreen/26868
>
> Софтовые кнопки действительно исчезли, но в освободившемся пространстве ничего
> не нарисовалось, так как SDL по-прежнему возвращает ширину(точнее высоту)
> дисплея меньше - с учётом полоски. 
В примере по ссылке в каком то switch case включают immersive fullscreen. Сделай включение в методе onCreate в активити.

#20
(Правка: 5:14) 5:10, 8 янв. 2021

Vitorio
> В примере по ссылке в каком то switch case включают immersive fullscreen.
> Сделай включение в методе onCreate в активити.

В примере по ссылке иммерсивный фулскрин у меня заработал, как я ранее писал - панель исчезла.

В случае если код перенести в onCreate, ничего не меняется - панель присутствует.  Вставил код, отвечающий за immersive fullscreen в самое начало кода метода onCreate.

Сделал замеры длины и высоты экрана 4-мя разными функциями SDL - до создания окна и после.

В эмуляторе все 4 возвращают правильное значение ширины и высоты: 720x1520

На реальном телефоне все 4 возвращают урезанную ширину:  1369 вместо 1520.  В обоих случаях: когда панель есть и когда её нет (immersive screen).

Вывод - SDL2 тупо не видит прироста в ширине дисплея в режиме immesrive screen и считает её без учёта свободного места :

итого имеем: 1369 пикселов вместо 1520.

Слева мешает - очко камеры - оно в центре вырезает часть пикселей. И по периметру скруглённые края.  Если мысленно обрезать это всё, то как раз выходит что эффективная ширина дисплея как раз 1369.  А по периметру - колбасные обрезки - достаются ведроиду.

151751_1610025153_1 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Что делать?
Забить или добиваться всёже TRUE-Full-Screen ?

#21
(Правка: 16:38) 16:27, 8 янв. 2021

Итак, всё удалось решить благодаря переходу на SDL 2.0.9.  Изначально в проекте была версия 2.0.8

Внимательно раскурил docs/README-android.md и рискнул создать свой проект с нуля. Сделал всё по рекомендации этого ридми.  Удалось сбилдить и запустить SDL-ную болванку на эмуле и реальном телефоне.

Правда пришлось переключиться с 21-го на 16-й NDK. Иначе не собирает (полагаю, надо поправить минимальную версию в мейках или конфигах).

Пришлось также включить поддержку STL, иначе при линковке будет ругаться на std:vector, а при компиляции не сможет найти хедеры <limits>, <random>

Что сразу  бросилось в глаза:

Full-scren "искаропки". Никаких манифестов и активити править вообще не пришлось! Всё заработало сразу!

Далее подцепил SDL_image (для отображения шаблонов кнопок) и SDL_mixer (для музыки и звуков). Версии обоих библиотек последние.

Далее подцепил остальные либы для игры и её исходники.  Прописал инклуды.  Сбилдил.
Игра успешно запустилась.

В качестве ширины экрана я вначале брал:  SDL_GetDesktopDisplayMode перед созданием окна или SDL_GetCurrentDisplayMode после создания окна.  В обоих случаях ширина дисплея была 1520 пикселей, что верно!  Наконец-то они с 2.0.9-й версии сделали как надо!

Но так как дисплей телефона закруглён по краям - получилось не очень - правые кнопки срезались:

1 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Поэтому было принято решение проверить что вернёт функция: SDL_GetRendererOutputSize.  Как оказалось, она вернула меньшее значение ширины: 1465 пикселей.  Как раз за вычетом скруглений.

Получились кнопки с оптимальным размером и без отсечения:

2 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

В обоих случаях - кнопки обрабатываются корректно и регион касания не съезжает, как это было в SDL 2.0.8

И что самое приятное:

Поддерживаются "перекатушки" между кнопками! - это когда одним пальцем можно одновременно или по очереди зажимать несколько кнопок !

В предыдущей версии SDL кнопки жались одновременно, только если было несколько ТОЧЕЧНЫХ нажатий - без касания пространства между кнопками.

Таким образом, на фотке - левый JUMP можно выкинуть, на освободившееся место увеличить крестовину.
А справа FIRE и SUPER расположить один под другим,  а правый JUMP удлинить по высоте на общую высоту FIRE+SUPER.

Получится, что мы можем идти (крестовина слева) + стрелять (FIRE или SUPER fire) + прыгать (JUMP)
Палец левой руки - крестовина
Палец прваой руки (FIRE или SUPER) + JUMP

Прям идилия :)

Ну и из плюсов SDL 2.0.9 - софтовые кнопки если их выдвинуть жестом справа-налево - поверх SDL-ного окна полупрозрачные :)

Ну и в заключение:

Тут хоть и хают SDL, считая, что он сделан на отъ**ись, но я скажу так - SDL делали боги :))) Очень мощный процедурно-ориентированный "фреймворк" для переноса программ, написанных на C/C++ куда угодно : WEB, Android,...

#22
6:04, 9 янв. 2021

Gradius
> Иначе не собирает (полагаю, надо поправить минимальную версию в мейках или
> конфигах).

Да и сделать это надо до первого билда иначе там потом чистить-не-перечистить. build.gradle насколько сейчас помню.
Есть еще такая боль, что debug сертификат истекает через месяц или типа того и произойти может какая то херня что установка приложения будет отвергаться пока еще установлена старая версия с истёкшим сертификатом. Лечится имеено сперва удалением устаревшего.
Андроид это реально боль. Жаль тему раньше  не увидел, по многим пунктам дал бы сразу ответы.
Например чтобы приложение при выходе на андроиде правильно закрывалось, а не сыпало потом ошибками main у меня заканчивается так:

#ifdef __ANDROID__
  exit( appDone() );
#else
  return appDone();
#endif
appDone() закрывает ресурсы и суть её тут неважно - главное что в андроиде почему то надо явно прибивать основной поток иначе ява-часть не понимает что пора выходить.

#23
6:10, 9 янв. 2021

Gradius
> Вывод - SDL2 тупо не видит прироста в ширине дисплея в режиме immesrive screen
> и считает её без учёта свободного места :

Это был глюк в 2.0.8. В ява-части конкретный косяк был когда неправильная функция использовалась. К слову можно было просто найти это место и исправить. В 2.0.9 надо сказать ява-часть знатно перепахали. Процентов на 60 наверное. По крайней мере в Activity.

#24
6:22, 9 янв. 2021

Gradius
> Первый запуск с инсталлятора - работает неправильно. См. проблему в пункте 2).
Это тоже хохма - запуск с инсталлятора запускает Activity в режиме когда оно не понимает что уже запущено и его можно открывать много-много раз тапая теперь по иконке рабочего стола. Ломается какой то флаг что приложение уже запущено и надо не запускать его снова и снова, а просто вернуть ему фокус.
Поэтому к запуску из инсталлятора надо вообще относится весьма подозрительно.

#25
15:08, 9 янв. 2021

=A=L=X=
> Да и сделать это надо до первого билда иначе там потом чистить-не-перечистить.
> build.gradle насколько сейчас помню.

Я делаю чистую резервную копию для таких случаев.
По поводу чистки, в Gradle есть ключи чистки кеша и обновления зависимостей.

Ну и мне NDK версии r15c  хватает, зато совместимость с мамонтами присутствует :)

=A=L=X=
> Есть еще такая боль, что debug сертификат истекает через месяц или типа того и
> произойти может какая то херня что установка приложения будет отвергаться пока
> еще установлена старая версия с истёкшим сертификатом. Лечится имеено сперва
> удалением устаревшего.

Пока с этим не сталкивался. Если что, релизы подписываю своими ключами, там хоть 10 000 суток можно поставить.

=A=L=X=
> exit( appDone() );

Что такое appDone() ? Откуда его брать ?
Я оставил как есть, приложение можно закрыть сдвинув его пальцем влево.

Приложение сохраняет контекст , если его свернуть, затем обратно развернуть. Только для этого в цикле нужно делать SDL_PollEvents (или как там её...).  Если этого не делать, то контекст не восстановится - будет черный экран.

=A=L=X=
> Это был глюк в 2.0.8. В ява-части конкретный косяк был когда неправильная
> функция использовалась. К слову можно было просто найти это место и исправить.
> В 2.0.9 надо сказать ява-часть знатно перепахали. Процентов на 60 наверное. По
> крайней мере в Activity.

Да, заметил, когда перезаписывал app на более новую.

Ради прикола скачал последнюю версию SDL 2.0.14 и собрал с ней.  В итоге снова ширину кадра в full-screen неверно поставил и что самое интересное - тачпад перестал работать :)  Вернулся на 2.0.9.  В принципе, мне бОльшего и не надо.

=A=L=X=
> Gradius
> > Первый запуск с инсталлятора - работает неправильно. См. проблему в пункте
> > 2).
> Это тоже хохма - запуск с инсталлятора запускает Activity в режиме когда оно не
> понимает что уже запущено и его можно открывать много-много раз тапая теперь по
> иконке рабочего стола

Это из-за программы в первом посте в 1-м спойлере.  Во 2-м спойлере программа работает исправно.

С сенсорным управлением есть небольшая проблема. Есть 2 прямоугольные "кнопки", расположенные рядом, как на рисунке:

but | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Они нажимаются обе, если тыкать на них разными пальцами.  Но если попытаться нажать их одним пальцем, то нажимается либо кнопка А, либо кнопка В.  Причем активна всегда та кнопка, которую палец нажал последней.

Проверил события: FINGERDOWN происходит при первом тыке кнопки,
FINGERUP при отпускании последней кнопки.
FINGERMOVE - как раз при перекатывании пальца с кнопки А на кнопку В.

Также пробовал через SDL_GetTouch получить все нажатые точки.

Но добиться, чтобы одним пальцем нажать сразу 2 кноки рядом - не вышло.  Если только не сгибать сам палец и не нажимать кнопки разными его участками.

Возможно ли сделать такое?  (чтобы 1 палец зажимал сразу 2 кнопки без промежутка между ним?)

#26
16:41, 9 янв. 2021

Gradius
> Что такое appDone() ? Откуда его брать ?

Ну я же там написал что просто 0 если всё ок и не ноль если нужно как в return result вернуть что то. Т.е. неважно - относись как константе 0.
Чтобы соответствовало концепции полной проссплатформы.
Просто в SDL 2.0.8 был какой то глюк если в не закрыть приложение насильно вызвав exit, то ява-оболочка не понимало что сишное ядро закрыто и надо и самому закрываться.

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

И вот так и получается, что SDL чтобы вплестись во всю эту хреноверть прежде все в версии для Android содержит тонну кишков на ява-классов и всех этих gradle.build чтобы вплестись.
Но реально там куча кода в папке java которая служит перемычкой. И просто ОГРОМНОЙ.
Пару багов в репозитарий им отправлял и это был мой первый опыт опенсорца когда ты исправляешь баги в коде первее чем владелец. И мне понравилось.
Прикольно. Я еще в версии 2.0.8. поправил их глюк в ява-части. И всё работало.

#27
(Правка: 16:48) 16:46, 9 янв. 2021

Gradius
> о добиться, чтобы одним пальцем нажать сразу 2 кноки рядом - не вышло. Если
> только не сгибать сам палец и не нажимать кнопки разными его участками.

У меня никогда такой цели не было, так что я не делал такое и не знаю.
Но мультитач всегда помню что был в интерфейсе SDL 2.x.
Я от SDL 2.0 на практике получаю и показания акселерометров, и кнопки от геймпада подключенного по вифи и имитацию нажатий мышки windows как тапание по экрану смартфона и плохо понимаю почему не приходит просто два сообщения быстро.
Возможно сообщения же приходят, надо просто чтобы код паузы отслеживал?

#28
17:23, 9 янв. 2021

Gradius
> Возможно ли сделать такое?  (чтобы 1 палец зажимал сразу 2 кнопки без
> промежутка между ним?)
Точка касания одна. Ширина и высота ее - один физический пиксель. Поэтому надо делать свой класс кнопки, эмулирующий тап нужного диаметра и обрабатывать его в классе кнопки

#29
5:44, 10 янв. 2021

=A=L=X=
> Gradius
> > Что такое appDone() ? Откуда его брать ?
>
> Ну я же там написал что просто 0 если всё ок и не ноль если нужно как в return
> result вернуть что то. Т.е. неважно - относись как константе 0.
> Чтобы соответствовало концепции полной проссплатформы.
> Просто в SDL 2.0.8 был какой то глюк если в не закрыть приложение насильно
> вызвав exit, то ява-оболочка не понимало что сишное ядро закрыто и надо и
> самому закрываться.

Я об этом exit() уже писал ранее в самом первом посте темы:  https://gamedev.ru/code/forum/?id=257614&m=5315063#m0 

В интернете нашёл упоминание, что перед return 0 надо делать exit()

Попробовал ещё раз. Корректного закрытия не вышло. Вышло системное окошко с предложением отправить отчёт об ошибке разработчикам  "Миу-Миу"... 

Ну и фиг с ним.  Вариант закрытия пальцем влево меня вполне устраивает.  Тем более, я не видел ни одного приложения на этом телефоне, чтобы сами могла закрываться и не висеть в памяти.

Vitorio
> Точка касания одна. Ширина и высота ее - один физический пиксель. Поэтому надо
> делать свой класс кнопки, эмулирующий тап нужного диаметра и обрабатывать его в
> классе кнопки

=A=L=X=
> Я от SDL 2.0 на практике получаю и показания акселерометров, и кнопки от
> геймпада подключенного по вифи и имитацию нажатий мышки windows как тапание по
> экрану смартфона и плохо понимаю почему не приходит просто два сообщения
> быстро.
> Возможно сообщения же приходят, надо просто чтобы код паузы отслеживал?

Решение найдено.
Средствами SDL + реализация правильного конечного автомата на одновременное нажатие нескольких кнопок в любом порядке.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее