ed44

Já está disponível a nova edição da Revista Programar, esta edição traz como destaque um artigo sobre “Interacção com Voz no Android”, contendo também um também um artigo sobre “Arduino: const vs #define” (pag. 38 a 40) elaborado por mim, entre muitos outros artigos.

É uma revista redigida por um grupo de voluntários que tem por gosto a programação, e apresenta artigos de grande qualidade e utilidade para qualquer interessado em programação…

O Download Pode Ser Feito Aqui:

Share

Usar Fontes TTF em C++ e SDL

font

Para que possamos usar tipos de letra variados e específicos quando programamos em C++ e SDL necessitamos de usar fontes, e é isso que eu vou mostrar neste post.

Antes de qualquer outra coisa necessitamos de fazer o download de uma fonte no formato TTF, que são facilmente encontradas pela Internet.

O código que eu criei para este exemplo é o seguinte:

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//Include da Biblioteca SDL, Funcoes e tipos de dados
#include <sdl /SDL.h>
#include "SDL/SDL_image.h" //Biblioteca para poder fazer upload de imagens JPG, PNG
#include </sdl><sdl /SDL_ttf.h> //Biblioteca para fazer o uso das font's 
 
//Função para ajustar os espaço entre cada imagem individual do sprite
void setrects(SDL_Rect* clip)
{
        for(int i = 0; i < 7; i++) {
                //Basicamente a cada iteração do ciclo é incrementado 132px na imagem para obter o frame seguinte
                clip[i].x = 0 + i*132; 
                clip[i].y = 0;
                clip[i].w = 125;
                clip[i].h = 145;
        }
}
 
int main(int argc, char** argv)
 
{     // Inicializacaodo SDL
        SDL_Init(SDL_INIT_EVERYTHING);
 
        //Definição do Ecra
        SDL_Surface *screen = NULL;
        screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
        //Upload de imagens para memória
        SDL_Surface *image = NULL; //definição da variável de load da imagem
        //image = SDL_LoadBMP("Idle.bmp"); //upload de imagens BMP apenas
        image = IMG_Load("exp.png"); //upload de imagens JPG, PNG
        //Inicialização da biblioteca TTF
        TTF_Init();
        //Upload da fonte desejada
        TTF_Font* font = TTF_OpenFont("SIXTY.TTF", 36); //path da fonte, tamanho da fonte
 
        SDL_Surface *text; //definição da variável de load da fonte
 
        //Boleano para o teste de execucao
        bool running = true;
 
        //4 direcções
        bool b[4] = {0, 0, 0, 0};
 
        //Definicao dos controladores de FPS
        const int FPS = 30;
        Uint32 start;
 
        //Definicao dos pontos e da recta para desenho do quadrado no ecra
        SDL_Rect rect;
        rect.x = 0; //ponto de partida da imagem
        rect.y = 340;  //ponto de partida da imagem
        rect.w = 640; //alcance no eixo do x da imagem
        rect.h = 480; //alcance no eixo do y da imagem
 
        //Definição de variável para a velocidade dos frames
        float frame = 0;
 
        //Definicao das cores a usar quer em background quer no quadrado desenhado
        Uint32 color = SDL_MapRGB(screen->format, 0xff,0xff,0xff); // cor branca background
        Uint32 color2 = SDL_MapRGB(screen->format, 0,0,0);
 
        //Array para guardar cada imagem referente à animação do sprite
    SDL_Rect rects[7];
 
    //Chamada da Função para ajustar os espaço entre cada imagem individual do sprite
    setrects(rects);
 
    //Definição da Cor da  Fonte
    SDL_Color color3 =  {0,0,0};
    //Definição do texto a imprimir
    text = TTF_RenderText_Solid(font, "Hey, My Name is Nuno!", color3);
 
        //teste de verificacao da execução
        while(running) 
        {
                start = SDL_GetTicks();
                SDL_Event event;
 
                while(SDL_PollEvent(&event)) 
                {
                        switch(event.type) 
                        {
                                //caso escolha sair (x) termina a execuçao
                                case SDL_QUIT:
                                        running = false;
                                        break;
 
                                //caso Tecla Esteja pressionada
                                case SDL_KEYDOWN:
                                        switch(event.key.keysym.sym) 
                                        {
                                                case SDLK_DOWN: //Cima
                                                        b[0] = 1;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        b[1] = 1;
                                                        break;
                                                case SDLK_UP: //Baixo
                                                        b[2] = 1;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[3] = 1;
                                                        break;
 
                                        }
                                        break;
 
                                //caso Tecla Não Esteja pressionada
                                case SDL_KEYUP:
                                        switch(event.key.keysym.sym) 
                                        {
                                                case SDLK_DOWN: //Cima
                                                        b[0] = 0;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        b[1] = 0;
                                                        break; 
                                                case SDLK_UP: //Baixo
                                                        b[2] = 0;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[3] = 0;
                                                        break;
 
                                        }
                                        break;
                        }
                }
 
                //case UP pressionado decrementa 1 a Y
                if(b[0])
                        rect.y++;
                //Caso LEFT pressionado decremetna 1 a X
                if(b[1])
                        rect.x++;
                //case Down pressionado incrementa 1 a Y
                if(b[2])
                        rect.y--;
                //Caso RIGHT pressionado incremetna 1 a X
                if(b[3])
                        rect.x--;
 
                //Desenhar o background
                SDL_FillRect(screen, &screen->clip_rect, color);
                //Desenhar o texto na tela
                SDL_BlitSurface(text, NULL, screen, NULL);
 
                //Desenhar a Imagem no Ecrã
                SDL_BlitSurface(image, &rects[static_cast<int>(frame)], screen, &rect); // os argumentos começam pela imagem = image, pela sua orientação no ecrã = &rect e screen indica onde será apresentada
 
                //Update Screen
                SDL_Flip(screen);
 
                //Velocidade de transição entre frames
                frame += 0.5;
 
        if(frame > 7) {
                frame = 0;
        }
 
                if(1000/FPS > SDL_GetTicks()-start) 
                {
                        SDL_Delay(1000/FPS-(SDL_GetTicks()-start));
                }
 
        }
 
        //Libertar a imagem da memória
        SDL_FreeSurface(image);
        //Libertar a fonte da memória
        SDL_FreeSurface(text);
        //Fechar o upload da fonte
        TTF_CloseFont(font);
        //Terminar a execução da biblioteca TTF
        TTF_Quit();
 
        //Quit SDL
        SDL_Quit();
 
        return 0;
}
</int></sdl>

 

