LINUX.ORG.RU

14
Всего сообщений: 93

SDL12-compat

Отправился искать оригинальный твит из данной темы, и случайно, через цепочку ссылок нашел вот такое:

Project: sdl12-compat
Кратко для Ъ: Ryan C. Gordon, известный разработчик портов игр под линукс, написал обертку вокруг SDL2, которая предоставляет ABI, совместимый с SDL 1.2.
Он позволяет запускать старые (в основном - проприетарные) игры, без установки в систему устаревшей и более не поддерживаемой SDL 1.2. Потенциально могут работать не только игры, но проект все еще в стадии вялотекущей разработки.

Киллер-фичи:


  • Игры больше не захватывают ввод монопольно, ALT+TAB нормально работает
  • Для полноэкранного режима используется SDL_WINDOW_FULLSCREEN_DESKTOP, с масштабированием на GPU если это надо. Игры больше не будут ломать вашу многомониторную конфигурацию!
  • Приложения, использовавшие программный вывод 2d-графики средствами SDL, теперь прозрачно используют GPU-ускорение
  • Поддержка Wayland, без необходимости изменять что-либо в самой программе



Видео-демонстрация: https://www.youtube.com/watch?v=3uVmUCuJpF4

Исходники тут: https://hg.libsdl.org/sdl12-compat

Код еще достаточно сырой, и в нем полно заглушек, но многие игры работают уже сейчас. Для корректной работы требуется SDL2 2.0.9

Пакеты для openSUSE и Fedora: http://download.opensuse.org/repositories/home:/khnazile:/libSDL12-compat/ (собрал как мог, лучше собирайте сами)

cast ZenitharChampion

 , , , ,

Khnazile ()

Как хандлить ввод по уму

Мне не нравится что одни события нужно обрабатывать внутри SDL_PoolEvent() например SDL_MOUSEWHEEL, а другие можно после обновления пула узнать через SDL_MouseState(),SDL_KeyboarState() Но в цикле пула например мышку мы не можем обрабатывать как нажатую постоянно если нет иных эвентов, но можем вне цикла узнавая через State. Как то оно некрасиво, сначала попытался налабать обёрток что бы избавится от цикла эвентов забирая последние события, но тогда происходят скачки если была большая очередь событий, затем я попробовал вообще всё впихнуть в цикл пула, но тогда приходится спавнить треды что бы продолжать обрабатывать мышку если она нажата, но затёр этот ад по итогу.

Вот типичная ситуация из Corange

Свободная камера должна быть вне эвент цикла иначе не реализовать плавное движение https://github.com/orangeduck/Corange/blob/master/src/entities/camera.c#L77 Орбитальная же камера должна находится в евент цикле для корректной работы https://github.com/orangeduck/Corange/blob/master/src/entities/camera.c#L44

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

 , , , ,

Deleted ()

IO-либа для Андроид-порта OpenGL C++ приложения? Тьюториал для SDL?

Привет всем!

Написал десктопный OpenGL прототипчик своего аппа, с glfw (спасибо goto-vlad за наводку на толковый тьюториал, learnopengl.com). Хочется сразу попробовать сделать Андроид-порт. Не пойму какую лучше использовать IO-либу, аналог glfw.

SDL похоже устарела. Почти все тьюториалы что видел — либо старая SDL (<2), либо старый OpenGL (<3.3), включая 3 офиц. тьюториала SDL (twinklebear.github.io, SDLTutorials.com, lazyfoo.net), и тьюториал хроноса. Видел где и SDL2 и современный OpenGL, но не устроило то что видел... (примитивно: скорее блог-посты, а не тьюториалы).

Или я зря боюсь, и SDL не устарела? И можно не обращать внимания на древнюю OpenGL в примерах?

Qt большая какая-то вроде (у меня крохотный аппик).

Если IO-либа без гуи (циферки-кнопочки-слайдбары), то какую гуи-либу посоветуете?

Я совсем нуб, подскажите пожалуйста. Спасибо.

 , ,

the1 ()

SDL переписывают

https://mastodon.gamedev.place/interact/100839164925937859

Ryan C. Gordon @icculus@mastodon.gamedev.place

Been rewriting SDL's 2D render API to be faster (and my god, it's _faster_), but this is taking _forever_.

I redesigned it so the high-level interface can batch up draws and do them all at once--presumably all stuffed into a big vertex buffer--but it's taken like a month to convert all the backends (D3D9, D3D11, GL, GLES1, GLES2, software, and ...PlayStation Portable homebrew for crying out loud).

