|
[이전]
목차
[다음]
Simple DirectMedia Layer API 사용하기
비디오(Video)
- 비디오 모드의 선택과 설정 (쉬운방법)
여러분의 맘에 드는 bit-depth 와 해상도를 선택하여 설정한다!
|
팁 #1:
SDL_GetVideoInfo() 함수를 사용해서 하드웨어에 의해 지원되는 가장 빠른
비디오 depth 를 얻을 수 있다.
팁 #2:
SDL_ListModes() 함수를 사용해서 특정 bit-depth 하에 지원되는 비디오 해상도의
목록을 얻을 수 있다.
|
예제:
{ SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if ( screen == NULL ) {
fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError());
exit(1);
}
}
|
- 화면에 점찍기
화면에 그리는 작업은 그래픽 프레임버퍼에 직접 쓴뒤 화면 갱신 함수를
호출함으로써 수행된다.
|
팁:
만약 화면에 그릴 것이 많다면, 그리기 전에 (필요하다면) 화면을 한번 잠그고
갱신될 영역의 목록을 유지하다가 디스플레이를 갱신하기 전에 다시 화면을
푸는 것이 가장 좋은 방법이다.
|
| 예제:
무작위 포맷의 화면에 점찍기
#include <SDL_endian.h> /* 엔디안-종속적인 24 bpp 모드를 위해 사용 */
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
if ( SDL_MUSTLOCK(screen) ) {
if ( SDL_LockSurface(screen) < 0 ) {
return;
}
}
switch (screen->format->BytesPerPixel) {
case 1: { /* 8-bpp 라고 가정 */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: { /* 아마 15-bpp 아니면 16-bpp */
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: { /* 느린 24-bpp mode, 보통 사용되지 않는다 */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else {
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: { /* 아마 32-bpp */
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
if ( SDL_MUSTLOCK(screen) ) {
SDL_UnlockSurface(screen);
}
SDL_UpdateRect(screen, x, y, 1, 1);
}
|
- 이미지의 로딩과 디스플레이
SDL은 사용자 편의를 위한 SDL_LoadBMP() 이라는 하나의
이미지 로딩 루틴을 제공한다.
이미지 로딩을 위한 라이브러리는 SDL 데모 모음에서 발견할
수 있다.
SDL_BlitSurface() 를 사용해서 그래픽 프레임버퍼로 이미지를 blit 하면
화면에 디스플레이할 수 있다.
SDL_BlitSurface() 는 자동적으로 blit 사각형을 클립(clip)하는데,
이 blit 사각형은 SDL_BlitSurface()에 넘겨져 바뀐 화면의 영역이
갱신되도록 한다.
|
팁 #1:
만약 여러번 그려질 이미지를 로딩하려면, 이미지를 스크린의 포맷으로
변환하여 blit 속도를 향상시킬 수 있다. SDL_DisplayFormat() 함수가
이러한 변환을 해 준다.
팁 #2:
많은 스프라이트 이미지들은 투명한 배경을 가진다. SDL_SetColorKey() 함수를
사용해서 투명한 blit(컬러키 blit)을 할 수 있다.
|
예제:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
SDL_Surface *image;
SDL_Rect dest;
/* BMP 파일을 서페이스로 읽어들임 */
image = SDL_LoadBMP(file);
if ( image == NULL ) {
fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
return;
}
/* 화면 서페이스에 Blit.
서페이스는 이 시점에서 잠궈져있지 않아야 한다. */
dest.x = x;
dest.y = y;
dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image, NULL, screen, &dest);
/* 화면의 변화된 부분을 갱신 */
SDL_UpdateRects(screen, 1, &dest);
SDL_FreeSurface(image);
}
|
[이전]
목차
[다음]
|