마찬가지로 어제 했던 것에서 좀 바꿨다.
1 2 3 4 5 6 7 8 9 10 11 12 | // Sprite.h struct Sprite { SDL_Surface* Image; // 이미지 불러오기 SDL_Texture* Texture; // 텍스쳐 Uint32 ColorKey; int ImageNum; // 이미지 개수 int AniCount; // 애니메이션 카운트 int ImageWidth, ImageHeight; int XPos, YPos; }; | cs |
바뀐 부분만 첨부했다. XPos랑 YPos가 생겼다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Sprite.cpp Sprite* SprInit(SDL_Renderer* pRend, const char* Path) { Sprite* TempSpr = (Sprite*)malloc(sizeof(Sprite)); //new Sprite; TempSpr->Image = SDL_LoadBMP(Path); TempSpr->ImageWidth = TempSpr->Image->h; // 이미지 한장이 정사각형인 이미지들이 일자로 모인 녀석임을 전제로 함. TempSpr->ImageHeight = TempSpr->Image->h; TempSpr->ImageNum = TempSpr->Image->w / TempSpr->ImageHeight; TempSpr->AniCount = 0; TempSpr->ColorKey = SDL_MapRGB(TempSpr->Image->format, 255, 242, 0); SDL_SetColorKey(TempSpr->Image, SDL_RLEACCEL, TempSpr->ColorKey); TempSpr->Texture = SDL_CreateTextureFromSurface(pRend, TempSpr->Image); TempSpr->XPos = 0; TempSpr->YPos = 0; return TempSpr; } | cs |
생성 시에 XPos와 YPos는 0으로 초기화시켜준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | // SDL_Test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #define SEC * 1000 SDL_Window* Wnd = nullptr; SDL_Renderer* Rend = nullptr; SDL_Event Event; Sprite* Spr1; bool bIsRunning = true; void Init(); void Process(); void Render(); void Release(); int _tmain(int argc, _TCHAR* argv[]) { Init(); while (bIsRunning) { Process(); Render(); //SDL_Delay(0.1 SEC); } Release(); return 0; } void Init() { SDL_Init(SDL_INIT_EVERYTHING); Wnd = SDL_CreateWindow("SDL Program", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); Rend = SDL_CreateRenderer(Wnd, -1, SDL_RENDERER_ACCELERATED); Spr1 = SprInit(Rend, "./TestSprite.bmp"); } void Process() { if (SDL_PollEvent(&Event)) { switch (Event.type) { case SDL_KEYDOWN: switch (Event.key.keysym.sym) { case SDLK_LEFT: // 좌우 방향키로 스프라이트가 이동 Spr1->XPos -= 4; break; case SDLK_RIGHT: Spr1->XPos += 4; break; case SDLK_ESCAPE: bIsRunning = false; } break; case SDL_QUIT: bIsRunning = false; break; //case SDL_MOUSEMOTION: // 마우스를 따라 스프라이트가 이동 // Spr1->XPos = Event.motion.x; // Spr1->YPos = Event.motion.y; // break; /*case SDL_MOUSEBUTTONDOWN: // 마우스 클릭할때 스프라이트가 이동 Spr1->XPos = Event.motion.x - 64; Spr1->YPos = Event.motion.y - 64; break;*/ //case SDL_MOUSEBUTTONUP: // break; } } SprProcess(Spr1); } void Render() { SDL_SetRenderDrawColor(Rend, 0, 0, 0, 0); SDL_RenderClear(Rend); SDL_Rect Dest = { Spr1->XPos, Spr1->YPos, 128, 128 }; SprRender(Rend, Spr1, Dest); SDL_RenderPresent(Rend); } void Release() { SDL_DestroyRenderer(Rend); SDL_DestroyWindow(Wnd); SDL_Quit(); } | cs |
Process함수에서 이벤트를 처리하고 있다. SDL_PollEvent는 이벤트가 있으면 1, 아니면 0을 반환하기때문에
if문 안에 넣어서 이벤트가 있을 때만 switch문에서 이벤트 작동을 시키고 있다.
SDL_KEYDOWN 이벤트인경우, 즉 키를 누르는 이벤트이면 어떤 키를 누른건지 다시 switch를 돌려서
왼쪽 화살표는 XPos를 감소, 오른쪽은 증가시킨다. ESC키는 프로그램을 종료한다.
SDL_QUIT 이벤트도 마찬가지로 프로그램 종료 역할을 한다.
주석처리 해놓은 SDL_MOUSEMOTION 이벤트는 마우스가 이동할때 발생하는 이벤트이다.
마우스의 좌표를 받아서 저장한다.
SDL_MOUSEBUTTONDOWN 이벤트는 좌클릭 시 발생한다.
그런데 이쪽 이벤트에만 - 64 값이 주어져있다. 뭘까?
주석처리를 해제하고 실행해보면 알겠지만.
이미지가 그려지는 사각형부분은 사각형의 좌상단부터 이미지를 그려내기때문에 마우스가 이미지의 정중앙이 아니게 된다.
이미지의 가로/세로의 반인 64만큼을 빼주면 마우스가 이미지의 정중앙에 위치하게 된다.
Render함수에서는 XPos와 YPos를 이용해 사각형을 만들고, 출력하도록 한다.
'Programming > SDL 2.0' 카테고리의 다른 글
[SDL] 이벤트 (1) (0) | 2015.04.25 |
---|---|
[SDL] 스프라이트 처리 (0) | 2015.04.24 |
[SDL] 이미지 출력 (0) | 2015.02.15 |
[SDL] 선/사각형 그리기 (0) | 2015.02.15 |
[SDL] 첫 코드 작성 (0) | 2015.02.14 |