public CartConsoleInput(char Chr, KeyCode Key, bool Ctrl = false, bool Shift = false, bool Alt = false) { this.Chr = Chr; this.Key = Key; this.Ctrl = Ctrl; this.Alt = Alt; this.Shift = Shift; }
private static unsafe void Main() { if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO) != 0) throw new Exception(SDL.SDL_GetError()); if (SDLi.IMG_Init(SDLi.IMG_InitFlags.IMG_INIT_PNG) == 0) throw new Exception(SDL.SDL_GetError()); CreateSDL(); Open = true; Initialized = true; bool Changed = false; SWatch.Start(); while (Open) { while (SDL.SDL_PollEvent(out Event) != 0) { switch (Event.type) { case SDL.SDL_EventType.SDL_QUIT: Open = false; break; case SDL.SDL_EventType.SDL_TEXTINPUT: fixed (byte* T = Event.text.text) { char Chr = (char)T[0]; InputQueue.Enqueue(new CartConsoleInput(Chr, KC, Ctrl, Shift, Alt)); } break; case SDL.SDL_EventType.SDL_KEYDOWN: { KeyCode KC = Event.key.keysym.sym; if ((KC == KeyCode.SDLK_LCTRL) || (KC == KeyCode.SDLK_RCTRL)) Ctrl = true; if ((KC == KeyCode.SDLK_LALT) || (KC == SDL.SDL_Keycode.SDLK_RALT)) Alt = true; if ((KC == KeyCode.SDLK_LSHIFT) || (KC == KeyCode.SDLK_RSHIFT)) Shift = true; CartConsole.KC = KC; switch (KC) { case KeyCode.SDLK_UP: case KeyCode.SDLK_DOWN: case KeyCode.SDLK_LEFT: case KeyCode.SDLK_RIGHT: case KeyCode.SDLK_RETURN: case KeyCode.SDLK_RETURN2: case KeyCode.SDLK_BACKSPACE: InputQueue.Enqueue(new CartConsoleInput('\n', KC, Ctrl, Shift, Alt)); break; default: break; } break; } case SDL.SDL_EventType.SDL_KEYUP: { KeyCode KC = Event.key.keysym.sym; if ((KC == KeyCode.SDLK_LCTRL) || (KC == KeyCode.SDLK_RCTRL)) Ctrl = false; if ((KC == KeyCode.SDLK_LALT) || (KC == KeyCode.SDLK_RALT)) Alt = false; if ((KC == KeyCode.SDLK_LSHIFT) || (KC == KeyCode.SDLK_RSHIFT)) Shift = false; break; } default: break; } } if (ReloadSDL) { ReloadSDL = false; CreateSDL(); } SDL.SDL_SetRenderDrawBlendMode(Rend, SDL.SDL_BlendMode.SDL_BLENDMODE_BLEND); byte CurChar = 0; if (DoRefresh) { DoRefresh = Changed = false; for (int i = 0; i < TEXT.Length; i++) { if (!DIRTY[i]) continue; DIRTY[i] = false; Changed = true; POS.x = (i % W) * CharW; POS.y = (i / W) * CharH; CurChar = (byte)TEXT[i]; TEXPOS.x = (CurChar % CharCountX) * CharW; TEXPOS.y = (CurChar / CharCountY) * CharH; fixed (void* TP = &TEXPOS, P = &POS) { SDL.SDL_SetRenderDrawColor(Rend, BACK_C[i].r, BACK_C[i].g, BACK_C[i].b, BACK_C[i].a); SDL.SDL_RenderFillRect(Rend, ref POS); SDL.SDL_SetTextureColorMod(FontTex, FORE_C[i].r, FORE_C[i].g, FORE_C[i].b); SDL.SDL_SetTextureAlphaMod(FontTex, FORE_C[i].a); SDL.SDL_RenderCopy(Rend, FontTex, new IntPtr(TP), new IntPtr(P)); } } if (Changed) SDL.SDL_RenderPresent(Rend); } SDL.SDL_Delay(10); SWatch.Stop(); FrameTime = SWatch.ElapsedMilliseconds; SWatch.Restart(); if (FontDirty) { FontDirty = false; SetFont(CartConsole.FontPath, CharCountX, CharCountY); } } SDL.SDL_DestroyRenderer(Rend); SDL.SDL_DestroyWindow(Wind); Environment.Exit(0); }