Um dos pormenores ao compilar o código é a necessidade de ser adicionada uma nova flag, mais precisamente a flag lSDL_ttf resultando no seguinte:

g++ -o exp exp.cpp -lSDL -lSDL_image -lSDL_ttf

Todo o código está comentado para que possa facilmente ser percebido.

 

 

Share

Animar Sprite Image Usando C++ e SDL

spriteanimation

A animação dos jogos 2D não é mais do que o percorrer de uma sequencia de imagens estáticas dando a sensação de movimento, a esse tipo de imagens são chamadas de sprite images.

exp

Abaixo apresento um pequeno exemplo de como animar um sprite image usando C++ e SDL sendo que é também possível movimentar a imagem pela tela usando as teclas do teclado.

 

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//Include da Biblioteca SDL, Funcoes e tipos de dados
#include <sdl /SDL.h>
#include "SDL/SDL_image.h" //Biblioteca para poder fazer upload de imagens JPG, PNG
 
//Função para ajustar os espaço entre cada imagem individual do sprite
void setrects(SDL_Rect* clip)
{
        for(int i = 0; i < 7; i++) {
                //Basicamente a cada iteração do ciclo é incrementado 132px na imagem para obter o frame seguinte
                clip[i].x = 0 + i*132; 
                clip[i].y = 0;
                clip[i].w = 125;
                clip[i].h = 145;
        }
}
 
int main(int argc, char** argv)
 
