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. Вобщем, надо - адаптируйте. Буду рад. Когда я закинул клич "дайтимнепазалусто 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 Размещу у себя в ридми к библиотеке инфу - пишет. Приятно. Про возможности 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, Вы, похоже, нормальную защиту типов КП воспринимаете как врага для Вашей работы. Смотрите внимательнее: 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/ |