load_image_sdl

No post anterior havia explicado como desenhar um pequeno quadrado no ecrã e como proceder ao movimento deste mesmo quadrado pela área do ecrã usando as teclas do teclado.

Hoje explico como fazer o upload de uma imagem e como é possível movimentar a imagem da mesma forma que movimentei o quadrado.

Aqui fica o código devidamente comentado para melhor compreensão:

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
//Include da Biblioteca SDL, Funcoes e tipos de dados
#include <sdl /SDL.h>
 
 
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");
 
        //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
 
        //Definicao das cores a usar quer em background quer no quadrado desenhado
        Uint32 color = SDL_MapRGB(screen->format, 0xff,0xff,0xff); // cor branca background
 
        //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, &rect, screen, NULL); // 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);
 
                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;
}</sdl>

Neste exemplo explico como fazer o upload de um bipmat pelo que usando o SDL se torna mais simples fazer o upload de imagens neste formato, no entanto existem formas de fazer upload de imagens nos formatos mais conhecidos, mas para isso será necessário incluir a biblioteca #SDL_image.

Share

sdl

A linguagem de programação C++ é muito poderosa, sendo um importante recurso na programação seja do que for. A programação de jogos não é exceção, e em conjunto com SDL (Simple DirectMedia Layer) é possível criar umas coisas engraçadas.

Como sou curioso e com demasiada vontade de experimentar tudo menos o que tenho realmente de fazer, aqui fica uma pequena experiência com C++ e SDL que mais não é que desenhar um pequeno quadrado no ecrã e a possibilidade de o movimentar usando as teclas do teclado.

Aqui fica o todo o código fonte:

 

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
//Include da Biblioteca SDL, Funcoes e tipos de dasdos
#include <sdl /SDL.h>
 
 
int main(int argc, char** argv)
{
        //Inicializacao do SDL
        SDL_Init(SDL_INIT_EVERYTHING);
 
        //Definição do Ecra
        SDL_Surface *screen;
        screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
 
//        screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE|SDL_FULLSCREEN);
 
        //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 = 10;
        rect.y = 10;
        rect.w = 20;
        rect.h = 20;
 
        //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); //cor preta do quadrado
 
        //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_UP: //Cima
                                                        b[0] = 1;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[1] = 1;
                                                        break;
                                                case SDLK_DOWN: //Baixo
                                                        b[2] = 1;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        b[3] = 1;
                                                        break;
 
                                        }
                                        break;
 
                                //caso Tecla Não Esteja pressionada
                                case SDL_KEYUP:
                                        switch(event.key.keysym.sym) 
                                        {
                                                case SDLK_UP: //Cima
                                                        b[0] = 0;
                                                        break;
                                                case SDLK_LEFT: //Esquerda
                                                        b[1] = 0;
                                                        break; 
                                                case SDLK_DOWN: //Baixo
                                                        b[2] = 0;
                                                        break;
                                                case SDLK_RIGHT: //Direita
                                                        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 quadrado a preto
                SDL_FillRect(screen, &rect, color2);
 
                //Update Screen
                SDL_Flip(screen);
 
                if(1000/FPS > SDL_GetTicks()-start) 
                {
                        SDL_Delay(1000/FPS-(SDL_GetTicks()-start));
                }
        }
 
        //Quit SDL
        SDL_Quit();
 
        return 0;
}
</sdl>

 
Isto não passa de uma mera experiência sendo que existe um potencial muito grande para se extrair do C++ e do SDL capaz de fazer alguns do mais “brilhantes” jogos de computador.

Share

C++: De Aprendiz a Mestre! – Random Numbers

Aprender a programar passa sempre por experimentar código, aprendendo e percebendo o que ele faz na realidade. Não podemos limitar-nos a ler o código e “decorar” o que ele possívelmente fará.

Hoje experimentei 2 casos para a obtenção de números aleatórios.

Obter apenas 1 número aleatório:

1
2
3
4
5
6
7
8
9
10
#include<iostream> 
#include<cstdlib>
 
 using namespace std;
 
 int main()
 {
        int random_number = rand();
        cout < < random_number << endl;
 }

Para a obtenção de números aleatórios usamos a função rand() que nos permite gerar um número aleatório sem qualquer restrição.

Obter vários números aleatórios:

Usando um ciclo for:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream> 
#include<cstdlib>
 
 using namespace std;
 
 int main()
 {
        for (int i = 0; i < 5; i++)
        {
                int random_number = rand();
                cout << random_number << endl;
        }
 }

Usando um ciclo while:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream> 
#include<cstdlib>
 
 using namespace std;
 
 int main()
 {
        int i = 0;
 
        while(i < 5)
        {
                int random_number = rand();
                cout << random_number << endl;
 
                i++;
        }
 }

Para obtermos vários números aleatórios basta adicionar um ciclo for ou while ao código já apresentado.

No entanto é possível também gerar números aleatórios num intervalo bem definido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdlib> 
#include <ctime> 
#include <iostream>
 
using namespace std;
int main() 
{ 
    srand((int)time(0)); 
    int random_number; 
 
    for(int i = 0; i < 5; i++)
    { 
        random_number = (rand()%10) + 1; 
        cout << random_number << endl; 
    } 
}

Neste exemplo vamos gerar 5 números aleatórios compreendidos entre o intervalo [0 e 10].

Share

“Loading…. 100%” em C++

Excesso de “tempo livre” por vezes dá nestas brincadeiras.

Um pequeno bloco de código que simula o “Loading” de uma aplicação.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<stdio .h>
#include<stdlib .h>
#include<unistd .h>
 
using namespace std;
 
int main()
{
        for(int i=0;i< =100;i++)
        {
                cout<<"Loading......."<< i <<"%" << endl;
                usleep(100000);
                system("clear");
                usleep(10000);
        }
        return 0;
}

Share

Por vezes na programaçao em C e C++ necessitamos de converter um tipo de dados num outro tipo de dados diferente para que possamos prosseguir com a implementação de um qualquer tipo de funcionalidade. Para isso é necessário efectuar um “type casting”.

Exitem situações em que o cast é implicito. Neste caso a conversão é feita automáticamente sem que o programador necessite de fazer seja o que for.

Exemplo 1:

1
2
char a = 3;
int i = a;

Exemplo 2:

1
2
int i = 123456789;
char a = i;

Neste exemplo alguns compiladores irão gerar alguns avisos devido à variável a que é um char não ter capacidade para armazenar todos os dados.

Conversão Explicita de tipos de Dados:

A forma correcta de efectuar-mos o casting de dados é a seguinte:

Exemplo:

1
2
int i = 123456789;
char a = (char)i;
Share