Ir ao conteúdo
  • Cadastre-se

Ajuda movimentar imagem allegro5 em C


Posts recomendados

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.
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...