OberonCore
https://forum.oberoncore.ru/

SDL (Simple DirectMedia Layer)
https://forum.oberoncore.ru/viewtopic.php?f=47&t=2019
Страница 1 из 3

Автор:  Rafi [ Суббота, 07 Ноябрь, 2009 04:59 ]
Заголовок сообщения:  SDL (Simple DirectMedia Layer)

На форуме несколько раз упоминали эту библиотеку. И вроде кто-то даже писал или собирался писать интерфейсные модули.
Так вот, вопрос незамысловат: кто-нибудь поделиться наработками, если есть?)

Автор:  Oleg N. Cher [ Среда, 28 Сентябрь, 2011 21:01 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Здесь: http://sourceforge.net/projects/sdl-for-oberon. Наиболее проработана увязка для КП/ББ. Слегка начата для ETH Oberon и XDS.

Автор:  ilovb [ Воскресенье, 26 Февраль, 2012 13:46 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Скажите пожалуйста насколько оно жизнеспособно в BB? Есть примеры использования?

Автор:  Oleg N. Cher [ Среда, 29 Февраль, 2012 22:33 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

ilovb писал(а):
Скажите пожалуйста насколько оно жизнеспособно в BB? Есть примеры использования?
ББ здесь ни при чём. Используется только как запускалка компилятора КП.

Примеры использования есть... в JEDI. :wink: Вобщем, надо - адаптируйте. :wink: Буду рад. Когда я закинул клич "дайтимнепазалусто SDL" - народ отмолчался. Пришлось самому делать. А вообще берите за базу код от F. Necati Ecevit, скачивается тут же: http://sourceforge.net/projects/sdl-for-oberon/. Там есть примеры. Правда, глючные.

Автор:  ilovb [ Четверг, 01 Март, 2012 09:30 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Спасибо за ответ. Я просто об SDL только слышал. А на деле слабо представляю что он позволяет вытворять :)

Автор:  Oleg N. Cher [ Четверг, 01 Март, 2012 14:53 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

ilovb писал(а):
Спасибо за ответ. Я просто об SDL только слышал. А на деле слабо представляю что он позволяет вытворять :)
Спасибо за адекватную реакцию. А то сделаешь, выложишь, пропиаришь, а кто-то ещё и обругает за баги. Или что увидел не то, чего ожидал. Обидно. Понятно, что нету на всё времени, приятно воспользоваться готовеньким, ещё и законченным. Но это ж КП. Он ещё мало известен. Хотя достоинств имеет много.

Я конечно не ставил цель поддержать все компиляторы Оберона, все функции SDL и последние версии SDL_gfx, SDL_image и проч. Просто довёл обёртку до приемлемого состояния для своей задачи, решил и забыл.

А тут наткнулся, вспомнил, дай, думаю, сделаю что надо, чтобы народ узнал о возможности разработки для SDL и на КП. Пока на форуме SDL зарегился, пока пробился через их спам-фильтры. Разместил инфу на http://forums.libsdl.org/viewtopic.php?t=7955. В ответ ноль реакции. Их Андроид интересует больше, чем языки Оберон-семейства. О, наконец-то приходит письмо от Andreas Schiffler, автора SDL_gfx. Пишет - Cool :D Размещу у себя в ридми к библиотеке инфу - пишет. Приятно.

Про возможности SDL и продукты на её основе можно глянуть на оф.сайте http://www.libsdl.org. Уже с полмесяца переписываюсь с Sam Lantinga, чтобы добавил инфу о биндингах на http://www.libsdl.org/languages.php. Всё забывает. Вот так. Так что, даже чтобы о решении узнали, мало его сделать, надо ещё и продвигать. Подстраиваясь под чужую политику и интересы. Усилия требуются. А, думаете, я когда-то мечтал заниматься доработкой компилятора? Нивжисть. :) Пришлось. Помаленьку втягиваюсь. Мораль: не боги горшки обжигают. Мы способны на бОльшее, чем считаем.

Кстати, не так много людей интересовались разработкой под SDL на КП. Сделаете или адаптируете что-нибудь подходящее - присылайте. Добавлю в качестве примера.

Автор:  Rafi [ Четверг, 01 Март, 2012 17:11 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Олег, большое спасибо за проделанную работу! Буду пробовать

Автор:  ilovb [ Четверг, 01 Март, 2012 17:48 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Я тоже буду прощупывать потихоньку...

Автор:  Rafi [ Пятница, 02 Март, 2012 01:55 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Возник ступор с использованием процедуры RWFromFP...
Допустим, загрузил я bmp-файл, и хранится он у меня в какой-нибудь переменной bmpFile: Files.File.
Не могу сообразить, что мне передать в параметр fp: Sdl.Pointer. Попытался так: завёл указатель bmpBytes: POINTER TO ARRAY OF BYTE, прочитал в bmpBytes байты из bmpFiles. Затем записываю rw := Sdl.RWFromFP(x, 0). Компилятор говорит о несовместимости. Я так понимаю, что он не хочет совмещать указатель на массив с указателем на антаговый массив, коим является Sdl.Pointer. Но как в таком случае передать байты bmp-файла в RWFromFP?

Автор:  Роман М. [ Пятница, 02 Март, 2012 16:07 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

С обертками над внешними библиотеками вообще проблема в Оберонах по той причине, что использование модуля SYSTEM практически неизбежно. В результате модули непереносимы и пользоваться ими непросто из-за обилия операций над нетипизированными данными. Все это из-за несоответствия уровня требований к безопасности у языков. Так что нередко мало одной только обертки и, поэтому, достраивается дополнительный переносимый модуль для комфортной работы, часто с применением ООП.

Автор:  Rafi [ Пятница, 02 Март, 2012 22:19 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Угу, понятно, что крайне желательно писать переносимые модули с абстрактными записями. И, наверное, так и надо стремиться делать. Но тут вот споткнулся о специфический нюанс и никак не соображу, что надо делать. Вот есть у процедуры параметр типа POINTER [untagged] TO ARRAY OF [untagged] BYTE. И есть переменная типа POINTER TO ARRAY OF BYTE. Как из этой переменной передать данные в параметр?
Загрузку изображения решил, используя процедуру Image.Load, в которой просто прописывается путь к файлу. Но вопрос всё-равно остаётся в силе

Автор:  Роман М. [ Суббота, 03 Март, 2012 00:33 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Rafi писал(а):
от есть у процедуры параметр типа POINTER [untagged] TO ARRAY OF [untagged] BYTE. И есть переменная типа POINTER TO ARRAY OF BYTE. Как из этой переменной передать данные в параметр?

Я думаю, что напрямую этого сделать нельзя из-за несовместимости типов. Ведь тегированный (безопасный) тип имеет скрытую служебную информацию о размере и типе данных, а нетегированный указатель этой информации не имеет. Можно только инициализировать POINTER TO ARRAY OF BYTE и заполнить его значениями из POINTER [untagged] TO ARRAY OF [untagged] BYTE. То есть простой перегон байтов из одной области в другую.

P.S. В суть вопроса о SDL не вникал.

Добавлено позже:
Пардон. Допустим, наши типы объявлены так
TYPE
P1* = POINTER [untagged] TO ARRAY OF [untagged] BYTE;
P2* = POINTER TO ARRAY OF BYTE;

Тогда насчёт перегона байтов верно, если нужно передать данные из P1 в P2. И если имеем P2, то применяем "обычный" кастинг при помощи SYSTEM.VAL(P1, myP2var). И все эти операции с кастингом чреваты последствиями обрушения сборщика мусора, если что-то указано не на ту область памяти.

Автор:  Rafi [ Суббота, 03 Март, 2012 04:01 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Роман, спасибо за пояснения. Но вот опять споткнулся об антаговый тип.
Имеем процедуру Load(file: PChar), где PChar: POINTER TO ARRAY [untagged] OF CHAR.
Вызываем процедуру таким образом: Load("путь к файлу"). Процедура возвращает TRUE, файл успешно загружен.
Но вот я завожу переменную fileName: POINTER TO ARRAY OF CHAR. Загоняю в неё строку "путь к файлу".
Затем вызываю Load(SYSTEM.VAL(PChar, fileName)). Процедура возвращает FALSE. Происходит искажение строки? Или там вообще не строка в итоге передаётся?
В общем, гадаю, что за изменение произошло, отчего путь к файлу оказывается неверным.

Автор:  Илья Ермаков [ Суббота, 03 Март, 2012 08:11 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Насколько я понимаю, Load - это заголовок для внешней процедуры с параметром char*?
Тогда вы сделали неудобный заголовок.
Обычно делается заголовок Load (VAR [nil] fileName: ARRAY OF CHAR).
И сможете удобно передавать любую строку, в чём бы она у вас не хранилась.
И NIL, если нужно (если внешняя процедура допускает nil).

Автор:  Oleg N. Cher [ Суббота, 03 Март, 2012 10:13 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Rafi писал(а):
Возник ступор с использованием процедуры RWFromFP...
Допустим, загрузил я bmp-файл, и хранится он у меня в какой-нибудь переменной bmpFile: Files.File.
Не могу сообразить, что мне передать в параметр fp: Sdl.Pointer. Попытался так: завёл указатель bmpBytes: POINTER TO ARRAY OF BYTE, прочитал в bmpBytes байты из bmpFiles. Затем записываю rw := Sdl.RWFromFP(x, 0). Компилятор говорит о несовместимости. Я так понимаю, что он не хочет совмещать указатель на массив с указателем на антаговый массив, коим является Sdl.Pointer. Но как в таком случае передать байты bmp-файла в RWFromFP?

Функция RWFromFP читает файл из файловой переменной, которая конечно несовместима ни с какими Files.File или POINTER TO ARRAY OF BYTE. Там, видите, есть коммент (* fp is FILE *fp ??? *) ? fp это указатель на файл в сишной нотации. Мне кажется, Вам вместо RWFromFP нужно воспользоваться для этой цели функциями RWFromMem или RWFromConstMem. Вот рабочий пример:

Код:
TYPE
  Coords* = INTEGER;
  Sprite* = Sdl.PSurface;

PROCEDURE PutScaledSprite* (x, y: Coords; spr: Sprite);
VAR
  dest: Sdl.Rect;
  img, scaled: Sdl.PSurface;
  size: Sdl.Integer;
BEGIN
  (* Use SDL_SoftStretch *)
  SYSTEM.GET(SYSTEM.VAL(Sdl.Integer, spr) + 2 + ProcDisplacement, size);
  img := Sdl.LoadBMPRW(SYSTEM.VAL(Sdl.PRWops,
    Sdl.RWFromConstMem(SYSTEM.VAL(Sdl.Pointer, SYSTEM.VAL(Sdl.Integer, spr)
      + ProcDisplacement), size)), 1);

  ...

END PutScaledSprite;

Rafi писал(а):
Но вот опять споткнулся об антаговый тип.
Имеем процедуру Load(file: PChar), где PChar: POINTER TO ARRAY [untagged] OF CHAR.
Вызываем процедуру таким образом: Load("путь к файлу"). Процедура возвращает TRUE, файл успешно загружен.
Но вот я завожу переменную fileName: POINTER TO ARRAY OF CHAR. Загоняю в неё строку "путь к файлу".
Затем вызываю Load(SYSTEM.VAL(PChar, fileName)). Процедура возвращает FALSE. Происходит искажение строки? Или там вообще не строка в итоге передаётся?
В общем, гадаю, что за изменение произошло, отчего путь к файлу оказывается неверным.

Rafi, Вы, похоже, нормальную защиту типов КП воспринимаете как врага для Вашей работы. :D
Смотрите внимательнее: PChar вовсе не является POINTER TO ARRAY [untagged] OF CHAR.
Код:
TYPE
   Char*       = SHORTCHAR;
...
   PChar*      = POINTER [untagged] TO ARRAY [untagged] OF Char;

Вы просто приводите Вашу строку fileName типа CHAR к короткой однобайтовой строке PChar. Это банальная несовместимость типов. Попробуйте Load(SHORT(fileName$)). Без всякого SYSTEM.VAL.

Роман М. писал(а):
Так что нередко мало одной только обертки и, поэтому, достраивается дополнительный переносимый модуль для комфортной работы, часто с применением ООП.
Это правильно. Кстати, для SDL есть объектная обёртка http://osdl.sourceforge.net/. Надо подтягивать в эту сторону и Обероны.

Автор:  Rafi [ Суббота, 03 Март, 2012 17:36 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Илья Ермаков писал(а):
Обычно делается заголовок Load (VAR [nil] fileName: ARRAY OF CHAR).

Попробовал сделать так. Помогло :)
Oleg N. Cher писал(а):
Смотрите внимательнее: PChar вовсе не является POINTER TO ARRAY [untagged] OF CHAR

Не копнул на самую глубину :( Увидел Sdl.Char и рефлекторно связал его с CHAR, а оно там вон как оказалось.
Oleg N. Cher писал(а):
Попробуйте Load(SHORT(fileName$))

И так ругается на несовместимость.

Автор:  Oleg N. Cher [ Суббота, 03 Март, 2012 18:06 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Rafi писал(а):
Oleg N. Cher писал(а):
Попробуйте Load(SHORT(fileName$))

И так ругается на несовместимость.

А что это там у Вас за Load, вроде в SDL такого нету? Я всё время опасаюсь за некорректность в биндинге, буде заметите таковую, не премините сообщить.
По поводу Load неплохо бы увидеть код.

Автор:  Rafi [ Суббота, 03 Март, 2012 18:30 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Я использую процедуру Load из модуля SdlImage:
Код:
DEFINITION SdlImage ["SDL_Image.dll"];
 ...
    PROCEDURE [ccall] Load (file: Sdl.PChar): Sdl.PSurface;


Заработало, когда записал следующим образом:
Код:
PROCEDURE (do: DisplayObject) Init*(x, y: INTEGER; file: ARRAY OF SHORTCHAR): BOOLEAN, NEW;
BEGIN
   do.image := SdlImage.Load(file)
END Init;


Всё оказалось просто :)

Автор:  ilovb [ Воскресенье, 04 Март, 2012 18:52 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Ссылочка в тему:
http://plg.lrn.ru/doc/sdl/index.html

Автор:  Rafi [ Вторник, 06 Март, 2012 02:27 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Вот ещё ссылка: http://lazyfoo.net/SDL_tutorials/

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/