Ir ao conteúdo

Posts recomendados

Postado
#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>

#include "main.h"

    const int AKPENTE           = 5;
    const int   largura         = 1920;
    const int   altura          = 1080;
    const float FPS             = 60.0;
    int i;


    bool keys[8]={false,false,false,false,false,false,false,false};
    enum KEYS{UP, DOWN, LEFT, RIGHT, SPACE, ESCAPE, J, B};



int main(void)
{
bool redraw = true;
bool acaba = false;



ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *fila = NULL;
ALLEGRO_TIMER *timer = NULL;


if(!al_init())
{fprintf(stderr, "falhou ao inicializar o Allegro!\n");return -1;}


 display = al_create_display(largura,altura);

if(!display)
{fprintf(stderr, "falhou ao inicializar o Allegro!\n");return -1;}

 al_init_primitives_addon();
 al_install_keyboard();


 fila = al_create_event_queue();
 timer = al_create_timer(1.0/FPS);

 al_register_event_source(fila,al_get_keyboard_event_source());
 al_register_event_source(fila,al_get_display_event_source(display));
 al_register_event_source(fila, al_get_timer_event_source(timer));

 al_start_timer(timer);

for(i = 0; i < 5; i++)
	{

		akbala[i].v = 10;
		akbala[i].ativo = false;
	}

while(!acaba)
{
    ALLEGRO_EVENT ev;
    al_wait_for_event(fila,&ev);


    if(ev.type == ALLEGRO_EVENT_TIMER)
   {
        redraw = true;

       if(swat.vidas>0)
       {
           swat.y -= keys[UP] *swat.vup;
           swat.x -= keys[LEFT] *swat.vleft;
           swat.y += keys[DOWN] *swat.vdown;
           swat.x += keys[RIGHT] *swat.vright;
       }
       if(swat.y < 0){swat.y = 0;}
       if(swat.y > altura){swat.y = altura;}
       if(swat.x < 0){swat.x = 0;}
       if(swat.x > largura){swat.x = largura;}

    for(i=0;i< 5;i++)
    {       if(akbala[i].ativo)
		{

			akbala[i].x += akbala[i].v;
			if(akbala[i].x > largura)
				akbala[i].ativo = false;
		}
	}





}



    if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
    {
        switch(ev.keyboard.keycode)
    {
                case ALLEGRO_KEY_ESCAPE:
                keys[ESCAPE] = true;
                break;

                case ALLEGRO_KEY_UP:
                keys[UP] = true;
                break;

                case ALLEGRO_KEY_DOWN:
                keys[DOWN] = true;
                break;

                case ALLEGRO_KEY_RIGHT:
                keys[RIGHT] = true;

                break;

                case ALLEGRO_KEY_LEFT:
                keys[LEFT] = true;

                break;

                case ALLEGRO_KEY_SPACE:
				keys[SPACE] = true;

               for(i=0;i<5;i++)
    {

            if(!akbala[i].ativo)
        {
            akbala[i].x = swat.x + 17;
            akbala[i].y = swat.y;
            akbala[i].ativo = true;

        }
				break;


    }
    }
    }
    else if (ev.type == ALLEGRO_EVENT_KEY_UP)
        {
            switch(ev.keyboard.keycode)
            {

                case ALLEGRO_KEY_UP:
                keys[UP] = false;
                break;

                case ALLEGRO_KEY_ESCAPE:
                keys[ESCAPE] = false;
                break;

                case ALLEGRO_KEY_DOWN:
                keys[DOWN] = false;
                break;

                case ALLEGRO_KEY_RIGHT:
                keys[RIGHT] = false;
                break;

                case ALLEGRO_KEY_LEFT:
                keys[LEFT] = false;
                break;

                case ALLEGRO_KEY_SPACE:
				keys[SPACE] = false;
				break;



      }
    }

//PARA PODER FECHAR O JOGO
    else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
   {
    acaba=true;
   }
if(redraw && al_is_event_queue_empty(fila))
		{
			redraw = false;


	al_draw_filled_rectangle(swat.x, swat.y - 9, swat.x + 10, swat.y - 7, al_map_rgb(255, 0, 0));
	al_draw_filled_rectangle(swat.x, swat.y + 9, swat.x + 10, swat.y + 7, al_map_rgb(255, 0, 0));

	al_draw_filled_triangle(swat.x - 12, swat.y - 17, swat.x + 12, swat.y, swat.x - 12, swat.y + 17, al_map_rgb(0, 255, 0));
	al_draw_filled_rectangle(swat.x - 12, swat.y - 2, swat.x + 15, swat.y + 2, al_map_rgb(0, 0, 255));


          for(i=0;i<5;i++)
{

                if(akbala[i].ativo)
                al_draw_filled_circle(akbala[i].x, akbala[i].y, 2, al_map_rgb(255, 255, 255));


}

            al_flip_display();
		    al_clear_to_color(al_map_rgb(0,0,0));
		}
		}




    al_destroy_event_queue(fila);
	al_destroy_timer(timer);
	al_destroy_display(display);





return 0;
}

