Ir ao conteúdo

C resolução de bugs em jogo pong, c, allegro 5


Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Postado

estou fazendo um jogo do tipo pong em linguagem C utilizandoa  biblioteca allegro 5, e não consigo encontrar uma forma dos personagens não ultrapassarem as paredes da tela, quando se pressiona a tecla para cima, o personagem continua subindo mesmo que acabe a tela como se ainda estivesse espaço, gostaria de travar ele para se movimentar somente dentro do campo visivel do jogo na direção para cima e para baixo.

/* Copyright (C) 2016 Marcelo Serrano Zanetti - All Rights Reserved and Pedro Milano 2021

 * Licensed under the GNU GPL V3.0 license. All conditions apply.

 * Powered by Allegro: http://liballeg.org/license.html

 */



#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_acodec.h>
#include <allegro5/allegro_audio.h>


const float FPS = 60;

const int SCREEN_W = 1024;

const int SCREEN_H = 546;

const int BOLA_TAMANHO = 32;

const int REBATEDOR_LARGURA = 32;

const int REBATEDOR_ALTURA = 32;

int main(int argc, char **argv)
{
   ALLEGRO_DISPLAY *display = NULL;

   ALLEGRO_EVENT_QUEUE *event_queue = NULL;

   ALLEGRO_TIMER *timer = NULL;

   ALLEGRO_BITMAP *treinador = NULL;

   ALLEGRO_BITMAP *pokemon = NULL;

   ALLEGRO_BITMAP *bola = NULL;

   ALLEGRO_BITMAP *background = NULL;

   ALLEGRO_SAMPLE *sample=NULL;

   ALLEGRO_SAMPLE *sample1=NULL;

   ALLEGRO_SAMPLE *sample2=NULL;

   ALLEGRO_SAMPLE *sample3=NULL;

   ALLEGRO_SAMPLE *sample4=NULL;


   bool redraw = true;
   bool doexit = false;


   if(!al_init())

    {

      fprintf(stderr, "failed to initialize allegro!\n");

      return -1;
    }

   if(!al_install_keyboard())

    {

      fprintf(stderr, "failed to initialize the keyboard!\n");

      return -1;
    }

   timer = al_create_timer(1.0 / FPS);

   if(!timer)

    {

      fprintf(stderr, "failed to create timer!\n");

      return -1;

   }

   if(!al_install_audio())

    {

      fprintf(stderr, "failed to initialize audio!\n");

      return -1;

   }


    else
        if (!al_reserve_samples(5))
        {
            fprintf(stderr, "Falha ao reservar samples!\n");
            return -1;
        }

   if(!al_init_acodec_addon())

    {

      fprintf(stderr, "failed to initialize audio codecs!\n");
      return -1;

   }

   if (!al_reserve_samples(1))

    {

      fprintf(stderr, "failed to reserve samples!\n");

      return -1;

   }

   sample = al_load_sample("audio/som.wav");

    if (!sample)

    {
        fprintf(stderr, "Falha ao carregar sample.\n");

        al_destroy_display(display);

        return false;

    }

       sample1 = al_load_sample("audio/intro.wav");

    if (!sample1)

    {
        fprintf(stderr, "Falha ao carregar sample1.\n");

        al_destroy_display(display);

        return false;

    }


        sample2 = al_load_sample("audio/treinador.wav");

    if (!sample2)

    {
        fprintf(stderr, "Falha ao carregar sample2.\n");

        al_destroy_display(display);

        return false;

    }

        sample3 = al_load_sample("audio/pokemon.wav");

    if (!sample3)

    {
        fprintf(stderr, "Falha ao carregar sample3.\n");

        al_destroy_display(display);

        return false;

    }

            sample4 = al_load_sample("audio/hit.wav");

    if (!sample4)

    {
        fprintf(stderr, "Falha ao carregar sample4.\n");

        al_destroy_display(display);

        return false;

    }

   al_set_new_display_flags(ALLEGRO_OPENGL | ALLEGRO_WINDOWED);

   display = al_create_display(SCREEN_W, SCREEN_H);

   if(!display)

    {
      fprintf(stderr, "failed to create display!\n");

      al_destroy_timer(timer);

      return -1;

   }

    al_init_image_addon();

    if(!al_init_image_addon())

    {

        fprintf(stderr, "failed to initialize the image addon!\n");

        return -1;

    }

   background = al_load_bitmap("imagens/fundo.png");

   if(!background)

    {

    fprintf(stderr, "falhou ao criar o background bitmap!\n");

      al_destroy_bitmap(treinador);
      al_destroy_bitmap(pokemon);
      al_destroy_display(display);
      al_destroy_timer(timer);

        return -1;


    al_set_target_bitmap(al_get_backbuffer(display));

    }

   treinador =  al_load_bitmap("imagens/treinador.png");


   if(!treinador)

    {

      fprintf(stderr, "failed to create treinador bitmap!\n");

      al_destroy_display(display);

      al_destroy_timer(timer);

      return -1;

   }

    pokemon = al_load_bitmap("imagens/pokemon.png");

      if(!pokemon)

        {

      fprintf(stderr, "failed to create pokemon bitmap!\n");

      al_destroy_display(display);

      al_destroy_timer(timer);

      return -1;

   }


    float bola_pos_x = SCREEN_W / 2.0 - BOLA_TAMANHO / 2.0;

    float bola_pos_y = SCREEN_H / 2.0 - BOLA_TAMANHO / 2.0;

    float bola_vx = -4;

    float bola_vy = -4;



    float treinador_pos_x = 0;

    float treinador_pos_y = SCREEN_H / 2.0 - REBATEDOR_ALTURA / 2.0;

    float treinador_vy = 0;



    float pokemon_pos_x = SCREEN_W - REBATEDOR_LARGURA;

    float pokemon_pos_y = SCREEN_H / 2.0 - REBATEDOR_ALTURA / 2.0;

    float pokemon_vy = 0;



    int click=0;

    int savebvx;

    int savebvy;


    bola = al_load_bitmap("imagens/bola1.png");


        if(!bola)

    {

        fprintf(stderr, "falhou ao criar a bola bitmap!\n");

        al_destroy_display(display);

        al_destroy_timer(timer);

        return -1;

    }

   event_queue = al_create_event_queue();

   if(!event_queue)

    {

      fprintf(stderr, "failed to create event_queue!\n");

      al_destroy_bitmap(treinador);

      al_destroy_bitmap(pokemon);

      al_destroy_display(display);

      al_destroy_timer(timer);

      al_destroy_bitmap(background);

      return -1;

   }

    al_set_window_title(display, "PongMon - Pokémon Pong Version");
    al_set_target_bitmap(al_get_backbuffer(display));

    al_play_sample(sample1, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);


    menu();


   al_register_event_source(event_queue, al_get_display_event_source(display));

   al_register_event_source(event_queue, al_get_timer_event_source(timer));

   al_register_event_source(event_queue, al_get_keyboard_event_source());



   al_clear_to_color(al_map_rgb(0,0,0));



   al_flip_display();



   al_start_timer(timer);



      while(1)

    {


        ALLEGRO_EVENT ev;

        al_wait_for_event(event_queue, &ev);

        al_play_sample(sample, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);




        if(ev.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)

        {

            switch(ev.mouse.button)

            {

            case 1:

                printf("x:%d y:%d\n",ev.mouse.x, ev.mouse.y);

                if(click==0)

                {

                    savebvx=bola_vx;

                    savebvy=bola_vy;

                    bola_vx=0;

                    bola_vy=0;

                    click=1;


                }

                else

                {

                    bola_vx=savebvx;

                    bola_vy=savebvy;

                    click=0;

                }

                break;

            }

        }

        else if(ev.type == ALLEGRO_EVENT_TIMER)

        {

            if(bola_pos_y < 0 || bola_pos_y > SCREEN_H - BOLA_TAMANHO)

            {

                bola_vy = -bola_vy;

            //al_play_sample(sample4, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL); // hitparede

            }



            if(bola_pos_x < 0 || bola_pos_x > SCREEN_W - BOLA_TAMANHO)

            {

                bola_pos_x = SCREEN_W / 2.0 - BOLA_TAMANHO / 2.0;

                bola_pos_y = SCREEN_H / 2.0 - BOLA_TAMANHO / 2.0;

                bola_vx = -4, bola_vy = -4;

            //al_play_sample(sample4, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL); // ponto


            }



            if(bola_pos_x <= treinador_pos_x + REBATEDOR_LARGURA)

                if(bola_pos_y+BOLA_TAMANHO>=treinador_pos_y)

                    if(bola_pos_y-BOLA_TAMANHO<=treinador_pos_y+REBATEDOR_ALTURA)


                        bola_vx = -bola_vx;



            if(bola_pos_x + BOLA_TAMANHO >= pokemon_pos_x )

                if(bola_pos_y+BOLA_TAMANHO>=pokemon_pos_y)

                    if(bola_pos_y-BOLA_TAMANHO<=pokemon_pos_y+REBATEDOR_ALTURA)

                        bola_vx = -bola_vx;



            bola_pos_x              += bola_vx;

            bola_pos_y              += bola_vy;

            treinador_pos_y += treinador_vy;

            pokemon_pos_y  += pokemon_vy;

            redraw = true;







        }

        else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)

        {

            switch(ev.keyboard.keycode)

            {

            case ALLEGRO_KEY_UP:

                pokemon=al_load_bitmap("imagens/pu1.png");

                 pokemon_vy=-4;

                break;



            case ALLEGRO_KEY_DOWN:

                pokemon=al_load_bitmap("imagens/pd1.png");

                pokemon_vy=4;

                break;



            case ALLEGRO_KEY_W:

                treinador=al_load_bitmap("imagens/u1.png");

                treinador_vy=-4;

                break;

            case ALLEGRO_KEY_S:

                treinador=al_load_bitmap("imagens/d1.png");

                treinador_vy=4;

                break;


            case ALLEGRO_KEY_ESCAPE:

                return 0;

                break;

            }

        }

        else if(ev.type == ALLEGRO_EVENT_KEY_UP)

        {

            switch(ev.keyboard.keycode)

            {

            case ALLEGRO_KEY_UP:

            pokemon=al_load_bitmap("imagens/pl1.png");

            case ALLEGRO_KEY_DOWN:

            pokemon=al_load_bitmap("imagens/pl1.png");

                pokemon_vy=0;

                break;



            case ALLEGRO_KEY_W:

            treinador=al_load_bitmap("imagens/r1.png");

            case ALLEGRO_KEY_S:

            treinador=al_load_bitmap("imagens/r1.png");

                treinador_vy=0;

                break;

            }

        }

        else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)

        {

            break;

        }



        if(redraw && al_is_event_queue_empty(event_queue))

        {

            redraw = false;



            al_clear_to_color(al_map_rgb(0,100,0));



            al_draw_bitmap(background, 0, 0, 0);

            al_draw_bitmap(treinador,treinador_pos_x, treinador_pos_y, 0);

            al_draw_bitmap(pokemon,pokemon_pos_x, pokemon_pos_y, 0);

            al_draw_bitmap(bola, bola_pos_x, bola_pos_y, 0);



            al_flip_display();

        }

    }


   al_destroy_bitmap(treinador);
   al_destroy_bitmap(pokemon);
   al_destroy_timer(timer);
   al_destroy_display(display);
   al_destroy_event_queue(event_queue);
   al_destroy_sample(sample);
   al_destroy_sample(sample1);
   al_destroy_sample(sample2);
   al_destroy_sample(sample3);
   al_destroy_sample(sample4);

   return 0;
}



void menu()
{
   ALLEGRO_BITMAP *menu=NULL;

   menu= al_load_bitmap("imagens/intro.png");
    if(!menu)
        {
        fprintf(stderr, "Falha ao carregar bitmap menu!\n");
        return -1;
    }

    al_draw_bitmap(menu, 0, 0, 0);
    al_flip_display();
    al_rest(8);



}

 

  • Obrigado 1
  • Solução
Postado

Algo assim, acredito:

 bola_pos_x              += bola_vx;

 bola_pos_y              += bola_vy;

treinador_pos_y += treinador_vy;

if (treinador_pos_y < 0) treinador_pos_y = 0;
if (treinador_pos_y >  SCREEN_H) treinador_pos_y = SCREEN_H;
                                              
 pokemon_pos_y  += pokemon_vy;

 if (pokemon_pos_y < 0) pokemon_pos_y = 0;
 if (pokemon_pos_y > SCREEN_H) pokemon_pos_y = SCREEN_H;
                       
 redraw = true;
 			

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!