Almost done now, finally!

 

missxu ()

Маргинальные ОС и браузеры под framebuffer (SDL)

В последнее время стал более задумываться о сетевой безопасности, и использовании более маргинальных систем, недоступных взлому через какие-либо популярные бекдоры и надежных в плане слива личных телеметрических данных. У меня на ноуте и компе установлен Arch Linux с шифрованием диска, использую openvpn на внешний vps. Но мне и этого кажется мало. Собираюсь перейти на использование более нетрадиционных ОС, в том числе и железа. Из ОС мне сейчас наиболее интересны OpenBSD и DragonflyBSD, думаю использовать в дуалбуте для различных задач, в одной совершать банковские операции, другая - для серфинга и работы. Arch Linux - для пользования более новыми версиями эмуляторов спектрума, амиги, (например unreal speccy и winuae под последний wine), и просто полной совместимости с железом - видеокамеры там и т.д. Также привлекает использование Haiku для серфинга (она уже боле-менее пригодна для этого). И как еще один вариант - установка системы Morphos на mac mini power pc. Из браузеров пока наиболее безопасными для слива телеметрических данных вариантами видятся Falkon, Gnome Web, Midori, Qutebrowser, Netsurf, Otter, Surf от Suckless. В дальнейшем хочется уйти от использования Xorg и перейти к использованию браузеров, работающих под SDL/framebuffer. Пока что кроме Netsurf ничего обнаружить не удалось, и то он не собирается в arch из yaourt. Вопрос к минималистам - что можете посоветовать на данный момент из оконных менеджеров и браузеров, работающих под SDL через framebuffer, и DirectFB (к сожалению проект заброшен) ?

 , ,

myx ()

SDL2_image ошибка сборки

ЛОР помоги пытаюсь собрать проект с SDL2_image получаю сообщение об ошибке:

g++ -o test main.cpp src/Game.cpp `pkg-config --cflags --libs sdl2` -lsdl2_image
/usr/bin/ld: cannot find -lsdl2_image
collect2: error: ld returned 1 exit status

сам пакет libsdl2-image-dev установлен

Вобще я хотел собрать используя cmake там сообщение об ошибке не получаю, но возникала другая проблема.

когда использую SDL_LoadBMP(«1.bmp») все работает нормально, а IMG_Load(«1.png») возвращает NULL словно не находит изображение по адресу хотя лежат они в одном каталоге.

попытка ручной компиляции вызвала первую ошибку, помогите собрать, хоятябы вручную, ну а если подскажите в чем недуг cmake вообще отлично

собственно кусок CmakeLists

include(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED  SDL2_image)

include_directories(${SDL2_INCLUDE_DIRS}
                    ${SDL2IMAGE_INCLUDE_DIRS}
                    )



add_executable(${PROJECT_NAME}
    main.cpp
    src/Game.cpp
    )
target_link_libraries(TestGraphic ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})

 ,

zitzitz ()

Не запускается Trine

Привет всем! (давненько я на ЛОРе не был, даже соскучился :) )

Debian 9 Stretch amd64. Игру раззиповал (DRM-free) сделал chmod 755 на несколько исполнимых файлов. ldd показывал недостающую libpng12.so.0 для лончера , я скопировал её (вручную) из Дебиан 8 Джесси. (теперь ldd на всё пишет ок, лончер запускается; стим-рантайма нет, ошибок про swrast_dri.so соответственно тоже)

Все запуски игры (trine1.sh, bin/trine1_linux_32bit, bin/trine1_linux_launcher_32bit) дают окно с ошибкой: Failed to initialize SDL, the game will not be able to start. (жму единственную кнопку ОК, всё пропадает).

В терминале — есть ошибки (ALSA), но они скорее типа дебаг лога — в конце поста.

Видимо какие-то не те версии каких-то либ. Каких? Или что другое?

Другие (немногочисленные) игры запускаются ок.

Помогите пожалуйста кто чем может.

Попытка LD_PRELOAD трёх включённых в игру либ (2 нвидиевских Cg и SDL) при запуске лончера даёт ошибку: ERROR: ld.so: object '/mnt/win/linux/_enchanted_edition_/_lib/lib32/libSDL-1.3.so.0' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored. Это странно, поскольку эти либы, как и вся остальная игра — 32-битные (и в системе всякие либы 32 конечно стоят). При запуске игры прямо (bin/trine1_linux_32bit) никакого эффекта от такого LD_PRELOAD нет. Поэтому думаю это нипричём (?)

