pysdl2やってみる

PyGameがなんかpython3とか64bit対応してないなぁと思ったら[開発終了](http://jum12.hatenablog.com/entry/2013/10/16/211017)しているらしい。
で、[サイト](http://www.pygame.org/hifi.html)を見に行ってみると一見生きているように見えるのだが、
最新版が
1.9.1 Packages (August 6th 2009)
なので、まぁそうなのかという感じである。

後継らしい[PySDL2](http://pysdl2.readthedocs.io/en/latest/)をやってみる。
SDL2のctypesラッパーらしいのでビルドしなくてもさくっと動くのではないかと期待。

# 実行環境
## DownloadしてExamples
環境は、Anaconda版のPython3.5(64bit) on Windows。

```
> cd PySDL2-0.9.3
> C:\Anaconda3\python.exe setup.py install
> cd examples
> C:\Anaconda3\python.exe sdl2hello.py
```
SDL2が見つからないエラーが出る。

https://www.libsdl.org/download-2.0.php
からSDL2のdllを入手。
環境変数PYSDL2_DLL_PATHがdllのディレクトリを指すようにセット。

再度

```
> C:\Anaconda3\python.exe sdl2hello.py
```

動いた。
しかし、他のSDL_gfxを使っているサンプルが動かぬ。

## SDL_gfx
* http://www.ferzkopp.net/wordpress/2016/01/02/sdl_gfx-sdl2_gfx/

dll無いな・・・。
よし、全部ビルドしよう。

## SDL2一式ビルドする
ビルドした。
ビルドスクリプト。

* https://github.com/ousttrue/SDLpremake5

# helloworld.pyとsdl2hello.py
examplesに実行結果が同じhelloworld.pyとsdl2hello.pyがある。

```python
import sdl2.ext
def ext_hello():
    '''
    helloworld.pyから抜粋
    '''
    sdl2.ext.init()
    window = sdl2.ext.Window("Hello World!", size=(592, 460))
    window.show()
    processor = sdl2.ext.TestEventProcessor()
    processor.run(window)
    sdl2.ext.quit()

import ctypes
import sdl2
def hello():
    '''
    helloworld.pyから抜粋
    '''
    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.SDL_CreateWindow(b"Hello World",
                                   sdl2.SDL_WINDOWPOS_CENTERED,
                                   sdl2.SDL_WINDOWPOS_CENTERED,
                                   592, 460, sdl2.SDL_WINDOW_SHOWN)
    running = True
    event = sdl2.SDL_Event()
    while running:
        while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
        sdl2.SDL_Delay(10)

    sdl2.SDL_DestroyWindow(window)
    sdl2.SDL_Quit()


if __name__=='__main__':
    hello()
    #ext_hello()
```
という感じだった。
なるほど。extはctypesの隠蔽とちょっとしたフレームワークの層のようだ。
sdl2を直接使うことにしよう。

# SDL_Renderer
https://wiki.libsdl.org/SDL_CreateRenderer
を移植してみる。

```py
def hello_renderer():
    print("hello_renderer")

    posX = 100
    posY = 100
    width = 320
    height = 240

    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO);

    win = sdl2.SDL_CreateWindow(b"Hello World", posX, posY, width, height, 0);

    renderer = sdl2.SDL_CreateRenderer(win, -1, sdl2.SDL_RENDERER_ACCELERATED);

    bitmapSurface = sdl2.SDL_LoadBMP(b"hello.bmp");
    bitmapTex = sdl2.SDL_CreateTextureFromSurface(renderer, bitmapSurface);
    sdl2.SDL_FreeSurface(bitmapSurface);

    while True:
        e=sdl2.SDL_Event()
        if sdl2.SDL_PollEvent(ctypes.byref(e)):
            if e.type == sdl2.SDL_QUIT:
                break;

        sdl2.SDL_RenderClear(renderer);
        sdl2.SDL_RenderCopy(renderer, bitmapTex, None, None);
        sdl2.SDL_RenderPresent(renderer);

    sdl2.SDL_DestroyTexture(bitmapTex);
    sdl2.SDL_DestroyRenderer(renderer);
    sdl2.SDL_DestroyWindow(win);

    sdl2.SDL_Quit();
```
あっさり動いた。

* byref
```
sdl2.SDL_PollEvent(ctypes.byref(e))
```
* nullptr
```
NULL -> None
```
* 文字列は
```
b"bytesの方で"
```

後は、Cの例から情報を得ればいけそう。