2013年12月22日日曜日

SDL2 on Mint 16: install SDL2-dev and build test with cmake

[install SDL2-dev]

Linux Mint 16(Ubuntu saucy)系では、`apt-cache search libsdl`とかすると、libsdl1.2-devとlibsdl-2-devが標準リポジトリーから使えるってわかります。

今回はSDL-2.xを使いたいので、
apt-get install libsdl2-dev
で導入します。SDL2のライブラリーとして他に、
  • libsdl2-image-dev … SDL2画像読み込みライブラリー
  • libsdl2-mixer-dev … SDL2(マルチチャンネルオーディオ)ミキサーライブラリー
  • libsdl2-net-dev … SDL2ネットワークライブラリー
なども必要に応じて導入。たぶんlibsdl-ttf2.0-devとかもSDL-2.x対応系なのかもしれないけど、とりあえず明らかにパッケージ名でSDL-2.x系に対応とわかるのは上の3つ。

続く tutorial.01 サンプルでは libsdl2-image-dev を使用しています。

[build test with cmake]


ちょっと初期化して終了するだけのサンプルを作ろうかと思いましたが、せっかくなのでWindowを作ってPNGを読み込んで表示して3秒後に終了するサンプルを書いてみました。

(入手方法1: git clone)

  1. git clone https://github.com/usagi/sdl2-tutorial.git
  2. cd sdl2-tutorial
  3. git checkout 0.1.0

(入手方法2: wget .zip)

  1. wget https://github.com/usagi/sdl2-tutorial/archive/0.1.0.zip
  2. unzip sdl2-tutorial-0.1.0
  3. cd sdl2-tutorial-0.1.0

(ビルド方法: cmake ninja)

  1. mkdir build
  2. cd build
  3. cmake -G Ninja ..
  4. ninja

(実行方法)

  1. ./tutorial.01-hello_world

[tips 1:  cmake で SDL2 を扱う方法]

find_packageはSDL1系にしか対応していません。FindPkgConfigをincludeしてpkg_search_moduleを使います。

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
if(SDL2_VERSION VERSION_LESS "2.0")
  message(FATAL_ERROR "Insufficient SDL2 version; require SDL-2.0")
else()
  message(STATUS "SDL2: ${SDL2_VERSION} (+libs: ${SDL2_LIBRARIES})")
endif()
pkg_search_module(SDL2_IMAGE REQUIRED SDL2_image)

リンク用のライブラリー変数は ${SDL2_LIBRARIES} や ${SDL2_IMAGE_LIBRARIES} が定義されるので target_link_librariesで用います。

[tips 2: sdl_initialize() の return ]

RAII無きCで実装されたSDL2では構築と破棄の対をライブラリーのユーザープログラマーが管理しなければなりません。C/C++対応とか名乗るなら(ry

SDL_Init()の対になるのはSDL_Quit()です。 sdl_initialize の return でカスタムデリーターとしてSDL_Quit()を行うshared_ptr<nullptr_t>を生成して返しています。 main ではこれを auto で受けて保持しておけば、このオブジェクトのRAIIにより適切なタイミングで SDL_Quit() が呼ばれます。

[tips 3: SDL_Window, SDL_Renderer, SDL_Surface, SDL_Texture のスマートポインターとカスタムデリーター]

今回使用しているこれらの型は生成に対応する破棄がdelete演算子では上手くコンパイルできません。それぞれに対応するカスタムデリーターをスマートポインターに定義する必要があります。
  • SDL_Window --> SDL_DestroyWindow
  • SDL_Renderer --> SDL_DestroyRenderer
  • SDL_Surface --> SDL_FreeSurface
  • SDL_Texture --> SDL_DestroyTexture

参考: 

  1. http://www.libsdl.org/
  2. SDL libraries
    1. http://www.libsdl.org/projects/SDL_image/
    2. http://www.libsdl.org/projects/SDL_mixer/
    3. http://www.libsdl.org/projects/SDL_net/
  3. stackoverflow: CMake with SDL 2.0 and C++11
  4. TwinklebearDev: Lesson 1: Hello World!
  5. http://wiki.libsdl.org/
    1. http://wiki.libsdl.org/SDL_Init
    2. http://wiki.libsdl.org/SDL_Quit
    3. http://wiki.libsdl.org/SDL_CreateWindow
    4. http://wiki.libsdl.org/SDL_DestroyWindow
    5. http://wiki.libsdl.org/SDL_CreateRenderer
    6. http://wiki.libsdl.org/SDL_DestroyRenderer
    7. http://wiki.libsdl.org/SDL_Surface
      1. http://www.libsdl.org/projects/SDL_image/docs/SDL_image_11.html
    8. http://wiki.libsdl.org/SDL_FreeSurface
    9. http://wiki.libsdl.org/SDL_CreateTextureFromSurface
    10. http://wiki.libsdl.org/SDL_DestroyTexture
    11. http://wiki.libsdl.org/SDL_RenderClear
    12. http://wiki.libsdl.org/SDL_RenderCopy
    13. http://wiki.libsdl.org/SDL_RenderPresent
    14. http://wiki.libsdl.org/SDL_Delay

0 件のコメント:

コメントを投稿