Спасибо за ответы. Изменил название модулей и разложил правильно по каталогам.
Попробовал скомпилировать этот код на Windows XP, заменил в этой строчке "libSDL2.so" на "SDL2.dll":
Код:
MODULE SDL2Lib ["libSDL2.so"];
Скачал файл SDL2.dll и поместил его в корневой каталог Блэкбокса. Файл качается отсюда:
https://www.libsdl.org/download-2.0.php [см. «SDL2-devel-2.0.4-mingw.tar.gz (MinGW 32/64-bit)» в разделе «Development Libraries -> Windows»]
Ещё заменил SDL_RENDERER_ACCELERATED на SDL_RENDERER_SOFTWARE (на виртуальной машине с Виндоусом SDL2 неадекватно обрабатывает отсутствие видеокарты), т. е. заменил {1} на {0} в этой строчке:
Код:
ren := SDL.SDL_CreateRenderer(win, -1, {1});
Запустил, произошло почти тоже самое: Блэкбокс завис на пару секунд (как и написано в тестовой программе - вызывается SDL_Delay(2000)). Единственное отличие от Лиунксовской версии состоит в том, что на эти две секунды в панели программ появляется новое окошко Блэкбокса. Точнее, появляется кнопка (см. прилож. рис.). Если на неё быстро нажать, она типа берёт фокус, но ничего не происходит, само окно не появляется. Почему окно невидимое? Что я забыл сделать? Помню, месяца 4 назад я быстренько сделал в Блэкбоксе на Виндоусе такую же привязку к SDL2 и всё как-то быстро заработало. Потом, кажется, оно стало иногда крэшится и я не мог понять почему (и тогда пришлось найти более понятный OO2C и делать всё в нём).
Кстати, если запустить Блэкбокс на Линуксе из-под Wine (сборка OberonCore), то из него можно будет копировать текст модулей, поэтому привожу текст ниже.
Sdl/Mod/Lib.odc:
Код:
MODULE SdlLib ["libSDL2.so"]; (* А на Винде тут должно быть ["SDL2.dll"] *)
TYPE
Window* = POINTER TO ABSTRACT RECORD END;
Renderer* = POINTER TO ABSTRACT RECORD END;
Version* = RECORD
major*, minor*, patch*: SHORTCHAR
END;
PROCEDURE [ccall] SDL_GetVersion*(VAR ver: Version);
PROCEDURE [ccall] SDL_Init*(flags: SET): INTEGER;
PROCEDURE [ccall] SDL_Quit*;
PROCEDURE [ccall] SDL_Delay*(ms: INTEGER);
PROCEDURE [ccall] SDL_CreateWindow*
(title: ARRAY OF CHAR; x, y, w, h: INTEGER; flags: SET): Window;
PROCEDURE [ccall] SDL_DestroyWindow*(win: Window);
PROCEDURE [ccall] SDL_CreateRenderer*
(win: Window; index: INTEGER; flags: SET): Renderer;
PROCEDURE [ccall] SDL_DestroyRenderer*(ren: Renderer);
PROCEDURE [ccall] SDL_RenderClear*(ren: Renderer);
PROCEDURE [ccall] SDL_RenderPresent*(ren: Renderer);
PROCEDURE [ccall] SDL_SetRenderDrawColor*
(ren: Renderer; r, g, b, a: INTEGER);
END SdlLib.
(!) DevCompiler.Compile SdlLib
SDLTest/Mod/SDLTest.odc:
Код:
MODULE SDLTest;
IMPORT StdLog, SDL := SdlLib;
VAR win: SDL.Window;
ren: SDL.Renderer;
PROCEDURE Draw;
BEGIN
SDL.SDL_SetRenderDrawColor(ren, 255, 0, 0, 255);
SDL.SDL_RenderClear(ren);
SDL.SDL_RenderPresent(ren);
SDL.SDL_Delay(2000)
END Draw;
PROCEDURE Do*;
BEGIN
IF SDL.SDL_Init({5}) # 0 THEN
StdLog.String('Error in SDL_Init'); StdLog.Ln
ELSE
win := SDL.SDL_CreateWindow('', 10, 10, 320, 200, {});
IF win = NIL THEN
StdLog.String('Error in SDL_CreateWindow'); StdLog.Ln
ELSE
ren := SDL.SDL_CreateRenderer(win, -1, {1}); (* Если тут ошибка, то пишем {0}, чтобы переключить на с аппаратного прорисовщика на программный *)
IF ren = NIL THEN
StdLog.String('Error in SDL_CreateRenderer'); StdLog.Ln
ELSE
Draw;
SDL.SDL_DestroyRenderer(ren)
END;
SDL.SDL_DestroyWindow(win)
END
END;
SDL.SDL_Quit;
StdLog.String('SDL_Quit successful.'); StdLog.Ln
END Do;
END SDLTest.
(!) DevCompiler.CompileAndUnload SDLTest
(!) SDLTest.Do