{     //Inicializacao do SDL
        SDL_Init(SDL_INIT_EVERYTHING);
 
        //Definição do Ecra
        SDL_Surface *screen = NULL;
        screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
        //Upload de imagens para memória
        SDL_Surface *image = NULL; //definição da variável de load da imagem
        //image = SDL_LoadBMP("Idle.bmp"); //upload de imagens BMP apenas
        image = IMG_Load("exp.png"); //upload de imagens JPG, PNG
 
        //Boleano para o teste de execucao
        bool running = true;
 
        //4 direcções
        bool b[4] = {0, 0, 0, 0};
 
        //Definicao dos controladores de FPS
        const int FPS = 30;
        Uint32 start;
 
        //Definicao dos pontos e da recta para desenho do quadrado no ecra
        SDL_Rect rect;
        rect.x = 0; //ponto de partida da imagem
        rect.y = 0;  //ponto de partida da imagem
        rect.w = 640; //alcance no eixo do x da imagem
        rect.h = 480; //alcance no eixo do y da imagem
 
        //Definição de variável para a velocidade dos frames
        float frame = 0;
 
        //Definicao das cores a usar quer em background quer no quadrado desenhado
        Uint32 color = SDL_MapRGB(screen->format, 0xff,0xff,0xff); // cor branca background
        Uint32 color2 = SDL_MapRGB(screen->format, 0,0,0);
 
        //Array para guardar cada imagem referente à animação do sprite
    SDL_Rect rects[7];
 
    //Chamada da Função para ajustar os espaço entre cada imagem individual do sprite
    setrects(rects);
 
        //teste de verificacao da execução
        while(running) 
        {
                start = SDL_GetTicks();
                SDL_Event event;
 
                while(SDL_PollEvent(&event)) 
                {
                        switch(event.type) 
                        {
                                //caso escolha sair (x) termina a execuçao
                                case SDL_QUIT:
                                        running = false;
                                        break;
 
                                //caso Tecla Esteja pressionada
                                case SDL_KEYDOWN:
                                        switch(event.key.keysym.sym) 
                                        {
                                                case SDLK_DOWN: //Cima
                                                        b[0] = 1;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        b[1] = 1;
                                                        break;
                                                case SDLK_UP: //Baixo
                                                        b[2] = 1;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[3] = 1;
                                                        break;
 
                                        }
                                        break;
 
                                //caso Tecla Não Esteja pressionada
                                case SDL_KEYUP:
                                        switch(event.key.keysym.sym) 
                                        {
                                                case SDLK_DOWN: //Cima
                                                        b[0] = 0;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        b[1] = 0;
                                                        break; 
                                                case SDLK_UP: //Baixo
                                                        b[2] = 0;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[3] = 0;
                                                        break;
 
                                        }
                                        break;
                        }
                }
 
                //case UP pressionado decrementa 1 a Y
                if(b[0])
                        rect.y++;
                //Caso LEFT pressionado decremetna 1 a X
                if(b[1])
                        rect.x++;
                //case Down pressionado incrementa 1 a Y
                if(b[2])
                        rect.y--;
                //Caso RIGHT pressionado incremetna 1 a X
                if(b[3])
                        rect.x--;
 
                //Desenhar o background
                SDL_FillRect(screen, &screen->clip_rect, color);
 
                //Desenhar a Imagem no Ecrã
                SDL_BlitSurface(image, &rects[static_cast<int>(frame)], screen, &rect); // os argumentos começam pela imagem = image, pela sua orientação no ecrã = &rect e screen indica onde será apresentada
 
                //Update Screen
                SDL_Flip(screen);
 
                //Velocidade de transição entre frames
                frame += 0.5;
 
        if(frame > 7) {
                frame = 0;
        }
 
                if(1000/FPS > SDL_GetTicks()-start) 
                {
                        SDL_Delay(1000/FPS-(SDL_GetTicks()-start));
                }
 
        }
 
        //Libertar a imagem da memória
        SDL_FreeSurface(image);
 
        //Quit SDL
        SDL_Quit();
 
        return 0;
}</int></sdl>

O exemplo é bastante simples e está todo comentado para que possa ser percebido sem dificuldade.

Share

Gibbo 2D: Game Engine

gibbo

O Gibbo 2D apresenta-se como um motor de desenvolvimento de jogos simplificado, mas ao mesmo tempo poderoso.

Desenvolvido por dois jovens Portugueses, o Gibbo 2D é uma plataforma de desenvolvimento de jogos muito completa e ao mesmo tempo simples.

Incluí funcionalidades tais como o Tiles Editor, motor de física integrado, editor de objectos, suportando ainda scripting em C#.

Recorrendo a esta plataforma é possível criar jogos para computador (Windows) ou smartphones (Windows Phone) sem que seja necessário aprender e aprofundar conhecimentos em API’s gráficas ou outro tipo de particularidades necessárias ao desenvolvimento de jogos.

Poderá obter mais informações na Página oficial do Projecto Aqui:

O Download da versão 1.2.0 do Gibbo 2D pode ser feita Aqui:

Share

Como qualquer aplicação escrita numa linguagem de programação compilada, necessita de ser compilada para ser executada, e o C++ é uma dessas linguagens.

Compilar:

g++ -o nome_ficheiro_executavel nome_ficheiro_codigo.cpp -lSDL

Executar:

./nome_ficheiro_executavel

O processo de compilação de uma aplicação escrita em SDL / C++ é muito semelhante ao processo de compilação de uma aplicação escrita em C++, necessitando apenas de usar uma flag indicando o uso da biblioteca SDL.

Share