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?
3 answers
When I was tinkering with Di, I used Derelict . What is the support at the moment - HZ.
|
|
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 + Π±.Π²); }
- 3How does this code answer the question? - Nick Volynkin β¦
|