OberonCore
https://forum.oberoncore.ru/

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

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

Олег, скажите, вы намеренно не стали экспортировать такие типы, как PUInt8 и PUInt16 модуля Sdl?
Вопрос возник, когда понадобилось воспользоваться процедурой:
Код:
PROCEDURE [ccall] GetKeyState (VAR numKeys: Sdl.Integer): Sdl.PUInt8;

Завёл переменную типа Sdl.PUInt8, куда думал возвращать кейстейты. Но обнаружил, что тип не экспортирован. Я его на экспорт пометил у себя, но это изменение интерфейса всё же.

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

Rafi, это банальная недоработка, т.к. я использовал ленивый экспорт типов по мере их необходимости. Конечно исправлю.

Кстати, многие процедуры SDL понимают строковые аргументы в кодировке UTF-8 (позволяя использовать символы не только из основной латиницы, но и всё множество символов). Для тех, кто не знает: эта кодировка совместима сверху вниз по символам основной латиницы (они занимают в ней 1 байт), остальные же символы многобайтные. Поэтому когда применяется латиница, работа с ней выглядит как и раньше, прозрачно.

Значит для полноценного использования всего множества символов в SDL на Компонентном Паскале нам нужны процедуры перекодировки между юникодом (CHAR) и UTF-8 (SHORTCHAR или Sdl.Char). Их не помешало бы добавить в Sdl.Misc. У кого есть наработки, поделитесь, пожалуйста.