Aqui com as structs

/BONECOS CONTROLADOS
struct PLAYER
{
int x,
y,
vidas,
vleft,
vright,
vup,
vdown,
larg_x,
alt_y,
dano;
};

struct PLAYER swat={1920/2,1080/2,100,4,4,4,4,48,62,25};

//PROJETEIS
struct PROJETEIS
{
    bool ativo;
    int v,
     x,
     y;

};

struct PROJETEIS akbala[5];


 

  • Curtir 1
Postado

Na verdade, parece que você atira as 5 balas de uma vez, e como estão todas no mesmo lugar, parece ser uma coisa só. Precisa implementar algo pra dar um delay entre um tiro e outro, talvez dar apenas um tiro a cada key down por exemplo, e só permite um novo tiro depois de soltar a tecla... algo assim:

 

// no key down
case ALLEGRO_KEY_SPACE:
  // se não estava apertado antes, da 1 tiro... se enquanto aperta está true, só volta pra false quando solta, acho que é esse
  // o comportamento pelo que entendi
  if (!keys[SPACE]) {
    for(i=0;i<5;i++) {
      if(!akbala[i].ativo) {
        akbala[i].x = swat.x + 17;
        akbala[i].y = swat.y;
        akbala[i].ativo = true;
        // break pra sair do for só com um tiro dado
        break;
      }
    }
  }
break;

 

Se quiser manter a arma automática, poderia usar uma outra variável para isso, um inteiro weaponDelay por exemplo, que permite o tiro quando está em zero, sobe pra um valor que você determinar e enquanto está pressionado vai diminuindo por exemplo.

 

Outra coisa, não sei se não vai precisar de um outro timer para a lógica das teclas por exemplo, só mexi com o Allegro até a versão 4, mas se por exemplo o evento da tecla vier 1000x por segundo, um toque no teclado pode causar passar diversas vezes no loop e ficar muito rápido a lógica do programa.

  • Curtir 1
Postado
4 horas atrás, dudaskank disse:

Na verdade, parece que você atira as 5 balas de uma vez, e como estão todas no mesmo lugar, parece ser uma coisa só. Precisa implementar algo pra dar um delay entre um tiro e outro, talvez dar apenas um tiro a cada key down por exemplo, e só permite um novo tiro depois de soltar a tecla... algo assim:

 

// no key down
case ALLEGRO_KEY_SPACE:
  // se não estava apertado antes, da 1 tiro... se enquanto aperta está true, só volta pra false quando solta, acho que é esse
  // o comportamento pelo que entendi
  if (!keys[SPACE]) {
    for(i=0;i<5;i++) {
      if(!akbala[i].ativo) {
        akbala[i].x = swat.x + 17;
        akbala[i].y = swat.y;
        akbala[i].ativo = true;
        // break pra sair do for só com um tiro dado
        break;
      }
    }
  }
break;

 

Se quiser manter a arma automática, poderia usar uma outra variável para isso, um inteiro weaponDelay por exemplo, que permite o tiro quando está em zero, sobe pra um valor que você determinar e enquanto está pressionado vai diminuindo por exemplo.

 

Outra coisa, não sei se não vai precisar de um outro timer para a lógica das teclas por exemplo, só mexi com o Allegro até a versão 4, mas se por exemplo o evento da tecla vier 1000x por segundo, um toque no teclado pode causar passar diversas vezes no loop e ficar muito rápido a lógica do programa.

Opa valeu pela dica ,vou dar uma testada aqui, achei que meu metodo iria funcionar, pois fiz basicamente a mesma coisa com os "inimigos"  eles aumentavam conforme o valor colocado no vetor 

  • Curtir 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!