Mercurial > touhou
diff pytouhou/lib/sdl.pyx @ 418:63f59be04a54
Replace Pyglet with SDL2 for window creation and events; disables framerate control/display and sound.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Tue, 16 Jul 2013 21:07:15 +0200 |
parents | |
children | 1c92721f8e49 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/pytouhou/lib/sdl.pyx @@ -0,0 +1,96 @@ +# -*- encoding: utf-8 -*- +## +## Copyright (C) 2013 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published +## by the Free Software Foundation; version 3 only. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## + +INIT_VIDEO = SDL_INIT_VIDEO + +GL_CONTEXT_MAJOR_VERSION = SDL_GL_CONTEXT_MAJOR_VERSION +GL_CONTEXT_MINOR_VERSION = SDL_GL_CONTEXT_MINOR_VERSION +GL_DOUBLEBUFFER = SDL_GL_DOUBLEBUFFER +GL_DEPTH_SIZE = SDL_GL_DEPTH_SIZE + +WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED +WINDOW_OPENGL = SDL_WINDOW_OPENGL +WINDOW_SHOWN = SDL_WINDOW_SHOWN + +SCANCODE_Z = SDL_SCANCODE_Z +SCANCODE_X = SDL_SCANCODE_X +SCANCODE_LSHIFT = SDL_SCANCODE_LSHIFT +SCANCODE_UP = SDL_SCANCODE_UP +SCANCODE_DOWN = SDL_SCANCODE_DOWN +SCANCODE_LEFT = SDL_SCANCODE_LEFT +SCANCODE_RIGHT = SDL_SCANCODE_RIGHT +SCANCODE_LCTRL = SDL_SCANCODE_LCTRL +SCANCODE_ESCAPE = SDL_SCANCODE_ESCAPE + +KEYDOWN = SDL_KEYDOWN +QUIT = SDL_QUIT + + +class SDLError(Exception): + pass + + +cdef class Window: + cdef SDL_Window *window + cdef SDL_GLContext context + + def __init__(self, const char *title, int x, int y, int w, int h, Uint32 flags): + self.window = SDL_CreateWindow(title, x, y, w, h, flags) + if self.window == NULL: + raise SDLError(SDL_GetError()) + + def destroy_window(self): + SDL_DestroyWindow(self.window) + + def gl_create_context(self): + self.context = SDL_GL_CreateContext(self.window) + + def gl_swap_window(self): + SDL_GL_SwapWindow(self.window) + + def gl_delete_context(self): + SDL_GL_DeleteContext(self.context) + + +def init(Uint32 flags): + if SDL_Init(flags) < 0: + raise SDLError(SDL_GetError()) + + +def quit(): + SDL_Quit() + + +def gl_set_attribute(SDL_GLattr attr, int value): + if SDL_GL_SetAttribute(attr, value) < 0: + raise SDLError(SDL_GetError()) + + +def poll_events(): + cdef SDL_Event event + ret = [] + while SDL_PollEvent(&event): + if event.type == SDL_KEYDOWN: + ret.append((event.type, event.key.keysym.scancode)) + elif event.type == SDL_QUIT: + ret.append((event.type,)) + return ret + + +def get_keyboard_state(): + cdef int numkeys + cdef bint k + cdef const Uint8 *state + state = SDL_GetKeyboardState(&numkeys) + return tuple([k is not False for k in state[:numkeys]])