bambooflow Note

SDL

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

SDL - Simple DirectMedia Layer



Download & Compile


% sudo apt-get install libsdl1.2-dev


SDL.lib SDLmain.lib opengl32.lib

g++ `sdl-config --cflags --libs` -lGL sample.cpp -o sample


cmake準備


  • CMakeLists.txt
#
# CMakeFileLists.txt
#
# > cmake .
#

# 要求するCMakeのバージョン
cmake_minimum_required(VERSION 2.6)
 
# build type
set(CMAKE_BUILD_TYPE DEBUG)
 
# compile option (DEBUG)
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
set(CMAKE_C_FLAGS_DEBUG "-g -Wall")
 
# compile option (Release)
set(CMAKE_CXX_FLAGS_RELEASE "-Wall -O3")
set(CMAKE_C_FLAGS_RELEASE "-Wall -O3")
 
# インストール先
# CMAKE_INSTALL_PREFIX(...)

 
############################################################

set(PROJ_NAME run.x)
set(TARGET ${PROJ_NAME})
 
set(SDL_PATH /usr)
 
# プロジェクト名
project(${PROJ_NAME})
 
# インクルードパスの追加
include_directories(${SDL_PATH}/include)
 
# ライブラリパスの追加
link_directories(${SDL_PATH}/lib)
 
# 実行ファイルとソースファイル群
add_executable(${TARGET} main.cpp)
 
# ライブラリ
target_link_libraries(${TARGET} SDL GL GLU)
 
# マクロ設定 [-D]
#add_definitions(-D)
 


Empty Project


  • main.cpp
#include <cstdio>
#include <cstdlib>
#include <iostream>
 
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
 
#include <GL/gl.h>
#include <GL/glu.h>
 
static bool initSDL(int width, int height);
static void initGL();
static void reshape(GLsizei w, GLsizei h);
static void process_events();
static void draw();
 
bool initSDL(int width, int height)
{
  const SDL_VideoInfo* info;
  const SDL_Surface *surf;
  int bpp = 0;
 
  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    std::cerr << "Video initialization Failed : " << SDL_GetError() << "\n";
    SDL_Quit();
    return false;
  }
  info = SDL_GetVideoInfo();
  if (!info) {
    std::cerr << "Video query failed : " << SDL_GetError() << "\n";
  }
  bpp = info->vfmt->BitsPerPixel;
 
  SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8);
  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);
  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8);
  SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8);
  SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
  SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,8);
  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
 
  //atexit(SDL_Quit);
  surf = SDL_SetVideoMode(width, height, bpp, SDL_OPENGL|SDL_RESIZABLE);
  if (!surf) {
    std::cerr << SDL_GetError() << "\n";
    SDL_Quit();
    return false;
  }
 
  reshape(width, height);
 
  return true;
}
 
 
void initGL()
{
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glEnable(GL_DEPTH_TEST);
}
 
void reshape(GLsizei w, GLsizei h)
{
  glViewport(0, 0, w, h);
 
  glOrtho(0.0, w, h, 0.0, -1.0, 1.0);
}
 
void process_events()
{
  SDL_Surface *surf;
  SDL_Event event;
  while (SDL_PollEvent(&event)) {
    switch (event.type) {
    case SDL_QUIT:
      std::exit(1);
      break;
 
    case SDL_KEYDOWN:
      switch (event.key.keysym.sym) {
      case SDLK_ESCAPE: std::exit(0);
        break;
      default:
        break;
      }
      break;
 
    case SDL_VIDEORESIZE:
      SDL_FreeSurface(surf);
      surf = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, SDL_OPENGL|SDL_RESIZABLE);
      reshape(static_cast<GLsizei>(event.resize.w), static_cast<GLsizei>(event.resize.h));
      break;
    }
  }
}
 
void draw()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
  //glLoadIdentity();
 
  // 四角形を描く
  glBegin(GL_QUADS);
  {
    glColor3f(1.0, 1.0f, 1.0); // white
    // 4つの頂点を指定
    glVertex3f(100.0f, 100.0f, 0);
    glVertex3f(540.0f, 100.0f, 0);
    glVertex3f(540.0f, 380.0f, 0);
    glVertex3f(100.0f, 380.0f, 0);
  }
  glEnd();
 
  SDL_GL_SwapBuffers();
}
 
 
int main(int argc, char* argv[])
{
  if (!initSDL(640, 480)) {
    std::exit(1);
  }
 
  // initialize OpenGL
  initGL();
 
  // simLoop
  while (true) {
    process_events();
    draw();
  }
 
  return 0;
}
 


表示




参考


http://www.tacoworks.jp/software/SDLdoc-jp/html/index.html

タグ:

OpenGL SDL
添付ファイル
記事メニュー
ウィキ募集バナー