Moved to D and conceived one project. But I just can not set up a binding and documentation for this language. Can you advise something?

  • one
    details? - Vladimir Gordeev
  • details of what? I can not find the sdl binding to the D language. What can you advise? - Daniel Kolyasnikov
  • Advise to throw D? - Vladimir Gordeev
  • @VladimirGordeev lol - Vladimir Gamalyan
  • Try github.com/DerelictOrg/DerelictSDL2 - Vladimir Gamalyan

3 answers 3

When I was tinkering with Di, I used Derelict . What is the support at the moment - HZ.

    DerelictSDL

    Usage example - see the implementation in DlangUI

    SDL backend for DlangUI

      module sdl2; import std.string, std.file, std.conv, std.algorithm, std.bitmanip; ΠœΡ‹ΡˆΠΊΠ° ΠΌΡ‹ΡˆΠΊΠ°; ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°; class Окно { int ш, Π²; SDL_Window* ΠΎΠΊΠ½ΠΎ; SDL_Renderer* Ρ€Π΅Π½; this(string стр, int ш, int Π², bool vsync = Π΄Π°){ this.ш = ш; this.Π² = Π²; ΠΎΠΊΠ½ΠΎ = SDL_CreateWindow(стр.toStringz, 0x1FFF0000, 0x1FFF0000, ш, Π², 0b100000); Ρ€Π΅Π½ = SDL_CreateRenderer(ΠΎΠΊΠ½ΠΎ, -1, vsync<<2); Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ = стр; if("favicon.png".exists){ auto img = "favicon.png".read; SDL_SetWindowIcon(ΠΎΠΊΠ½ΠΎ, IMG_Load_RW(SDL_RWFromMem(img.ptr, img.length), 1)); } } ~this(){ SDL_DestroyRenderer(Ρ€Π΅Π½); SDL_DestroyWindow(ΠΎΠΊΠ½ΠΎ); } void Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ(string с){ SDL_SetWindowTitle(ΠΎΠΊΠ½ΠΎ, с.toStringz); } string Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ(){ return SDL_GetWindowTitle(ΠΎΠΊΠ½ΠΎ).fromStringz.to!string; } bool Π½Π²_Π΅ΠΊΡ€; bool Π½Π°_вСсь_Π΅ΠΊΡ€Π°Π½(){ return Π½Π²_Π΅ΠΊΡ€; } void Π½Π°_вСсь_Π΅ΠΊΡ€Π°Π½(bool b){ if(b){ DisplayMode Π΄ΠΌ; SDL_GetDesktopDisplayMode(0, &Π΄ΠΌ); SDL_SetWindowFullscreen(ΠΎΠΊΠ½ΠΎ, 1); SDL_SetWindowSize(ΠΎΠΊΠ½ΠΎ, Π΄ΠΌ.ш, Π΄ΠΌ.Π²); Π½Π²_Π΅ΠΊΡ€ = Π΄Π°; ш = Π΄ΠΌ.ш; Π² = Π΄ΠΌ.Π²; }else{ SDL_SetWindowFullscreen(ΠΎΠΊΠ½ΠΎ, 0); SDL_SetWindowSize(ΠΎΠΊΠ½ΠΎ, 640, 480); Π½Π²_Π΅ΠΊΡ€ = Π½Π΅Ρ‚; ш = 640; Π² = 480; } } void Ρ†Π²Π΅Ρ‚_рисования(uint Ρ†){ ubyte[4] m = *cast(ubyte[4]*)& Ρ†; SDL_SetRenderDrawColor(Ρ€Π΅Π½, m[3], m[2], m[1], m[0]); } void Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ(Π’ΠΎΡ‡ΠΊΠ° Ρ‚){ SDL_RenderDrawPoint(Ρ€Π΅Π½, Ρ‚.x, Ρ‚.y); } void Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ(Линия Π», int Ρ†Π²Π΅Ρ‚ = 0x000000FF){ Ρ†Π²Π΅Ρ‚_рисования(Ρ†Π²Π΅Ρ‚); SDL_RenderDrawLine(Ρ€Π΅Π½, Π».Π°.x, Π».Π°.y, Π».Π±.x, Π».Π±.y); } void Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ(ΠŸΡ€ΡΠΌΠΎΡƒΠ³ ΠΏ, int Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, int ΠΊΠΎΠ½Ρ‚ΡƒΡ€ = 0){ if(Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ & 0xFF){ Ρ†Π²Π΅Ρ‚_рисования(Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅); SDL_RenderFillRect(Ρ€Π΅Π½, &ΠΏ); } if(ΠΊΠΎΠ½Ρ‚ΡƒΡ€ & 0xFF){ Ρ†Π²Π΅Ρ‚_рисования(ΠΊΠΎΠ½Ρ‚ΡƒΡ€); SDL_RenderDrawRect(Ρ€Π΅Π½, &ΠΏ); } } void Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ(Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ, Π’ΠΎΡ‡ΠΊΠ° Ρ‚, ubyte ΠΎΡ‚Ρ€ = 0){ ΠŸΡ€ΡΠΌΠΎΡƒΠ³ ΠΏ = {Ρ‚, ΠΈ.ш, ΠΈ.Π²}; SDL_RenderCopyEx(Ρ€Π΅Π½, ΠΈ.тСкстура, null, &ΠΏ, 0, null, ΠΎΡ‚Ρ€); } bool Π²Ρ‹ΠΉΡ‚ΠΈ; void Π²Ρ‹Ρ…ΠΎΠ΄(){ Π²Ρ‹ΠΉΡ‚ΠΈ = Π΄Π°; } bool Ρ†ΠΈΠΊΠ»(){ SDL_RenderPresent(Ρ€Π΅Π½); SDL_SetRenderDrawColor(Ρ€Π΅Π½, 255, 255, 255, 255); SDL_RenderClear(Ρ€Π΅Π½); Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ с; ΠΌΡ‹ΡˆΠΊΠ°.Π»ΠΊΠΌ_ΠΊΠ»ΠΈΠΊ = Π½Π΅Ρ‚; ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΊΠΌ_ΠΊΠ»ΠΈΠΊ = Π½Π΅Ρ‚; ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° = ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°(); while(SDL_PollEvent(&с)){ if(с.Ρ‚ΠΈΠΏ == ВипБобытия.WindowEvent && с.window.event == WindowEvent.resized){ SDL_GetWindowSize(ΠΎΠΊΠ½ΠΎ, &ш, &Π²); } if(с.Ρ‚ΠΈΠΏ == ВипБобытия.Π²Ρ‹Ρ…ΠΎΠ΄ || Π²Ρ‹ΠΉΡ‚ΠΈ) return 0; if(с.Ρ‚ΠΈΠΏ == ВипБобытия.ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅_ΠΌΡ‹ΡˆΠΈ) ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΎΠ· = с.ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΎΠ·; if(с.Ρ‚ΠΈΠΏ == ВипБобытия.ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹_Π½Π°ΠΆΠ°Ρ‚Π°) ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°.ΠΊΠ½ΠΎΠΏΠΊΠΈ ~= cast(ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°.Кнопка)с.ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°.scancode; if(с.Ρ‚ΠΈΠΏ == ВипБобытия.Π²Π²ΠΎΠ΄_тСкста) ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°.Π²Π²ΠΎΠ΄ ~= с.тСкст.text.ptr.fromStringz; if(с.Ρ‚ΠΈΠΏ == ВипБобытия.ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΌΡ‹ΡˆΠΈ_Π½Π°ΠΆΠ°Ρ‚Π°){ if(с.ΠΌΡ‹ΡˆΠΊΠ°.ΠΊΠ½ΠΎΠΏΠΊΠ° == 1){ ΠΌΡ‹ΡˆΠΊΠ°.Π»ΠΊΠΌ = Π΄Π°; ΠΌΡ‹ΡˆΠΊΠ°.Π»ΠΊΠΌ_ΠΊΠ»ΠΈΠΊ = Π΄Π°; } if(с.ΠΌΡ‹ΡˆΠΊΠ°.ΠΊΠ½ΠΎΠΏΠΊΠ° == 3){ ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΊΠΌ = Π΄Π°; ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΊΠΌ_ΠΊΠ»ΠΈΠΊ = Π΄Π°; } } if(с.Ρ‚ΠΈΠΏ == ВипБобытия.ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΌΡ‹ΡˆΠΈ_ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°){ if(с.ΠΌΡ‹ΡˆΠΊΠ°.ΠΊΠ½ΠΎΠΏΠΊΠ° == 1) ΠΌΡ‹ΡˆΠΊΠ°.Π»ΠΊΠΌ = Π½Π΅Ρ‚; if(с.ΠΌΡ‹ΡˆΠΊΠ°.ΠΊΠ½ΠΎΠΏΠΊΠ° == 3) ΠΌΡ‹ΡˆΠΊΠ°.ΠΏΠΊΠΌ = Π½Π΅Ρ‚; } } return 1; } } struct ΠœΡ‹ΡˆΠΊΠ° { Π’ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ·; bool Π»ΠΊΠΌ, ΠΏΠΊΠΌ, Π»ΠΊΠΌ_ΠΊΠ»ΠΈΠΊ, ΠΏΠΊΠΌ_ΠΊΠ»ΠΈΠΊ; } struct ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° { Кнопка[] ΠΊΠ½ΠΎΠΏΠΊΠΈ; string Π²Π²ΠΎΠ΄; bool opDispatch(string стр)(){ return ΠΊΠ½ΠΎΠΏΠΊΠΈ.canFind(стр.to!Кнопка); } enum Кнопка { a = 4, b = 5, c = 6, d = 7, e = 8, f = 9, g = 10, h = 11, i = 12, j = 13, k = 14, l = 15, m = 16, n = 17, o = 18, p = 19, q = 20, r = 21, s = 22, t = 23, u = 24, v = 25, w = 26, x = 27, y = 28, z = 29, _1 = 30, _2 = 31, _3 = 32, _4 = 33, _5 = 34, _6 = 35, _7 = 36, _8 = 37, _9 = 38, _0 = 39, enter = 40, esc = 41, backspace = 42, tab = 43, ΠΏΡ€ΠΎΠ±Π΅Π» = 44, capslock = 57, f1 = 58, f2 = 59, f3 = 60, f4 = 61, f5 = 62, f6 = 63, f7 = 64, f8 = 65, f9 = 66, f10 = 67, f11 = 68, f12 = 69, lctrl = 224, lshift = 225, lalt = 226, lgui = 227, rctrl = 228, rshift = 229, ralt = 230, rgui = 231, printscreen = 70, scrolllock = 71, pause = 72, insert = 73, home = 74, pgup = 75, del = 76, end = 77, pgdn = 78, right = 79, left = 80, down = 81, up = 82, } } class Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ { SDL_Texture* тСкстура; int ш, Π²; this(Окно ΠΎ, string s){ void[] buf = s.read; SDL_Surface* sf = IMG_Load_RW(SDL_RWFromMem(buf.ptr, buf.length), 1); тСкстура = SDL_CreateTextureFromSurface(ΠΎ.Ρ€Π΅Π½, sf); ш = sf.ш; Π² = sf.Π²; SDL_FreeSurface(sf); } this(SDL_Texture* Ρ‚ΠΊ = null, int ш = 0, int Π² = 0){ this.тСкстура = Ρ‚ΠΊ; this.ш = ш; this.Π² = Π²; } ~this(){ SDL_DestroyTexture(тСкстура); } } auto тСкст(Окно ΠΎ, Π¨Ρ€ΠΈΡ„Ρ‚ ΡˆΡ€ΠΈΡ„Ρ‚, string тСкст, int Ρ†Π²Π΅Ρ‚ = 0xFFFFFFFF){ if(тСкст == ""){ return new Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅(); } SDL_Surface* sf = TTF_RenderUTF8_Solid(ΡˆΡ€ΠΈΡ„Ρ‚.font, тСкст.toStringz, Ρ†Π²Π΅Ρ‚); SDL_Texture* тСкстура = SDL_CreateTextureFromSurface(ΠΎ.Ρ€Π΅Π½, sf); auto ΠΈΠ·ΠΆ = new Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅(тСкстура, sf.ш, sf.Π²); SDL_FreeSurface(sf); return ΠΈΠ·ΠΆ; } auto тСкст(Окно ΠΎ, Π¨Ρ€ΠΈΡ„Ρ‚ ΡˆΡ€ΠΈΡ„Ρ‚, int Π½, string тСкст, int Ρ†Π²Π΅Ρ‚ = 0xFFFFFFFF){ if(тСкст == ""){ return new Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅(); } SDL_Surface* sf = TTF_RenderUTF8_Blended_Wrapped(ΡˆΡ€ΠΈΡ„Ρ‚.font, тСкст.toStringz, Ρ†Π²Π΅Ρ‚, Π½); SDL_Texture* тСкстура = SDL_CreateTextureFromSurface(ΠΎ.Ρ€Π΅Π½, sf); auto ΠΈΠ·ΠΆ = new Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅(тСкстура, sf.ш, sf.Π²); SDL_FreeSurface(sf); return ΠΈΠ·ΠΆ; } class Π—Π²ΡƒΠΊ { Mix_Chunk* m; this(string s){ void[] buf = s.read; m = Mix_LoadWAV_RW(SDL_RWFromMem(buf.ptr, buf.length), 1); } void Π·Π²ΡƒΡ‡Π°Ρ‚ΡŒ(){ Mix_PlayChannelTimed(-1, m, 0, 0); } } class ΠœΡƒΠ·Ρ‹ΠΊΠ° { Mix_Music* m; this(string s){ void[] buf = s.read; m = Mix_LoadMUS_RW(SDL_RWFromMem(buf.ptr, buf.length), 1); } void ΠΈΠ³Ρ€Π°Ρ‚ΡŒ(){ Mix_PlayMusic(m, -1); } } class Π¨Ρ€ΠΈΡ„Ρ‚ { int size; TTF_Font* font; this(string s, int size){ this.size = size; void[] buf = s.read; font = TTF_OpenFontRW(SDL_RWFromMem(buf.ptr, buf.length), 1, size); } // ~this(){ writeln(font); TTF_CloseFont(font); } } pragma(lib, "SDL2"); pragma(lib, "SDL2_image"); static this(){ SDL_Init(0b0100_0000_0011_0001); // timer audio video events IMG_Init(0b11); // png jpg bmp Mix_Init(0b11111); // FLUIDSYNTH OGG MP3 MODPLUG MOD FLAC Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 4096); TTF_Init(); } static ~this(){ IMG_Quit(); TTF_Quit(); Mix_Quit(); SDL_Quit(); } struct RWops; extern(C){ int SDL_Init(uint); void SDL_Quit(); int IMG_Init(int); int IMG_Quit(); int SDL_InitSubSystem(uint); void SDL_QuitSubSystem(uint); RWops* SDL_RWFromMem(void*, int); SDL_Surface* IMG_Load_RW(RWops*, int); int IMG_SavePNG_RW(SDL_Surface*, RWops*, int); char* SDL_GetError(); int SDL_PollEvent(Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅*); void SDL_FreeSurface(SDL_Surface*); int SDL_SetClipboardText(char*); char* SDL_GetClipboardText(); bool SDL_HasClipboardText(); } enum ВипБобытия { Π²Ρ‹Ρ…ΠΎΠ΄ = 0x100, APP_TERMINATING, APP_LOWMEMORY, APP_WILLENTERBACKGROUND, APP_DIDENTERBACKGROUND, APP_WILLENTERFOREGROUND, APP_DIDENTERFOREGROUND, WindowEvent = 0x200, SysWmEvent, ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹_Π½Π°ΠΆΠ°Ρ‚Π° = 0x300, ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹_ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°, TEXTEDITING, Π²Π²ΠΎΠ΄_тСкста, KEYMAPCHANGED, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅_ΠΌΡ‹ΡˆΠΈ = 0x400, ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΌΡ‹ΡˆΠΈ_Π½Π°ΠΆΠ°Ρ‚Π°, ΠΊΠ½ΠΎΠΏΠΊΠ°_ΠΌΡ‹ΡˆΠΈ_ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°, MouseWhell, CLIPBOARDUPDATE = 0x900, DROPFILE = 0x1000, AUDIODEVICEADDED = 0x1100, AUDIODEVICEREMOVED, RENDER_TARGETS_RESET = 0x2000, RENDER_DEVICE_RESET = 0x2001, USEREVENT = 0x8000 } struct Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ { ВипБобытия Ρ‚ΠΈΠΏ; uint timestamp; union{ SDL_WindowEvent window; SDL_KeyboardEvent ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°; SDL_TextEditingEvent edit; SDL_TextInputEvent тСкст; SDL_MouseEvent ΠΌΡ‹ΡˆΠΊΠ°; SDL_MouseWheelEvent wheel; SDL_AudioDeviceEvent adevice; SDL_UserEvent user; SDL_TouchFingerEvent finger; SDL_MultiGestureEvent gesture; SDL_DropEvent drop; } } enum WindowEvent : ubyte { none, shown, hidden, exposed, moved, resized, size_changed, minimized, maximized, restored, enter, leave, focus_gained, focus_lost, close } struct SDL_WindowEvent { uint windowID; WindowEvent event; ubyte padding1; ubyte padding2; ubyte padding3; int data1; int data2; } struct SDL_KeyboardEvent { uint windowID; ubyte state; ubyte repeat; ubyte padding2; ubyte padding3; int scancode; int keycode; ushort mod; uint unicode; } struct SDL_TextEditingEvent { uint windowID; char[32] text; int start; int length; } struct SDL_TextInputEvent { uint windowID; char[32] text; } struct SDL_MouseEvent { uint windowID; uint which; ubyte ΠΊΠ½ΠΎΠΏΠΊΠ°; ubyte state2; ubyte clicks; ubyte padding1; Π’ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ·; Π’ΠΎΡ‡ΠΊΠ° rel; } struct SDL_MouseWheelEvent { uint windowID; uint which; Π’ΠΎΡ‡ΠΊΠ° pos; uint direction; } struct SDL_ControllerDeviceEvent { int which; } struct SDL_AudioDeviceEvent { uint which; ubyte iscapture; ubyte padding1; ubyte padding2; ubyte padding3; } struct SDL_TouchFingerEvent { long touchId; long fingerId; float x, y; float dx, dy; float pressure; } struct SDL_MultiGestureEvent { long touchId; float dTheta; float dDist; float x, y; ushort numFingers; ushort padding; } struct SDL_DropEvent { char* file; } struct SDL_UserEvent { uint windowID; int code; void* data1; void* data2; } extern(C){ int SDL_GetNumRenderDrivers(); int SDL_GetRenderDriverInfo(int, SDL_RendererInfo*); int SDL_CreateWindowAndRenderer(int, int, uint, SDL_Window**, SDL_Renderer**); SDL_Renderer* SDL_CreateRenderer(SDL_Window*, int, uint); SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface*); SDL_Renderer* SDL_GetRenderer(SDL_Window*); int SDL_GetRendererInfo(SDL_Renderer*, SDL_RendererInfo*); int SDL_GetRendererOutputSize(SDL_Renderer*, int*, int*); SDL_Texture* SDL_CreateTexture(SDL_Renderer*, uint, int, int, int); SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer*, SDL_Surface*); int SDL_QueryTexture(SDL_Texture*, uint*, int*, int*, int*); int SDL_SetTextureColorMod(SDL_Texture*, ubyte, ubyte, ubyte); int SDL_GetTextureColorMod(SDL_Texture*, ubyte*, ubyte*, ubyte*); int SDL_SetTextureAlphaMod(SDL_Texture*, ubyte); int SDL_GetTextureAlphaMod(SDL_Texture*, ubyte*); int SDL_SetTextureBlendMode(SDL_Texture*, BlendMode); int SDL_GetTextureBlendMode(SDL_Texture*, BlendMode*); int SDL_UpdateTexture(SDL_Texture*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, void*, int); int SDL_UpdateYUVTexture(SDL_Texture*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, ubyte*, int, ubyte*, int, ubyte*, int); int SDL_LockTexture(SDL_Texture*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, void**, int*); int SDL_UnlockTexture(SDL_Texture*); bool SDL_RenderTargetSupported(SDL_Renderer*); int SDL_SetRenderTarget(SDL_Renderer*, SDL_Texture*); SDL_Texture* SDL_GetRenderTarget(SDL_Renderer*); int SDL_RenderSetClipRect(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); void SDL_RenderGetClipRect(SDL_Renderer* renderer, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); int SDL_RenderSetLogicalSize(SDL_Renderer*, int, int); void SDL_RenderGetLogicalSize(SDL_Renderer*, int*, int*); int SDL_RenderSetViewport(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); void SDL_RenderGetViewport(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); bool SDL_RenderIsClipEnabled(SDL_Renderer*); int SDL_RenderSetScale(SDL_Renderer*, float, float); int SDL_RenderGetScale(SDL_Renderer*, float*, float*); int SDL_SetRenderDrawColor(SDL_Renderer*, ubyte, ubyte, ubyte, ubyte); int SDL_GetRenderDrawColor(SDL_Renderer*, ubyte*, ubyte*, ubyte*, ubyte*); int SDL_SetRenderDrawBlendMode(SDL_Renderer*, BlendMode); int SDL_GetRenderDrawBlendMode(SDL_Renderer*, BlendMode*); int SDL_RenderClear(SDL_Renderer*); int SDL_RenderDrawPoint(SDL_Renderer*, int, int); int SDL_RenderDrawPoints(SDL_Renderer*, Π’ΠΎΡ‡ΠΊΠ°*, int); int SDL_RenderDrawLine(SDL_Renderer*, int, int, int, int); int SDL_RenderDrawLines(SDL_Renderer*, Π’ΠΎΡ‡ΠΊΠ°*, int); int SDL_RenderDrawRect(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); int SDL_RenderDrawRects(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, int); int SDL_RenderFillRect(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); int SDL_RenderFillRects(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, int); int SDL_RenderCopy(SDL_Renderer*, SDL_Texture*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); int SDL_RenderCopyEx(SDL_Renderer*, SDL_Texture*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, double, Π’ΠΎΡ‡ΠΊΠ°*, ubyte); int SDL_RenderReadPixels(SDL_Renderer*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, uint, void*, int); void SDL_RenderPresent(SDL_Renderer*); void SDL_DestroyTexture(SDL_Texture*); void SDL_DestroyRenderer(SDL_Renderer*); int SDL_GL_BindTexture(SDL_Texture*, float*, float*); int SDL_GL_UnbindTexture(SDL_Texture*); } struct SDL_RendererInfo { char* name; uint flags; uint num_texture_formats; uint[16] texture_formats; int max_texture_width; int max_texture_height; } enum TextureAccess { Static, streaming, target } enum TextureModulate { none, color, alpha } struct SDL_Renderer; struct SDL_Texture; struct BlendMode { mixin(bitfields!( bool, "blend", 1, bool, "add", 1, bool, "mod", 1, uint, "", 29 )); } struct SDL_BlitMap; struct SDL_PixelFormat; struct SDL_Surface { uint flags; SDL_PixelFormat* format; int ш, Π²; int pitch; void* пиксСли; void* userdata; int locked; void* lock_data; ΠŸΡ€ΡΠΌΠΎΡƒΠ³ clip_rect; SDL_BlitMap* map; int refcount; } extern(C){ int SDL_GetNumVideoDrivers(); char* SDL_GetVideoDriver(int); int SDL_VideoInit(char*); void SDL_VideoQuit(); char* SDL_GetCurrentVideoDriver(); int SDL_GetNumVideoDisplays(); char* SDL_GetDisplayName(int); int SDL_GetDisplayBounds(int, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*); int SDL_GetDisplayDPI(int, float*, float*, float*); int SDL_GetNumDisplayModes(int); int SDL_GetDisplayMode(int, int, DisplayMode*); int SDL_GetDesktopDisplayMode(int, DisplayMode*); int SDL_GetCurrentDisplayMode(int, DisplayMode*); DisplayMode* SDL_GetClosestDisplayMode(int, DisplayMode*, DisplayMode*); int SDL_GetWindowDisplayIndex(SDL_Window*); int SDL_SetWindowDisplayMode(SDL_Window*, DisplayMode*); int SDL_GetWindowDisplayMode(SDL_Window*, DisplayMode*); uint SDL_GetWindowPixelFormat(SDL_Window*); SDL_Window* SDL_CreateWindow(immutable(char)*, int, int, int, int, uint); SDL_Window* SDL_CreateWindowFrom(void*); uint SDL_GetWindowID(SDL_Window*); SDL_Window* SDL_GetWindowFromID(uint); uint SDL_GetWindowFlags(SDL_Window*); void SDL_SetWindowTitle(SDL_Window*, immutable(char)*); char* SDL_GetWindowTitle(SDL_Window*); void SDL_SetWindowIcon(SDL_Window*, SDL_Surface*); void* SDL_SetWindowData(SDL_Window*, char*, void*); void* SDL_GetWindowData(SDL_Window*, char*); void SDL_SetWindowPosition(SDL_Window*, int, int); void SDL_GetWindowPosition(SDL_Window*, int*, int*); void SDL_SetWindowSize(SDL_Window*, int, int); void SDL_GetWindowSize(SDL_Window*, int*, int*); void SDL_SetWindowMinimumSize(SDL_Window*, int, int); void SDL_GetWindowMinimumSize(SDL_Window*, int*, int*); void SDL_SetWindowMaximumSize(SDL_Window*, int, int); void SDL_GetWindowMaximumSize(SDL_Window*, int*, int*); void SDL_SetWindowBordered(SDL_Window*, bool); void SDL_ShowWindow(SDL_Window*); void SDL_HideWindow(SDL_Window*); void SDL_RaiseWindow(SDL_Window*); void SDL_MaximizeWindow(SDL_Window*); void SDL_MinimizeWindow(SDL_Window*); void SDL_RestoreWindow(SDL_Window*); int SDL_SetWindowFullscreen(SDL_Window*, uint); SDL_Surface* SDL_GetWindowSurface(SDL_Window*); int SDL_UpdateWindowSurface(SDL_Window*); int SDL_UpdateWindowSurfaceRects(SDL_Window*, ΠŸΡ€ΡΠΌΠΎΡƒΠ³*, int); void SDL_SetWindowGrab(SDL_Window*, bool); bool SDL_GetWindowGrab(SDL_Window*); SDL_Window* SDL_GetGrabbedWindow(); int SDL_SetWindowBrightness(SDL_Window*, float); float SDL_GetWindowBrightness(SDL_Window*); int SDL_SetWindowGammaRamp(SDL_Window*, ushort*, ushort*, ushort*, ushort*); int SDL_GetWindowGammaRamp(SDL_Window*, ushort*, ushort*, ushort*, ushort*); int SDL_SetWindowHitTest(SDL_Window*, HitTest, void*); void SDL_DestroyWindow(SDL_Window*); bool SDL_IsScreenSaverEnabled(); void SDL_EnableScreenSaver(); void SDL_DisableScreenSaver(); int SDL_GL_LoadLibrary(char*); void* SDL_GL_GetProcAddress(char*); void SDL_GL_UnloadLibrary(); bool SDL_GL_ExtensionSupported(char*); void SDL_GL_ResetAttributes(); int SDL_GL_SetAttribute(GLattr, int); int SDL_GL_GetAttribute(GLattr, int*); GLContext SDL_GL_CreateContext(SDL_Window*); int SDL_GL_MakeCurrent(SDL_Window*, GLContext); SDL_Window* SDL_GL_GetCurrentWindow(); GLContext SDL_GL_GetCurrentContext(); void SDL_GL_GetDrawableSize(SDL_Window*, int*, int*); int SDL_GL_SetSwapInterval(int); int SDL_GL_GetSwapInterval(); void SDL_GL_SwapWindow(SDL_Window*); void SDL_GL_DeleteContext(GLContext); } struct DisplayMode { uint Ρ„ΠΎΡ€ΠΌΠ°Ρ‚; int ш, Π², ΠΊ; void* Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€; } struct SDL_Window; //struct ΠΠ°ΡΡ‚Ρ€ΠΎΠΉΠΊΠΈΠžΠΊΠ½Π° { // bool fullscreen, opengl, shown, hidden, borderless, resizable, minimized, maximized, // input_grabbed, input_focus, mouse_focus, foreign, desktop, allow_highdpi, mouse_capture; //} //struct RendererFlags { bool software, accelerated, vsync, targettexture; } enum WindowEventID { none, shown, hidden, exposed, moved, resized, size_changed, minimized, maximized, restored, enter, leave, focus_gained, focus_lost, close } alias GLContext = void*; enum GLattr { RED_SIZE, GREEN_SIZE, BLUE_SIZE, ALPHA_SIZE, BUFFER_SIZE, DOUBLEBUFFER, DEPTH_SIZE, STENCIL_SIZE, ACCUM_RED_SIZE, ACCUM_GREEN_SIZE, ACCUM_BLUE_SIZE, ACCUM_ALPHA_SIZE, STEREO, MULTISAMPLEBUFFERS, MULTISAMPLESAMPLES, ACCELERATED_VISUAL, RETAINED_BACKING, CONTEXT_MAJOR_VERSION, CONTEXT_MINOR_VERSION, CONTEXT_EGL, CONTEXT_FLAGS, CONTEXT_PROFILE_MASK, SHARE_WITH_CURRENT_CONTEXT, FRAMEBUFFER_SRGB_CAPABLE, CONTEXT_RELEASE_BEHAVIOR } enum GLprofile { CORE = 0x0001, COMPATIBILITY = 0x0002, ES = 0x0004, } enum GLcontextFlag { DEBUG = 0x0001, FORWARD_COMPATIBLE = 0x0002, ROBUST_ACCESS = 0x0004, RESET_ISOLATION = 0x0008, } enum GLcontextReleaseFlag { none = 0, flush = 1 } enum HitTestResult { NORMAL, DRAGGABLE, RESIZE_TOPLEFT, RESIZE_TOP, RESIZE_TOPRIGHT, RESIZE_RIGHT, RESIZE_BOTTOMRIGHT, RESIZE_BOTTOM, RESIZE_BOTTOMLEFT, RESIZE_LEFT, } alias HitTest = HitTestResult function(SDL_Window*, Π’ΠΎΡ‡ΠΊΠ°*, void*); pragma(lib, "SDL2_mixer"); extern(C){ // SDL_version* Mix_Linked_Version(); int Mix_Init(int); void Mix_Quit(); int Mix_OpenAudio (int, ushort, int, int); int Mix_AllocateChannels(int); int Mix_QuerySpec(int*, ushort*, int*); Mix_Chunk* Mix_LoadWAV_RW(RWops*, int); Mix_Music* Mix_LoadMUS(char*); Mix_Music* Mix_LoadMUS_RW(RWops*, int); Mix_Music* Mix_LoadMUSType_RW(RWops*, MusicType, int); Mix_Chunk* Mix_QuickLoad_WAV(ubyte*); Mix_Chunk* Mix_QuickLoad_RAW(ubyte*, uint); void Mix_FreeChunk(Mix_Chunk*); void Mix_FreeMusic(Mix_Music*); int Mix_GetNumChunkDecoders(); char* Mix_GetChunkDecoder(int); int Mix_GetNumMusicDecoders(); char* Mix_GetMusicDecoder(int); MusicType Mix_GetMusicType(Mix_Music*); void Mix_SetPostMix(void function(void*, ubyte*, int), void*); void Mix_HookMusic(void function(void*, ubyte*, int), void*); void Mix_HookMusicFinished(void function()); void* Mix_GetMusicHookData(); void Mix_ChannelFinished(void function(int channel)); int Mix_RegisterEffect(int, Mix_EffectFunc_t, Mix_EffectDone_t, void*); int Mix_UnregisterEffect(int, Mix_EffectFunc_t); int Mix_UnregisterAllEffects(int); int Mix_SetPanning(int, ubyte, ubyte); int Mix_SetPosition(int, short, ubyte); int Mix_SetDistance(int, ubyte); // int Mix_SetReverb(int, ubyte); int Mix_SetReverseStereo(int, int); int Mix_ReserveChannels(int); int Mix_GroupChannel(int, int); int Mix_GroupChannels(int, int, int); int Mix_GroupAvailable(int); int Mix_GroupCount(int); int Mix_GroupOldest(int); int Mix_GroupNewer(int); int Mix_PlayChannelTimed(int, Mix_Chunk*, int, int); int Mix_PlayMusic(Mix_Music*, int); int Mix_FadeInMusic(Mix_Music*, int, int); int Mix_FadeInMusicPos(Mix_Music*, int, int, double); int Mix_FadeInChannelTimed(int, Mix_Chunk*, int, int, int); int Mix_Volume(int, int); int Mix_VolumeChunk(Mix_Chunk*, int); int Mix_VolumeMusic(int); int Mix_HaltChannel(int); int Mix_HaltGroup(int); int Mix_HaltMusic(); int Mix_ExpireChannel(int, int); int Mix_FadeOutChannel(int, int); int Mix_FadeOutGroup(int, int); int Mix_FadeOutMusic(int); Fading Mix_FadingMusic(); Fading Mix_FadingChannel(int); void Mix_Pause(int); void Mix_Resume(int); int Mix_Paused(int); void Mix_PauseMusic(); void Mix_ResumeMusic(); void Mix_RewindMusic(); int Mix_PausedMusic(); int Mix_SetMusicPosition(double); int Mix_Playing(int); int Mix_PlayingMusic(); int Mix_SetMusicCMD(in char*); int Mix_SetSynchroValue(int); int Mix_GetSynchroValue(); Mix_Chunk* Mix_GetChunk(int); void Mix_CloseAudio(); } enum { MIX_CHANNELS = 8, MIX_DEFAULT_FREQUENCY = 22050, MIX_DEFAULT_CHANNELS = 2, MIX_MAX_VOLUME = 128, MIX_CHANNEL_POST = -2, } version(LittleEndian){ enum MIX_DEFAULT_FORMAT = 0x8010; }else{ enum MIX_DEFAULT_FORMAT = 0x9010; } struct Mix_Chunk { int allocated; ubyte* abuf; uint alen; ubyte volume; } enum Fading { No, Out, In } enum MusicType { none, cmd, wav, mod, mid, ogg, mp3, mp3_mad, flac, modplug } struct Mix_Music; string MIX_EFFECTSMAXSPEED = "MIX_EFFECTSMAXSPEED"; alias Mix_EffectFunc_t = void function(int chan, void* stream, int len, void* udata); alias Mix_EffectDone_t = void function(int chan, void* udata); pragma(lib, "SDL2_ttf"); private alias Π¦Π²Π΅Ρ‚ = uint; struct TTF_Font; // enum UNICODE_BOM { NATIVE = 0xFEFF, SWAPPED = 0xFFFE } struct Style { mixin(bitfields!( bool, "bold", 1, bool, "italic", 1, bool, "underline", 1, bool, "strikethrough", 1, uint, "", 28 )); } enum Hinting { normal = 0, light = 1, mono = 2, none = 3 } extern(C){ void TTF_ByteSwappedUNICODE(int); int TTF_Init(); // TTF_Font* TTF_OpenFont(char*, int); TTF_Font* TTF_OpenFontIndex(char*, int, long ); TTF_Font* TTF_OpenFontRW(RWops*, int, int); TTF_Font* TTF_OpenFontIndexRW(RWops*, int, int, long); int TTF_GetFontStyle(TTF_Font*); void TTF_SetFontStyle(TTF_Font*, int style); int TTF_GetFontOutline(TTF_Font*); void TTF_SetFontOutline(TTF_Font*, int); int TTF_GetFontHinting(TTF_Font*); void TTF_SetFontHinting(TTF_Font*, int); int TTF_FontHeight(TTF_Font*); int TTF_FontAscent(TTF_Font*); int TTF_FontDescent(TTF_Font*); int TTF_FontLineSkip(TTF_Font*); int TTF_GetFontKerning(TTF_Font*); void TTF_SetFontKerning(TTF_Font*, int); int TTF_FontFaces(TTF_Font*); int TTF_FontFaceIsFixedWidth(TTF_Font*); char* TTF_FontFaceFamilyName(TTF_Font*); char* TTF_FontFaceStyleName(TTF_Font*); int TTF_GlyphIsProvided(TTF_Font*, ushort); int TTF_GlyphMetrics(TTF_Font*, ushort, int*, int*, int*, int*, int*); SDL_Surface* TTF_RenderUTF8_Solid(TTF_Font*, immutable(char)*, Π¦Π²Π΅Ρ‚); SDL_Surface* TTF_RenderUTF8_Shaded(TTF_Font*, char*, Π¦Π²Π΅Ρ‚, Π¦Π²Π΅Ρ‚); SDL_Surface* TTF_RenderUTF8_Blended(TTF_Font*, char*, Π¦Π²Π΅Ρ‚); SDL_Surface* TTF_RenderUTF8_Blended_Wrapped(TTF_Font*, immutable(char)*, Π¦Π²Π΅Ρ‚, uint); int TTF_SizeUTF8(TTF_Font*, char*, int*, int*); // int TTF_SizeText(TTF_Font*, char*, int*, int*); // int TTF_SizeUNICODE(TTF_Font*, ushort*, int*, int*); // SDL_Surface* TTF_RenderText_Solid(TTF_Font*, char*, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderUNICODE_Solid(TTF_Font*, ushort*, Π¦Π²Π΅Ρ‚); SDL_Surface* TTF_RenderGlyph_Solid(TTF_Font*, ushort, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderText_Shaded(TTF_Font*, char*, Π¦Π²Π΅Ρ‚, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderUNICODE_Shaded(TTF_Font*, ushort*, Π¦Π²Π΅Ρ‚, Π¦Π²Π΅Ρ‚); SDL_Surface* TTF_RenderGlyph_Shaded(TTF_Font*, ushort, Π¦Π²Π΅Ρ‚, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderText_Blended(TTF_Font*, char*, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderUNICODE_Blended(TTF_Font*, ushort*, Π¦Π²Π΅Ρ‚); // SDL_Surface* TTF_RenderText_Blended_Wrapped(TTF_Font*, char*, Π¦Π²Π΅Ρ‚, uint); // SDL_Surface* TTF_RenderUNICODE_Blended_Wrapped(TTF_Font*, ushort*, Π¦Π²Π΅Ρ‚, uint); SDL_Surface* TTF_RenderGlyph_Blended(TTF_Font*, ushort, Π¦Π²Π΅Ρ‚); void TTF_CloseFont(TTF_Font*); void TTF_Quit(); int TTF_WasInit(); int TTF_GetFontKerningSize(TTF_Font*,int,int); } enum Π΄Π° = true, Π½Π΅Ρ‚ = false; struct Π’ΠΎΡ‡ΠΊΠ° { int x, y; auto opAdd(Π’ΠΎΡ‡ΠΊΠ° b){ return Π’ΠΎΡ‡ΠΊΠ°(x + bx, y + by); } auto opSub(Π’ΠΎΡ‡ΠΊΠ° b){ return Π’ΠΎΡ‡ΠΊΠ°(x - bx, y - by); } auto opDiv(int Π½){ return Π’ΠΎΡ‡ΠΊΠ°(x/Π½, y/Π½); } auto opMul(int Π½){ return Π’ΠΎΡ‡ΠΊΠ°(x*Π½, y*Π½); } void opOpAssign(string op, T)(T n){ this = mixin("this " ~ op ~ " n"); } bool opIn(ΠšΡ€ΡƒΠ³ ΠΊ){ return ((x - ΠΊ.ΠΏΠΎΠ·.x)^^2 + (y - ΠΊ.ΠΏΠΎΠ·.y)^^2)^^0.5 < ΠΊ.Ρ€; } bool opIn(ΠŸΡ€ΡΠΌΠΎΡƒΠ³ ΠΏ){ return ΠΏ.ΠΏΠΎΠ·.x <= x && x <= ΠΏ.ΠΏΠΎΠ·.x + ΠΏ.ш && ΠΏ.ΠΏΠΎΠ·.y <= y && y <= ΠΏ.ΠΏΠΎΠ·.y + ΠΏ.Π²; } } struct Π’Π΅ΠΊΡ‚ΠΎΡ€ { int x, y; this(int x, int y){ this.x = x; this.y = y; } this(Π’ΠΎΡ‡ΠΊΠ° Π°, Π’ΠΎΡ‡ΠΊΠ° Π±){ x = Π±.x - Π°.x; y = Π±.y - Π°.y; } auto opAdd(Π’Π΅ΠΊΡ‚ΠΎΡ€ b){ return Π’Π΅ΠΊΡ‚ΠΎΡ€(x + bx, y + by); } auto opSub(Π’Π΅ΠΊΡ‚ΠΎΡ€ b){ return Π’Π΅ΠΊΡ‚ΠΎΡ€(x - bx, y - by); } auto opDiv(int n){ return Π’Π΅ΠΊΡ‚ΠΎΡ€(x/n, y/n); } auto opMul(int n){ return Π’Π΅ΠΊΡ‚ΠΎΡ€(x*n, y*n); } void opOpAssign(string op, T)(T n){ this = mixin("this " ~ op ~ " n"); } int Π΄Π»ΠΈΠ½Π°(){ return cast(int)(x^^2 + y^^2)^^0.5; } } struct Линия { Π’ΠΎΡ‡ΠΊΠ° Π°, Π±; } struct ΠšΡ€ΡƒΠ³ { Π’ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ·; int Ρ€; } struct ΠŸΡ€ΡΠΌΠΎΡƒΠ³ { Π’ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ·; int ш, Π²; } bool ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ»ΠΈΡΡŒ(ΠŸΡ€ΡΠΌΠΎΡƒΠ³ Π°, ΠŸΡ€ΡΠΌΠΎΡƒΠ³ Π±){ return (Π°.ΠΏΠΎΠ·.x <= Π°.ΠΏΠΎΠ·.x + Π°.ш && Π±.ΠΏΠΎΠ·.x <= Π±.ΠΏΠΎΠ·.x + Π±.ш) && (Π°.ΠΏΠΎΠ·.y <= Π°.ΠΏΠΎΠ·.y + Π°.Π² && Π±.ΠΏΠΎΠ·.y <= Π±.ΠΏΠΎΠ·.y + Π±.Π²); } 
      • 3
        How does this code answer the question? - Nick Volynkin ♦