Автор:  Пётр Кушнир [ Среда, 04 Апрель, 2012 22:19 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

viewtopic.php?f=3&t=2937&hilit=utf+8

Автор:  Евгений Темиргалеев [ Четверг, 05 Апрель, 2012 07:40 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

http://oberoncore.ru/bbcc/subs/strings/

Автор:  Иван Денисов [ Среда, 01 Май, 2013 21:16 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Поскольку в GLUT не нашел поддержки колеса мыши, прешел на ваш порт SDL вместо него. Но пришлось сделать две правки.

Первое, недостающие флаги:
Код:
SDL_OPENGLBLIT* = {1, 3}; (* Create an OpenGL rendering context *)
RESIZABLE* = {4}; (* This video mode may be resized *)
NOFRAME* = {5}; (* No window caption or edge frame *)
Второе, невозможно пользоваться контекстным меню Исходники, поэтому переименовал Sdl в SdlSdl, а внутри связанных модулей объявления заменил на Sdl := SdlSdl. Так оно логичнее, по-блэкбоксовски получилось.

Вот тут измененная подсистема вместе с необходимыми библиотеками теперь еще хранится: http://oberon.molpit.com/pacs/Sdl.txt.
Сделал для нее Quick-Start, Compile-List, Coder-List. ИМХО, ее надо оформить в виде подсистемы и добавить в список подсистем на сайт oberoncore.

Пока разбирался с SDL, обновил уроки, которые ранее портировал с gamedev.

Автор:  Иван Денисов [ Среда, 01 Май, 2013 21:27 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

ilovb писал(а):
Скажите пожалуйста насколько оно жизнеспособно в BB? Есть примеры использования?
Появились еще простейшие примеры использования для связки с OpenGl в виде первых шести уроков с сайта gamedev. Из Красноярской сборки они устанавливаются легко так: Инструменты → Установить подсистему... там находите, Sdl, OpenGL и OglLessons. Есть возможность поставить все три пакета оттуда.

Автор:  ilovb [ Четверг, 02 Май, 2013 00:46 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Классно! Спасибо.

И отдельное спасибо за установку в три клика мышкой :)

Автор:  Пётр Кушнир [ Четверг, 02 Май, 2013 10:24 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

во freeglut имеется поддержка колеса.

Автор:  Иван Денисов [ Четверг, 02 Май, 2013 11:24 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Пётр Кушнир писал(а):
во freeglut имеется поддержка колеса.
Пётр, я наткнулся на вот такой интересный материал, где приводится весомый аргумент, что для серьезных приложений не рекомендуется использовать что-либо с собственной петлей. А в freeGLUT ведь, наверное, такая петля также есть как и в GLUT.

Цитата:
First, FreeGLUT should never be used for anything that you would call an "engine". Whatever you mean by that, FreeGLUT is not the tool for the job. It's designed for creating demos, which is why it owns the main loop. I understand that FreeGLUT does have a way to allow you some control over the main loop, but the standard way to use FreeGLUT doesn't do that.


При портировании BlackBox на Gtk-2 это (наличие собственной странной петли в Gtk) стало камнем преткновения, до сих пор не удалось реализовать приемлемый HostMenus.Loop (посмотрите исходники, они теперь у вас есть). Эта петля либо на дает корректно обновлять интерфейс, либо грузит процессор на 100%. Так дело и стоит.

Автор:  Info21 [ Четверг, 02 Май, 2013 12:41 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Можно напомнить, какие вообще есть опции без собственной петли?

Автор:  Пётр Кушнир [ Четверг, 02 Май, 2013 14:09 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Во фриглут управляемая петля.
то есть, в наличии процедура glutInit и процедура glutMainLoopEvent

вообще, эту проблему я решил с самого начала, главная петля по прежнему крутится внутри ББ.

Автор:  Пётр Кушнир [ Четверг, 02 Май, 2013 14:12 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Иван Денисов писал(а):
Пётр, я наткнулся на вот такой интересный материал
По хорошему, конечно, не нужны вообще никакие внешние зависимости. Но для бутстрапа с сохранением логики работы старого хоста фриглут пока подходит.

P.S. извините, совсем увлёкся, ветка ведь про SDL.
Если есть вопросы по этой теме, можно задавать их в ветке про порт.

Автор:  Иван Денисов [ Четверг, 02 Май, 2013 14:17 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Info21 писал(а):
Можно напомнить, какие вообще есть опции без собственной петли?
В тех примерах, которые я разобрал пока по SDL (а вожусь всего несколько дней, честно признаюсь), нигде петля не используется. Она везде организуется через WHILE самим программистом. В этой петле организуется самостоятельная обработка разного рода событий. Может чего и путаю, но я так понял из приведенного выше комментария. За что купил, за то и продаю :)

Автор:  Alexey Veselovsky [ Четверг, 02 Май, 2013 17:08 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Иван Денисов писал(а):
Info21 писал(а):
Можно напомнить, какие вообще есть опции без собственной петли?
В тех примерах, которые я разобрал пока по SDL (а вожусь всего несколько дней, честно признаюсь), нигде петля не используется. Она везде организуется через WHILE самим программистом. В этой петле организуется самостоятельная обработка разного рода событий. Может чего и путаю, но я так понял из приведенного выше комментария. За что купил, за то и продаю :)


Да, в SDL главный цикл обработки сообщений программист всегда пишет сам, ручками, как ему удобней. SDL это либа, а не фреймворк, и этим хороша.

Автор:  Иван Денисов [ Четверг, 02 Май, 2013 19:46 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Что-то не пойму откуда у меня взялась старая версия SDL 1.2.14, тут у Oleg N. Cher и Madzi уже давно отполированная* версия для 1.2.15. Sdl уже давно стал SdlLib и все флаги есть как надо! В общем, я все заменил в уроках и по ссылкам везде новые версии уже. Ilovb, прошу скачать новые версии! Это также можно сделать теми-же 3-мя кликами, ссылки остались теми-же.

* — только библиотека в файле SdlImage.odc вместо SDL_image.dll называется SDL_Image.dll

Автор:  Jordan [ Понедельник, 17 Июнь, 2013 20:38 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Иван Денисов писал(а):
Можно напомнить, какие вообще есть опции без собственной петли?
В тех примерах, которые я разобрал пока по SDL (а вожусь всего несколько дней, честно признаюсь), нигде петля не используется. Она везде организуется через WHILE самим программистом. В этой петле организуется самостоятельная обработка разного рода событий. Может чего и путаю, но я так понял из приведенного выше комментария. За что купил, за то и продаю


Для того, что бы проц не грузился до 100. Лучше ждать событие.

Пример с sdl_pollevent

Код:
procedure Loop;
var
  Quit : boolean;
  Event: TSDL_Event;
begin
  Quit := false;
 
  Draw.Rect(Screen, 0, 0, 800, 600, 212, 208, 200);
 
  while (Quit <> true) do
  begin

    while (SDL_PollEvent(@Event) <> 0) do
    begin

      if (Event.Type_ = SDL_QUITEV) then
      begin
        Quit := true;
      end;

      if (Event.Type_ = SDL_MOUSEMOTION) then
      begin
        Button.Handler(Screen, Event);
      end;
     
    end;
    SDL_Delay(1);
  end;
 

  if (Quit = true) then
  begin
    SDL_Quit;
  end;

end;


Пример с sdl_wait

Код:
procedure Loop;
var
  Quit : boolean;
  Event: TSDL_Event;
begin
  Quit := false;
 
  Draw.Rect(Screen, 0, 0, 800, 600, 212, 208, 200);
 
  while (Quit <> true) do
  begin
    SDL_WaitEvent(@Event);

    if (Event.Type_ = SDL_QUITEV) then
    begin
      Quit := true;
    end;

    if (Event.Type_ = SDL_MOUSEMOTION) then
    begin
      Button.Handler(Screen, Event);
    end;
     
  end;
 
  if (Quit = true) then
  begin
    SDL_Quit;
  end;

end;

Автор:  Иван Кузьмицкий [ Воскресенье, 05 Январь, 2014 13:28 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Очень интересная новость.

Очередное обновление Steam Client использует SDL 2.0. Эта новость (хотя ей уже полгода) очень важна, потому что в свете удачной герметизации хоста, даёт очень интересные перспективы для BlackBox. Так что буду пилить новый герметичный SDL-хост для BB.

Автор:  Иван Кузьмицкий [ Вторник, 14 Январь, 2014 09:14 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Начал ковырять SDL, полез в интернет за туториалами, а везде используется SDL_CreateWindow. В общем, надо перетаскивать биндинг на SDL 2.0.

Автор:  Jordan [ Среда, 15 Январь, 2014 12:00 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

Вот биндинг SDL2 для free pascal, который я использую.
https://github.com/ev1313/Pascal-SDL-2-Headers

Думаю, вам это поможет сделать биндинг для КП.

Онлайн документация http://wiki.libsdl.org/APIByCategory

Переносить, можно самое необходимое, по мере написания.

Автор:  Иван Кузьмицкий [ Суббота, 01 Март, 2014 10:13 ]
Заголовок сообщения:  Re: SDL (Simple DirectMedia Layer)

В интерфейсе SDL есть функция SDL_RenderDrawLines, которая принимает на входе массив точек SDL_Point.

Я объявляю на КП прототип этой функции так:
Код:
MODULE Sdl2Win;

TYPE
PPoint* = POINTER [untagged] TO Point;
Point* = RECORD [untagged]
   x*, y*: int
END;

PROCEDURE [ccall] RenderDrawLines* ["SDL_RenderDrawLines"] (renderer: Renderer; points: PPoint; count: INTEGER): INTEGER;

Как видите, тут [untagged] во все поля, что совершенно не хочется тащить наверх, в приличную программу. Это дело однажды обсуждалось, и я решил поступить так:

Код:
Point* = RECORD
   x*, y*: INTEGER
END;
Points* = POINTER TO ARRAY OF Point;

PROCEDURE RenderDrawLines* (renderer: Renderer; points: Points; count: INTEGER): INTEGER;
BEGIN
   Sdl2Win.RenderDrawLines(renderer(Renderer).r, SYSTEM.VAL(Sdl2Win.PPoint, points), count)
END RenderDrawLines;
дальше делаю NEW(points, 2) и заполняю координаты точек. Но почему-то линия не рисуется (сама-то рисовалка работает, проверено - SDL_RenderDrawPoint рисует точку по координатам x, y нормально, как и линию SDL_RenderDrawLine по x1, y1, x2, y2).

Как же всё-таки правильно привести массив данных к untagged?

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