[SDL] 이벤트 (2)

Programming/SDL 2.0

2015. 4. 25. 15:06 - gold5230


마찬가지로 어제 했던 것에서 좀 바꿨다.


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->/ TempSpr->ImageHeight;
    TempSpr->AniCount = 0;
 
    TempSpr->ColorKey = SDL_MapRGB(TempSpr->Image->format, 2552420);
    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,
        640480, 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, 0000);
    SDL_RenderClear(Rend);
 
    SDL_Rect Dest = { Spr1->XPos, Spr1->YPos, 128128 };
    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