Лог из терминала:

$ LIBGL_DEBUG=verbose bin/trine1_linux_32bit
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.ENS1371.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
....
(много такого)
....
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM phoneline
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.ENS1371.pcm.modem.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM phoneline
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:990:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
Pa_OpenDefaultStream failed Device unavailable
libGL: Can't open configuration file /home/ju/.drirc: No such file or directory.
libGL: pci id for fd 15: 1002:683f, driver radeonsi
libGL: OpenDriver: trying /usr/lib/i386-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/i386-linux-gnu/dri/radeonsi_dri.so
libGL: Can't open configuration file /home/ju/.drirc: No such file or directory.
libGL: Can't open configuration file /home/ju/.drirc: No such file or directory.
libGL: Using DRI3 for screen 0

(radeonsi_dri.so по пути из второй строчки OpenDriver - имеется)

 , ,

the1 ()

TTF_OpenFont отрабатывает без ошибок, но текст не отображается

SDL_Surface* renderText(const std::string &message, const std::string &fontFile,
                        SDL_Color color, int fontSize, SDL_Renderer *renderer)
{  
    static TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize);
    SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color);
    return surf;
}

    static SDL_Surface* texture_text =  //IMG_Load("img.png");
    renderText("Hello world!", "font.ttf", {0x00, 0x00, 0xFF, 0xFF}, 16, nullptr);
    auto Mode = GL_RGB;
    if (texture_text)
    {      
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        if(texture_text->format->BytesPerPixel == 4)
            Mode = GL_RGBA;
     }
 
    // set texture parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
   glTexImage2D(GL_TEXTURE_2D, 0, Mode, texture_text->w, texture_text->h, 0, Mode, GL_UNSIGNED_BYTE, texture_text->pixels);

SDL2, пытаюсь грузить в этом коде картинку (IMG_Load) - всё хорошо, но в случае текста отображается сплошной красный текст. Ошибок при загрузке шрифта - нет. Куда копать? Есть подозрение, что шрифт, на самом деле отображается, но метровыми буквами.

Правда, картинка тоже отображается перевёрнутой, ужатой до размеров прямоугольника и растянутой по ширине, но это ожидаемо.

 ,

next_time ()

Обновление экрана в SDL2

Например в Unity есть команда Time.deltatime, с помощью которой обновление экрана на разных компьютерах будет одинаковым. А как в SDL2 так сделать? Если использовать SDL_GetTicks() без дополнительных переменных, то обновление будет долгим.

 , ,

u0atgKIRznY5 ()

Где ошибка?

Вот ссылка на github https://github.com/xverizex/select
Там программа. При запуске отображается сетка из элементов.
Можно нажимать вверх,влево,вниз,вправо, и переходить по элементам. 'q' выйти.
Ошибка возникает, когда появляется возможность выйти за пределы сетки, но как? Я же запретил это делать.

if ( x->up )
{
Может у меня чего неправильно с распределением блоков?

 , ,

u0atgKIRznY5 ()

SDL -> SDL2

Перевожу один свой проект на SDL2, раньше использовал SDL. Была такая логика - главное окно делилось на несколько зон, в каждой из которых рисовался свой surface. Приведу код:

  (loop with plot-n = 3 with plot-h = (round (/ height plot-n))
        for i from 0 below plot-n
        for name in (list
                     "Температура охлаждающей жидкости (°С)"
                     "Положение дроссельной заслонки (%)"
                     "Скорость вращения двигателя на холостом ходу (об/мин)")
        for s = (sdl:create-surface width plot-h) 
        do (progn
             (sdl:fill-surface sdl:*white* :surface s)
             (draw-plot name s)
             (sdl:draw-surface-at s
                                  (point :x 0 :y (* i (/ height plot-n)))
                                  :surface sdl:*default-surface*))))

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

(let* ((s (sdl2:create-rgb-surface 100 100 1))
       (r (sdl2:create-software-renderer s)))
  (sdl2:set-render-draw-color r 0 0 255 255)
  (sdl2:render-draw-line r 0 0 100 100)
  (sdl2:render-copy render (sdl2:create-texture-from-surface r s)
                    :source-rect (make-rect 0 0 100 100)
                    :dest-rect (make-rect 10 10 110 110)))

