OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 10:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 04:59 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
На форуме несколько раз упоминали эту библиотеку. И вроде кто-то даже писал или собирался писать интерфейсные модули.
Так вот, вопрос незамысловат: кто-нибудь поделиться наработками, если есть?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Среда, 28 Сентябрь, 2011 21:01 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
Здесь: http://sourceforge.net/projects/sdl-for-oberon. Наиболее проработана увязка для КП/ББ. Слегка начата для ETH Oberon и XDS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Воскресенье, 26 Февраль, 2012 13:46 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Скажите пожалуйста насколько оно жизнеспособно в BB? Есть примеры использования?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Среда, 29 Февраль, 2012 22:33 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
ilovb писал(а):
Скажите пожалуйста насколько оно жизнеспособно в BB? Есть примеры использования?
ББ здесь ни при чём. Используется только как запускалка компилятора КП.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Четверг, 01 Март, 2012 09:30 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Спасибо за ответ. Я просто об SDL только слышал. А на деле слабо представляю что он позволяет вытворять :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Четверг, 01 Март, 2012 14:53 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
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 на КП. Сделаете или адаптируете что-нибудь подходящее - присылайте. Добавлю в качестве примера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Четверг, 01 Март, 2012 17:11 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Олег, большое спасибо за проделанную работу! Буду пробовать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Четверг, 01 Март, 2012 17:48 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Я тоже буду прощупывать потихоньку...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Пятница, 02 Март, 2012 01:55 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Возник ступор с использованием процедуры 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?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Пятница, 02 Март, 2012 16:07 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Пятница, 02 Март, 2012 22:19 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 00:33 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
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). И все эти операции с кастингом чреваты последствиями обрушения сборщика мусора, если что-то указано не на ту область памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 04:01 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 08:11 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 10:13 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
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/. Надо подтягивать в эту сторону и Обероны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 17:36 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Илья Ермаков писал(а):
Обычно делается заголовок 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$))

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 18:06 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
Rafi писал(а):
Oleg N. Cher писал(а):
Попробуйте Load(SHORT(fileName$))

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Суббота, 03 Март, 2012 18:30 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Я использую процедуру 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;


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Воскресенье, 04 Март, 2012 18:52 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Ссылочка в тему:
http://plg.lrn.ru/doc/sdl/index.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDL (Simple DirectMedia Layer)
СообщениеДобавлено: Вторник, 06 Март, 2012 02:27 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Вот ещё ссылка: http://lazyfoo.net/SDL_tutorials/


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB