Ir ao conteúdo
  • Cadastre-se
Kevin Spiller

Ajuda movimentar imagem allegro5 em C

Recommended Posts

Olá pessoal estou com problema no seguinte código, eu consigo desenhar as primitivas para formar a nave porém nao consigo movimentá-las, ja usei printf para verificar se nao estou passando lixo na funçao q recebe a struct da main e esta td certo nisso. O código(nao irá funcionar pois os arquivos das músicas, imagem de plano de fundo, e as fontes das letras):

 

#include <allegro5/allegro.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_primitives.h>
#include <stdio.h>
 
const int LARGURA_TELA = 600;
const int ALTURA_TELA = 640;
const int FPS = 60;
 
ALLEGRO_DISPLAY *janela = NULL;
ALLEGRO_BITMAP *imagem = NULL;
ALLEGRO_AUDIO_STREAM *musica = NULL;
ALLEGRO_AUDIO_STREAM *musica2 = NULL;
ALLEGRO_EVENT_QUEUE *fila_eventos = NULL;
ALLEGRO_FONT *fonte = NULL;
ALLEGRO_FONT *fonte2 = NULL;
ALLEGRO_FONT *fonte3 = NULL;
ALLEGRO_FONT *fonte4 = NULL;
ALLEGRO_FONT *fonte5 = NULL;
ALLEGRO_TIMER *timer = NULL;
 
struct nave_espacial{
    int x;
    int y;
    int vidas;
    int velocidade;
    int borda_x;
    int borda_y;
    int pontos;
};
 
struct keys{
    int CIMA;
    int BAIXO;
    int DIREITA;
    int ESQUERDA;
    int SPACE;
};
 
void move_cima(struct nave_espacial nave){
    nave.y -= nave.velocidade;
    if(nave.y < 0)
        nave.y = 0;
}
 
void move_baixo(struct nave_espacial nave){
    nave.y += nave.velocidade;
 
    if(nave.y > ALTURA_TELA)
        nave.y = ALTURA_TELA;
}
 
void move_direita(struct nave_espacial nave){
    nave.x += nave.velocidade;
 
    if(nave.x > 310)
        nave.x = 310;
}
 
void move_esquerda(struct nave_espacial nave){
    nave.x -= nave.velocidade;
 
    if(nave.x < 0)
        nave.x = 0;
}
 
void desenha_nave(struct nave_espacial nave){
 
   imagem = al_load_bitmap("space.jpg");
 
    al_draw_bitmap(imagem,0,0,0);
 
    al_draw_filled_rectangle(nave.x-9,nave.y,nave.x-5,nave.y+29,al_map_rgb(255,255,0));
 
    al_draw_filled_rectangle(nave.x+9,nave.y,nave.x+5,nave.y+29,al_map_rgb(255,255,0));
 
     al_draw_filled_triangle(nave.x-18,nave.y+25,nave.x,nave.y-10,nave.x+18,nave.y+25,al_map_rgb(255,0,0));
 
     al_draw_filled_rectangle(nave.x-1.51,nave.y-11,nave.x+1.54,nave.y+25,al_map_rgb(0,0,0));
 
     al_flip_display();
 
}
 
 
void start(){
 
    imagem = al_load_bitmap("space.jpg");
 
    al_draw_bitmap(imagem, 0, 0, 0);
 
    al_draw_text(fonte2, al_map_rgb(0, 0, 0), LARGURA_TELA / 2, 150, ALLEGRO_ALIGN_CENTRE, "Instructions");
 
    al_draw_text(fonte5, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 300, ALLEGRO_ALIGN_CENTRE, "Your goals are simple:");
 
    al_draw_text(fonte5, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 370, ALLEGRO_ALIGN_CENTRE, "- Destroy the enemy ships to gather points");
 
    al_draw_text(fonte5, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 440, ALLEGRO_ALIGN_CENTRE, "- Defeat the boss and end the game");
 
    al_flip_display();
 
    al_rest(7);
 
    al_destroy_audio_stream(musica);
 
    musica2 = al_load_audio_stream("judas.ogg", 4, 1024);
 
    al_attach_audio_stream_to_mixer(musica2, al_get_default_mixer());
 
    al_flip_display();
 
    imagem=al_load_bitmap("space.jpg");
 
    al_draw_bitmap(imagem,0,0,0);
 
}
 
void menu(){
 
    al_attach_audio_stream_to_mixer(musica, al_get_default_mixer());
 
    al_set_audio_stream_playing(musica, true);
 
    imagem= al_load_bitmap("space.jpg");
 
    al_draw_bitmap(imagem, 0, 0, 0);
 
    al_destroy_audio_stream(musica2);
 
    al_draw_text(fonte2, al_map_rgb(0, 0, 0), LARGURA_TELA / 2, 150, ALLEGRO_ALIGN_CENTRE, "SPACE WAR");
 
    al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 300, ALLEGRO_ALIGN_CENTRE, "Enter -> Start");
 
    al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 370, ALLEGRO_ALIGN_CENTRE, "Esc -> Quit");
 
    al_draw_text(fonte4, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 440, ALLEGRO_ALIGN_CENTRE, "Controls:");
 
    al_draw_text(fonte3, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 500, ALLEGRO_ALIGN_CENTRE, "LEFT DOWN RIGHT UP ARROWS to move");
 
    al_draw_text(fonte3, al_map_rgb(255, 255, 255), LARGURA_TELA / 2, 540, ALLEGRO_ALIGN_CENTRE, "SPACE to shoot");
 
    al_flip_display();
 
}
 
bool inicializar()
{
    if (!al_init())
    {
        fprintf(stderr,"Falha ao inicializar Allegro.\n");
        return 0;
    }
 
    if (!al_install_audio())
    {
        fprintf(stderr, "Falha ao inicializar áudio.\n");
        return 0;
    }
 
    if (!al_init_acodec_addon())
    {
        fprintf(stderr, "Falha ao inicializar codecs de áudio.\n");
        return 0;
    }
 
    if (!al_reserve_samples(1))
    {
        fprintf(stderr, "Falha ao alocar canais de áudio.\n");
        return 0;
    }
 
    if (!al_install_keyboard())
    {
        fprintf(stderr, "Falha ao inicializar teclado.\n");
        return 0;
    }
    if(!al_init_image_addon())
    {
        fprintf(stderr, "Falha ao alocar addons de imagem.\n");
        return 0;
    }
 
    janela = al_create_display(600, 660);
 
    al_init_font_addon();
 
    if (!al_init_ttf_addon())
    {
        fprintf(stderr, "Falha ao inicializar add-on allegro_ttf.\n");
        return -1;
    }
    if(!al_init_primitives_addon())
    {
        fprintf(stderr, "Falha ao inicializar add-on allegro_primitves.\n");
    }
 
    fonte = al_load_font("calibrib.TTF", 48, 0);
 
    fonte2 = al_load_font("impact.TTF", 70,0);
 
    fonte3 = al_load_font ("cambriab.TTF",20,0);
 
    fonte4 = al_load_font ("calibrib.TTF",40,0);
 
    fonte5 = al_load_font ("calibrib.TTF",30,0);
 
    if (!fonte)
    {
        al_destroy_display(janela);
        fprintf(stderr, "Falha ao carregar fonte.\n");
        return -1;
    }
    if (!fonte2)
    {
        al_destroy_display(janela);
        fprintf(stderr, "Falha ao carregar fonte.\n");
        return -1;
    }
    if (!fonte3)
    {
        al_destroy_display(janela);
        fprintf(stderr, "Falha ao carregar fonte.\n");
        return -1;
    }
 
    if (!janela)
    {
        fprintf(stderr, "Falha ao criar a janela.\n");
        return 0;
    }
    al_flip_display();
 
    musica2 = al_load_audio_stream("judas.ogg", 4, 1024);
 
    if (!musica2)
    {
        fprintf(stderr, "Falha ao carregar audio.\n");
        al_destroy_event_queue(fila_eventos);
        al_destroy_display(janela);
        return 0;
    }
 
    fila_eventos = al_create_event_queue();
    timer = al_create_timer(1.0/FPS);
    if (!fila_eventos)
    {
        fprintf(stderr, "Falha ao criar fila de eventos.\n");
        al_destroy_display(janela);
        return 0;
    }
 
    al_set_window_title(janela, "Space War");
 
    musica = al_load_audio_stream("brb.ogg", 4, 1024);
    if (!musica)
    {
        fprintf(stderr, "Falha ao carregar audio.\n");
        al_destroy_event_queue(fila_eventos);
        al_destroy_display(janela);
        return 0;
    }
    //al_start_timer(timer);
 
    al_register_event_source(fila_eventos, al_get_keyboard_event_source());
    al_register_event_source(fila_eventos, al_get_timer_event_source(timer));
    al_register_event_source(fila_eventos, al_get_display_event_source(janela));
 
    return 1;
}
 
int main()
{
    bool sair = 0;
 
    bool desenha = 1;
 
    int tecla = 0;
 
    struct nave_espacial nave={310,627,6,7,7,3,0};
 
    struct keys atalhos={0,0,0,0,0};
 
    if (!inicializar())
    {
        return -1;
    }
 
    menu();
 
    al_start_timer(timer);
 
    while (!sair)
    {
           ALLEGRO_EVENT evento;
           al_wait_for_event(fila_eventos, &evento);
          if (evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
          {
                sair = true;
          }
 
          else if(desenha == 1 && al_is_event_queue_empty(fila_eventos))
          {
 
            if (evento.type == ALLEGRO_EVENT_KEY_DOWN)
            {
                switch(evento.keyboard.keycode)
                {
                case ALLEGRO_KEY_ENTER:
                    tecla = 1;
                    break;
                case ALLEGRO_KEY_ESCAPE:
                    tecla = 2;
                    break;
                case ALLEGRO_KEY_UP:
                    atalhos.CIMA = 3;
                    break;
                case ALLEGRO_KEY_DOWN:
                    atalhos.BAIXO = 4;
                    break;
                case ALLEGRO_KEY_RIGHT:
                    atalhos.DIREITA = 5;
                    break;
                case ALLEGRO_KEY_LEFT:
                    atalhos.ESQUERDA = 6;
                    break;
                case ALLEGRO_KEY_SPACE:
                    atalhos.SPACE = true;
                    break;
                }
            }
            else if(evento.type == ALLEGRO_EVENT_KEY_UP)
            {
              switch(evento.keyboard.keycode)
                {
                case ALLEGRO_KEY_UP:
                    atalhos.CIMA = false;
                    break;
                case ALLEGRO_KEY_DOWN:
                    atalhos.BAIXO = false;
                    break;
                case ALLEGRO_KEY_RIGHT:
                    atalhos.DIREITA = false;
                    break;
                case ALLEGRO_KEY_LEFT:
                    atalhos.ESQUERDA = false;
                    break;
                case ALLEGRO_KEY_SPACE:
                    atalhos.SPACE = false;
                    break;
                }
            }
          }
          if(evento.type == ALLEGRO_EVENT_TIMER)
          {
            desenha = 1;
            if(atalhos.CIMA)
                move_cima(nave);
            if(atalhos.BAIXO)
                move_baixo(nave);
            if(atalhos.DIREITA)
                move_direita(nave);
            if(atalhos.ESQUERDA)
                move_esquerda(nave);
          }
        if (tecla)
        {
            if (tecla)
            {
                if (tecla == 1){
                    start();
                    desenha_nave(nave);
 
                }
                else if (tecla == 2){
                    return 0;
                }
            }
 
            tecla = 0;
 
        }
 
        al_flip_display();
 
        }
 
    al_destroy_timer(timer);
    al_destroy_audio_stream(musica);
    al_destroy_event_queue(fila_eventos);
    al_destroy_display(janela);
    al_destroy_font(fonte);
 
    return 0;
}
 
 
 
Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, quando postar alguma dúvida poste somente uma vez!

Quando postar o código utilize o botão logo ao lado da imagem ou então em um site, assim fica mais fácil a visualização.

 

Você esta uma matriz para percorrer?!

 

att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×