Доки почитал, но что-то не разобрался. Спасибо.

РЕШЕНИЕ:

(defun start-plot ()
  (sdl2:make-this-thread-main
   (lambda ()
     (sdl2:with-init (:everything)
       (sdl2:with-window (win :title "prostolog" :w *width* :h *height*)
         (sdl2:with-renderer (render win)
           (sdl2:with-gl-context (gl-context win)
             (init-scene)
             (sdl2:with-event-loop (:method :poll)
               (:keyup
                (:keysym keysym)
                (when
                    (sdl2:scancode= (sdl2:scancode-value keysym) :scancode-escape)
                  (sdl2:push-event :quit)))
               (:idle
                ()
                (let ((foreground-textures '()))
                  
                  (dotimes (i 30)

                    ;; texture
                    (let ((texture
                            (sdl2:create-texture render 373694468 :target 100 50)))
                      ;; clear texture background
                      (sdl2:set-render-target render texture)
                      (sdl2:set-render-draw-color render 200 200 200 255)
                      (sdl2:render-clear render)
                      ;; drawing at texture
                      (sdl2:set-render-draw-color render 0 0 0 255)
                      (sdl2:render-draw-line render 0 0 100 50)
                      (sdl2:render-draw-line render 100 0 0 50)
                      ;; return render 
                      (sdl2:set-render-target render nil)
                      (push texture foreground-textures))

                    ;; anouther texture
                    (let ((texture
                            (sdl2:create-texture render 373694468 :target 200 30)))
                      ;; clear texture background
                      (sdl2:set-render-target render texture)
                      (sdl2:set-render-draw-color render 100 100 100 255)
                      (sdl2:render-clear render)
                      
                      ;; drawing at texture
                      (sdl2:set-render-draw-color render 255 0 0 255)
                      (sdl2:render-draw-line render 0 0 200 30)
                      (sdl2:render-draw-line render 0 30 200 0)
                      
                      ;; return render 
                      (sdl2:set-render-target render nil)
                      (push texture foreground-textures)))

                  ;; draw window background graphics
                  (sdl2:set-render-draw-color render 255 255 255 255)
                  (sdl2:render-clear render)
                  (sdl2:set-render-draw-color render 255 0 0 255)
                  (sdl2:render-draw-line render 0 0 *width* *height*)
                  (sdl2:set-render-draw-color render 0 0 255 50)
                  (sdl2:render-draw-line render *width* 0 0 *height*)
                  
                  ;; draw textures at window surface
                  (loop for ft in foreground-textures
                        for w = (texture-width ft) for h = (texture-height ft)
                        with offset = 0
                        while (< (+ offset h) *height*)
                        do
                           (progn
                             (sdl2:render-copy
                              render ft
                              :dest-rect (sdl2:make-rect
                                          (- (/ *width* 2) (/ w 2))
                                          offset w h))
                             (incf offset h))))

                ;; present all stuff at window surface
                (sdl2:render-present render))
                
               (:quit () t)))))))))

 ,

pseudo-cat ()

Помогите скомпилить динамическую библиотеку, использующую библиотеку SDL1.2

Приветствую.

Я новичек в C. Пишу свою библиотеку некоторых функций на основе SDL1.2. Хочу скомпилировать все свои наработки в динамическую библиотеку *.so и использовать ее в других проектах. Как правильно оформить опции компиляции, чтобы моя библиотека «знала» о библиотеке SDL.

Пока у меня вот что получилось:

gcc -I/usr/include/lua5.2/ -L/usr/lib/ -c -Wall -fPIC -g main.c -o main.o -lSDL -llua &&
gcc -shared main.o -o mylib.so

Но при поптке зарекуарить свою библиотеку получаю ошибку:

lua5.2: error loading module 'mylib' from file './mylib.so':
	./mylib.so: undefined symbol: SDL_Quit

Я так понимаю, дело здесь в том, что моя библиотека скомпилине без знания о sdl-библиотеке. Подскажите, пожалуйста.

 , , ,

djnoob ()

Это что получается, в этой вашей убунте нынче сломана ALSA?

Собрал portable сборку xash3d с SDL для упрощения тестирования (чтобы избежать багов из-за системной версии SDL и сложного процесса установки 32битной версии).
http://hlfx.ru/forum/showthread.php?s=&postid=157356
Скинул людям с убунтой, а у них звук не работает. SDL собран с поддержкой alsa и oss.
Это что за (цензура)? Эти (цензура) в своём (цензура)аудио не смогли запилить эмуляцию alsa? Когда-то юзал давно пшшшаудио, оно глючило, шипело, но я не помню ни разу, чтобы alsa-програмы не могли открыть устройство.

 , , ,

mittorn ()

Йобы на sdl

Как много в природе существует более-менее известных и графонистых игр, написанных на sdl, пусть и с закрытым исходным кодом? Я сейчас спрашиваю именно про йобы, а не про дворфов и тукс карт.

 ,

maxan ()

массив для SDL_Surface из SDL

можно например загрузить файл с рисунком из папки. А вот например я с помощью gimp экспортирую рисунок в два файла в *.c и *.h. Можно ли использовать какой нибудь из этих файлов для того чтобы добавить массив в sdl_surface ? Если можно, то как ?

 , ,

u0atgKIRznY5 ()

аналог SDL_KEYUP в SDL_JOYAXISMOTION

В SDL_KEYUP понятно, отпуская клавишу, выполнить действия. А как сделать в SDL_JOYAXISMOTION? влево,вправо,вниз,вверх, клавиши которые интересуют. При отпускании наверное event.jaxis.value приравниваются к нулю. Нужно чтобы пока нажата клавиша, происходило непрерывно действие. Когда клавиша не нажата, ничего не происодит.

 , ,

u0atgKIRznY5 ()

sdl xinit flickering

ubuntu gnome 14.04. Ставим самописный video_test, быстро меняющий цвет в окне SDL. The all is ok.

Переходим в терминал и останавливаем иксы service gdm stop. Запускаем минимальный x server и в нем тест (xinit video_test)

На экране появляется артефакты которые очень похоже на проблемы с вертикальной синхронизацией. При этом в обоих вариантах: - параметры видеодрайвера одинаковы (если глянуть /sys/module/...) - вертикальная синхронизация выключена (если глянуть xvidtune -show)

Проблемы наблюдаются, что с дефолтным fbcon, что с direct_fb

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

 ,

Burns ()

sdl-joystick и его номер

Разбираюсь потихоньку с эмулятором MAME и в конфиге mame.ini увидел:

#
# CORE INPUT OPTIONS
#
joystick                  1

#
# SDL JOYSTICK MAPPING
#
joy_idx1                  auto
joy_idx2                  auto
joy_idx3                  auto
joy_idx4                  auto
joy_idx5                  auto
joy_idx6                  auto
joy_idx7                  auto
joy_idx8                  auto
sixaxis                   0

и собственно вопрос: а где можно для sdl глобально назначить номера подключенных джойстиков? Или может есть специальная программа для этого дела?

 , , , ,

NK ()

SDL Joystick подключение нового джойстика

Задача в чем - необходимо корректно обрабатывать отключение и подключение джойстиков в системе. Для работы с джойстиками используется SDL1.2

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

  SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
  SDL_InitSubSystem(SDL_INIT_JOYSTICK);

Это делаем и все бы здорово, но рассмотрим ситуацию, когда один джойстик подключен, а другой нет.

Фиксируем состояние осей рабочего джойстика, например, в положении (32767,32767), затем срабатывает переинициализация и, до тех пор, пока оси не сдвинутся с места (32767,32767), то функция SDL_JoystickGetAxis() будет выдавать нулевое положение (0, 0).

SDL_JoystickUpdate() после переинициализации не помогает.

В доках пишут - если эта функция SDL_JoystickGetAxis() выдает ноль, то смотри SDL_GetError(). Там все чисто.

Как бы это обойти или что я делаю не так? Мне необходимо истинное положение джойстика после инициализации.

 

Burns ()

antimicro - 404

вот такая вот ситуация с репозиторием и основной страницей проекта https://github.com/Ryochan7/antimicro
Надеялся на лучшее, но по ходу нет https://github.com/Ryochan7/antimicro-packaging/issues/1#issuecomment-205949365

Не совсем понятно (лично мне) из-за чего проект был удален. Кто владеет английским не подскажете, не поясните что все таки случилось?

...И сразу вспомнилась новость когда-то на ЛОРе про Teeworlds, что разработчика просто достало, что постоянно ломали его сервер и он тратил время свободное не на код, а на восстановление, как-то так там было...

 , , , ,

NK ()