Ir ao conteúdo
  • Cadastre-se

C Movimentação de personagem - Bitmap com Allegro


erique

Posts recomendados

buenas

 

sei que os comandos de movimentação é:

        if(key[key_left]) boneco.x -= 1;
		if(key[key_up])   boneco.y -= 1;
		if(key[key_right])boneco.x += 1;
		if(key[key_down]) boneco.y += 1;

porém como posso fazer esse bitmap do boneco no meu código se movimentar, primeiramente.

 

#include  // biblioteca de entrada e saída de dados
#include  // biblioteca de conversão das strings
#include  // biblioteca de manipulação de caracteres
#include  // biblioteca gráfica
#include  // inclui , dependente do allegro
#define linhas 30 // define a quantidade de linhas da matriz
#define colunas 59 // define a quantidade de colunas da matriz
#define tamanho 18 // define o tamanho do "quadradro" da imagem importada
bitmap *criacaodomapa;
bitmap *boneco;
bitmap *muro;
bitmap *trilha;
bitmap *fundo;

char matriz[linhas][colunas] = {
	  "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttmttttttttttttttttttmtttmtttmttmtttmtttmttmtmmttttmmtmtmtmmmtmtttm",
	  "mmmtmmmtmtmmtmtmmmtttmmmmmmmmmmmmmmmmttmmmtmmmtmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmttttttmtmttttttttttmmmmmmmmmmmmmtmmtmmttttmttmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtmmmmmmmmmmmtmtmmmttttmmmmmmmmmmmtmmttmmmttmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttmmtttttttmmttmmtttmmttmmmtttmmttttmmttmtmmtttttmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmtmtmtmttttttmmtmmmmmttmttmmmtmmttmttmttttmmmmttttttmmmmmmmmmmmm",
	  "mmtttttttmmtmmtmmmmtmmttttttmtmmmmmmmmmmtmmttmmmttttttmmmttmmmmmmmmmmmm",
	  "mmtmmmmmtmmttmmmmmmtmmmmmmmmtmmmmmttttmmttmmtmmmtmmtmmmmmmmtttmmmmmmmmm",
	  "mmtmtttttmmmmttmmmtttmmmmmmtttttttttttttmmmmttmtmmtmmmtttmtmmmmmmmmmmmm",
	  "mmmmtmmmmmmmmtttttttmmmmmmmmtttttttttttmmmmmmmmmmmmmttttmttmmmmmmmmmmmm",
	  "mmtttttmmtmmttmmmmmttmmmtttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmmmmttttmtmmmmmmmtmmmmmmtmmmmmmtttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmttmtmmtmttmmttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtttttmmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmttttmmmmmttmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmtmmtmmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmtmmtmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmtmmttttmtmtmmttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mttttmmmmmtmtmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtttmtttttmtmmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmttmttmmmttttmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmmtmtttttmmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmttttttmmtmmttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtmmmmmtmtmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttmmmmmtmmmmtttttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtttttttmmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmttmmmmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
};

void inicia_alegro() { /* inicialização do allegro */
    allegro_init(); // inicialização do allegro
    install_keyboard(); // instala a função para usar o teclado
    install_mouse(); // instala a função para usar o mouse
    install_timer(); // instala a função de tempo
    set_color_depth(32); // tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(gfx_autodetect_windowed, 1080, 650, 0, 0); // auto decteta o driver de vídeo
    set_window_title("maze escape"); // define o titulo da janela
}

void desenha_o_mapa() /* colocando imagens na matriz */
{
    int i, j;
    for (i=0;ilinhas;i++) {
        for (j=0;jcolunas;j++) {
            if(matriz[i][j]=='t') {
                draw_sprite(criacaodomapa, trilha, j*tamanho, i*tamanho); }
            else if (matriz[i][j]=='m') {
                draw_sprite(criacaodomapa, muro, j*tamanho, i*tamanho);
            }
        }
    }
}

void tela() { /* criando da proporção do mapa em tela*/
    // clear_to_color(nomedomapa, makecol(0, 0, 0)); // limpar mapa em caso de substiição
    blit(criacaodomapa, screen, 0, 0, 2, 80, 1080, 750);
}

void jogar()
{
    // importação das imagens do mapa
    criacaodomapa = create_bitmap(1080, 750); // criando o mapa
    muro = load_bitmap("ffacd56a-7cfa-45e2-aaa7-0ab704711bea.bmp", null);
    boneco = load_bitmap("boneco.bmp", null);
    trilha = load_bitmap("594f655c-0380-4a3b-9237-6dd82ffbd75d.bmp", null);
    /* o null é para definir o padrão do bipmap no sistema de cores */

    // clear_bitmap(criacaodomapa); // comando pra limpar bitmap
    desenha_o_mapa(); // desenhar o mapa na tela
    tela(); // atualização da tela
    draw_sprite(screen,boneco,650,250);
    textprintf_centre_ex(screen, font, screen_w - 500, 10,
        makecol(237, 28, 36), -1,"precione esq a qualquer momento para fechar o programa!");
}

void rankings()
{
    textprintf_centre_ex(screen, font, screen_w - 10, 10,
                           makecol(0, 100, 243), -1,
                           "frase 1");

     textprintf_right_ex(screen, font, screen_w - 500, 200, // coluna e linha
                          makecol(200, 200, 20), -1,
                          "frase 2");

    textprintf_ex(screen, font, screen_w - 500, 500, // coluna e linha
                          makecol(200, 200, 20), -1,
                          "frase 3");

 /* mostra a versão do programa em letras azuis. */
       textout_ex (screen, font, "v4.2.0-beta2", 10, 10,
                  makecol (0, 0, 255), -1);

    textout(screen,font,"testando",60,60, makecol (0,0,246));
}

void creditos()
{

}

void sair()
{

}

menu opcao[] =
{
    { "jogar", jogar},
    { "rankings", rankings},
    { "creditos", creditos},
    { "sair", sair}
};

void inicia_menu(){ /* menu */
    show_mouse(screen); // mostrar mouse na tela
    do_menu(opcao, 375, 375);
}

void finaliza_tudo(){
    // destruição do mapa
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    destroy_bitmap(fundo);
    clear_keybuf(); // limpa buffer do teclado
    return 0;
}

int main()
{
    inicia_alegro();
    inicia_menu();

    /*
     comandos de movimentação
        if(key[key_left]) boneco.x -= 1;
		if(key[key_up])   boneco.y -= 1;
		if(key[key_right])boneco.x += 1;
		if(key[key_down]) boneco.y += 1;
    */
    while(!key[key_esc]) {} // precionar esq para fechar
    finaliza_tudo();
}
end_of_main() /* termina a execução do allegro /*

/* códigos do allegro para fins de consulta
======================================
comando semelhante com printf

       textout_ex (screen, font, "v4.2.0-beta2", 10, 10,
                  makecol (0, 0, 255), -1);

obs¹: o mesmo código abaixo, mas definindo as cordernadas

       textprintf_ex(screen, font, screen_w - 500, 500, // coluna e linha
                  makecol(200, 200, 20), -1,
                    "frase 3");

obs²: o mesmo código para começar de um dos lados,
também pode ser escrito com

textprintf_centre_ex = começa no centro da tela
textprintf_right_ex = começa na direita da tela
======================================
wikis do allegro
http://equipe.nce.ufrj.br/adriano/c/apostila/allegro/docs/funcoes.html
http://geocities.ws/weissengeist/allegro
http://liballeg.org/stabledocs/en/alleg018.html
======================================
*/

continuando a saga @vangodp @benjamin breeg @tysquare89

teste forum.zip

Link para o comentário
Compartilhar em outros sites

BN, alguns pontos interessantes que alguem ira lhe dizer em algum momento:

 

> Faça um 'sprite' de um boneco, pois você precisa de várias imagens, para então armazenar as imagens de acordo com os movimentos, sendo esquerda,direita,cima e baixo.  Nem que seja no Paint xD, aconselho o GIMP

 

> Para automatizar, você pode armazenar os dados em um struct Player, e ir alterando de acordo com as necessidades. Pois você precisa memorizar as coordenadas do jogador e eventualmente sua velocidade/direção.

----

 

Enfim, a lógica: é só você alterar a nova coordenada do jogador, igual você fez com if, e chamar a função para imprimir a imagem nessa nova coordenada, de acordo com o movimento filtrado pela switch/if:

 

 

 recebe a seta 

 if(key[key_left]) {
   boneco.x -= VELOCIDADE;
   //aqui muda direcao do boneco para esquerda, alterando a imagem
 }
 else if(key[key_up]) {
   boneco.y -= VELOCIDADE;
   //aqui muda direcao do boneco para cima, alterando a imagem
 }
 else if(key[key_right]){
   boneco.x += VELOCIDADE;
   //muda direcao do boneco para direita, alterando a imagem
 }
 else if(key[key_down]){
   boneco.y += VELOCIDADE;
   //muda direcao do boneco para baixo, alterando a imagem
 }
 
 depois 
 atualiza tela
 desenha mapa
 desenha boneco

É sempre bom ter várias imagens para os movimentos, assim da uma impressão mais real.

 

Exemplo de sprite:

ninja_sprite_base_by_magdreamer-d2zbdbz.

 

Com base nessas imagens, você pode separá-las em várias OU USAR APENAS UMA E IDENTIFICAR O X e Y , com tamanho 64x64 no máximo, e carregue cada uma com a sua própria váriavel:

 

 boneco_desce = load_bitmap("boneco1.bmp", null);

 boneco_desce = load_bitmap("boneco2.bmp", null);

 boneco_desce = load_bitmap("boneco3.bmp", null);

 

etc...

 

Espero ter cooperado com seu projeto...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

20 horas atrás, TYSQUARE89 disse:

@erique Boa tarde, conseguiu progredir?

Sobre o sprite, vou deixar para depois.

@TYSQUARE89

Fiz  o seguinte,

 

int posicaox = 650;
int posicaoy = 250;

void personagem(){
    if(key[KEY_LEFT]) {
        boneco.x -= VELOCIDADE;
   //aqui muda direcao do boneco para esquerda, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_UP]) {
        boneco.y -= VELOCIDADE;
   //aqui muda direcao do boneco para cima, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
    else if(key[KEY_RIGHT]){
        boneco.x += VELOCIDADE;
   //muda direcao do boneco para direita, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_DOWN]){
        boneco.y += VELOCIDADE;
   //muda direcao do boneco para baixo, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
// draw_sprite(screen,boneco,650+VELOCIDADE,250);
}

Na lógica está no caminho certo?

 

Eu preciso criar algo pra limpar o personagem anteriormente correto?, se não ia ficar desenhando personagem por onde ele passar pelo que estou vendo atualmente.

 

Sobre o boneco.x e boneco.y, essa parte ainda não entendi muito bem, ele me da erro, mas ele já deveria saber a posição de x e y não?

lTTDsCQyQFifwu14ulLgRw.png

 

Teste forum.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu to tentando fazer a colisão do personagem com o muro, mas o exemplo do pacman parece não ser a melhor maneira, toda vez que tento mexer na velocidade ou movimentação do personagem da pane na colisão. Fiz uma modificação do seu programa configurando o ajuste de FPS e o Game Loop, temporariamente tirei o menu, e as msg de texto.

 

#include <allegro.h> // Biblioteca gráfica

#define LINHAS 20 // Define a quantidade de linhas da matriz
#define COLUNAS 31 // Define a quantidade de colunas da matriz
#define TAMANHO 30 // Define o tamanho do "quadradro" da imagem importada

int dir = 4;
int px = 5*6;
int py = 5*6;

BITMAP *buffer;
BITMAP *boneco;
BITMAP *muro;
BITMAP *trilha;

volatile int sair_programa;
void fechar_programa() { sair_programa = TRUE; }
END_OF_FUNCTION(fechar_programa)

volatile long tempo = 0;
void aumenta_tempo() { tempo++; }
END_OF_FUNCTION(aumenta_tempo)

char matriz[LINHAS][COLUNAS]=
{
    "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM",
    "MTTTTTTTTTTTMMMMMTTTTTTTTTTTM",
    "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM",
    "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM",
    "MTTTTTTTTTTTTTTTTTTTTTTTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM",
    "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM",
    "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM",
    "MTTTTTMMTMMMMMMMMMMMTMMTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM",
    "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM",
    "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTMMMTTTTTTTTTTTTTTTTTTTMMMTM",
    "MTMMMTMMMMTMMMMMMMMTMMMTMMMTM",
    "MTMMMTMMMMTTTTTTTTTTMMMTMMMTM",
    "MTTTTTTTTTTMMMMMMMMTTTTTTTTTM",
    "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM",
};

void inicia_alegro()   /* Inicialização do allegro */
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instala a função para usar o teclado
    install_mouse(); // Instala a função para usar o mouse
    install_timer(); // Instala a função de tempo
    set_color_depth(32); // Tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0); // Auto decteta o driver de vídeo
    set_window_title("Maze Escape"); // Define o titulo da janela

    sair_programa = FALSE;
    LOCK_FUNCTION(fechar_programa);
    LOCK_VARIABLE(sair_programa);
    set_close_button_callback(fechar_programa);

    LOCK_VARIABLE(tempo);
    LOCK_FUNCTION(aumenta_tempo);
    install_int_ex(aumenta_tempo, BPS_TO_TIMER(30));
}

void desenha_mapa(BITMAP *Buffer) /* Colocando imagens na matriz */
{
    int i, j;
    for (i=0; i<LINHAS; i++)
    {
        for (j=0; j<COLUNAS; j++)
        {
            if(matriz[i][j]== 'M')
            {
                draw_sprite(buffer, muro, j*TAMANHO, i*TAMANHO);
            }

            else if (matriz[i][j]== 'T')
            {
                draw_sprite(buffer, trilha, j*TAMANHO, i*TAMANHO);
            }
        }
    }
}

void tela()   /* Criando da proporção do mapa em tela*/
{
    // clear_to_color(nomedomapa, makecol(0, 0, 0)); // Limpar mapa em caso de substiição
    draw_sprite(buffer, boneco, px, py);
    blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    clear_bitmap(buffer);
}

void jogar()
{

}

void rankings()
{

}

void creditos()
{

}

void sair()
{

}

void finaliza_tudo()
{
    // Destruição do mapa
    destroy_bitmap(buffer);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    clear_keybuf(); // Limpa buffer do teclado
}

int main()
{
    inicia_alegro();

    // Importação das imagens do mapa
    buffer = create_bitmap(SCREEN_W, SCREEN_H); // Criando o mapa
    muro = load_bitmap("ffacd56a-7cfa-45e2-aaa7-0ab704711bea.bmp", NULL);
    boneco = load_bitmap("boneco.bmp", NULL);
    trilha = load_bitmap("594f655c-0380-4a3b-9237-6dd82ffbd75d.bmp", NULL);

    while(!sair_programa)
    {
        while(tempo > 0)
        {
            if (key[KEY_ESC])
                fechar_programa();

            if(key[KEY_RIGHT])
            {
                dir = 1;
            }
            else if(key[KEY_LEFT])
            {
                dir = 0;
            }
            else if(key[KEY_UP])
            {
                dir = 2;
            }
            else if(key[KEY_DOWN])
            {
                dir = 3;
            }

            if(dir == 0)
            {
                if(matriz[py/30][(px-30)/30] != 'M')
                {
                    px -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 1)
            {
                if(matriz[py/30][(px+30)/30] != 'M')
                {
                    px += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 2)
            {
                if(matriz[(py-30)/30][(px)/30] != 'M')
                {
                    py -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 3)
            {
                if(matriz[(py+30)/30][(px)/30] != 'M')
                {
                    py += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            tempo --;
        }

        desenha_mapa(buffer);
        tela();        

    } // Precionar ESQ para fechar
    finaliza_tudo();
    return 0;
}
END_OF_MAIN()

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Função básica e padrão para colisão 2d:

 

//    __y__
//  _|     |
//x[_]x+w  |x+w
//   |_____|
//     y+h
bool colidiu(int playx, int playy, int objx, int objy){

   if((playx > objx) && (playx + playw <= objx + objw) &&
     (playy > objy) && (playy + playh <= objy + objh)){
      return true;
   }
  return false;
}

 

Lembrando que o teste de colisão é feito apos o usuário enviar a tecla de movimento, então supondo que ele está indo na direção indicada, use essa direção  nos parâmetros da função colidiu(). Digo isso, por que se o player não estiver em cima do objeto, o teste vai falhar, e ele eventualmente ficará um pouco em cima, até que x do player seja > que o x do objeto.

adicionado 38 minutos depois
4 horas atrás, erique disse:

Sobre o sprite, vou deixar para depois.

@TYSQUARE89

Fiz  o seguinte,

 


int posicaox = 650;
int posicaoy = 250;

void personagem(){
    if(key[KEY_LEFT]) {
        boneco.x -= VELOCIDADE;
   //aqui muda direcao do boneco para esquerda, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_UP]) {
        boneco.y -= VELOCIDADE;
   //aqui muda direcao do boneco para cima, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
    else if(key[KEY_RIGHT]){
        boneco.x += VELOCIDADE;
   //muda direcao do boneco para direita, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_DOWN]){
        boneco.y += VELOCIDADE;
   //muda direcao do boneco para baixo, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
// draw_sprite(screen,boneco,650+VELOCIDADE,250);
}

Na lógica está no caminho certo?

 

Eu preciso criar algo pra limpar o personagem anteriormente correto?, se não ia ficar desenhando personagem por onde ele passar pelo que estou vendo atualmente.

 

Sobre o boneco.x e boneco.y, essa parte ainda não entendi muito bem, ele me da erro, mas ele já deveria saber a posição de x e y não?

lTTDsCQyQFifwu14ulLgRw.png

 

Teste forum.zip

Não tinha visto esse post, mas no caso você só usa struct 'boneco' quando o mesmo possui as variáveis x,y ;

em questão de velocidade você pode por a divisão da largura do boneco.

Exemplo, o tamanho da imagem do boneco é 32x64, ai você coloca:

 

#define VELOCIDADE 16

----

 

Como você usa as variáveis posicaox e posicaoy, acho que não é util colocar a struct boneco nesse momento, talvez depois.

ai você só usa as etapas:

 

1 - testa colisão

2 - altera as variaveis posicaox e posicaoy - se não colidiu

3 - drawsprite();

4 - atualiza tela

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@TYSQUARE89 Eu coloquei essas variáveis hoje pra ver se era isso à posicaox e posicaoy, eu queria saber como vou usar-lás

 

Fiz outra modificação, ele rodou agora, mas não apareceu o personagem no mapa, pensei que fosse a ordem de executação, mas estou enganado?

 

int posicaox = 650;
int posicaoy = 250;

void personagem(){
    if(key[KEY_LEFT]) {
        posicaox -= VELOCIDADE;
   //aqui muda direcao do boneco para esquerda, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_UP]) {
        posicaoy -= VELOCIDADE;
   //aqui muda direcao do boneco para cima, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
    else if(key[KEY_RIGHT]){
        posicaox += VELOCIDADE;
   //muda direcao do boneco para direita, alterando a imagem
   draw_sprite(screen,boneco,posicaox+VELOCIDADE,posicaoy);
   posicaox=posicaox+VELOCIDADE;
 }
    else if(key[KEY_DOWN]){
        posicaoy += VELOCIDADE;
   //muda direcao do boneco para baixo, alterando a imagem
   draw_sprite(screen,boneco,posicaox,posicaoy+VELOCIDADE);
   posicaox=posicaoy+VELOCIDADE;
 }
// draw_sprite(screen,boneco,650+VELOCIDADE,250);
}

e no jogar, que é depois do meu menu atual

void jogar()
{
    // Importação das imagens do mapa
    criacaodomapa = create_bitmap(1080, 575); // Criando o mapa
    muro = load_bitmap("muro.bmp", NULL);
    boneco = load_bitmap("boneco1.bmp", NULL);
    trilha = load_bitmap("trilha.bmp", NULL);
    /* O NULL é para definir o padrão do bipmap no sistema de cores */
    personagem();
    desenha_o_mapa(); // Desenhar o mapa na tela
    tela(); // Atualização da tela
    textprintf_centre_ex(screen, font, SCREEN_W - 500, 10,
        makecol(237, 28, 36), -1,"Precione ESQ a qualquer momento para fechar o programa!");
}

 

Teste forum.zip

adicionado 23 minutos depois

@benjamin breeg segui seu exemplo é coloquei no meu código atual, pra ver como ficaria.

 

consegui fazer com o menu, embora eu tenha mais um bug agora, que ele está movendo só pra 1 lado e voltando.

 

#include  // biblioteca de entrada e saída de dados
#include  // biblioteca de conversão das strings
#include  // biblioteca de manipulação de caracteres
#include  // biblioteca gráfica
#include  // inclui , dependente do allegro
#define linhas 30 // define a quantidade de linhas da matriz
#define colunas 59 // define a quantidade de colunas da matriz
#define tamanho 18 // define o tamanho do "quadradro" da imagem importada
#define velocidade 1
bitmap *criacaodomapa;
bitmap *boneco;
bitmap *muro;
bitmap *trilha;

int dir = 4;
int px = 5*6;
int py = 5*6;

volatile int sair_programa;
void fechar_programa() { sair_programa = true; }
end_of_function(fechar_programa)

volatile long tempo = 0;
void aumenta_tempo() { tempo++; }
end_of_function(aumenta_tempo)


char matriz[linhas][colunas] = {
	  "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttmttttttttttttttttttmtttmtttmttmtttmtttmttmtmmttttmmtmtmtmmmtmtttm",
	  "mmmtmmmtmtmmtmtmmmtttmmmmmmmmmmmmmmmmttmmmtmmmtmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmttttttmtmttttttttttmmmmmmmmmmmmmtmmtmmttttmttmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtmmmmmmmmmmmtmtmmmttttmmmmmmmmmmmtmmttmmmttmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttmmtttttttmmttmmtttmmttmmmtttmmttttmmttmtmmtttttmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmtmtmtmttttttmmtmmmmmttmttmmmtmmttmttmttttmmmmttttttmmmmmmmmmmmm",
	  "mmtttttttmmtmmtmmmmtmmttttttmtmmmmmmmmmmtmmttmmmttttttmmmttmmmmmmmmmmmm",
	  "mmtmmmmmtmmttmmmmmmtmmmmmmmmtmmmmmttttmmttmmtmmmtmmtmmmmmmmtttmmmmmmmmm",
	  "mmtmtttttmmmmttmmmtttmmmmmmtttttttttttttmmmmttmtmmtmmmtttmtmmmmmmmmmmmm",
	  "mmmmtmmmmmmmmtttttttmmmmmmmmtttttttttttmmmmmmmmmmmmmttttmttmmmmmmmmmmmm",
	  "mmtttttmmtmmttmmmmmttmmmtttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmmmmttttmtmmmmmmmtmmmmmmtmmmmmmtttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmttmtmmtmttmmttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtttttmmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmttttmmmmmttmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmtmmtmmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmtmmtmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
      "mmtmmttttmtmtmmttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mttttmmmmmtmtmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtttmtttttmtmmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmttmttmmmttttmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmmtmtttttmmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmttttttmmtmmttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtmmmmmtmtmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttmmmmmtmmmmtttttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmtttttttmmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmmttmmmmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
	  "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
};

void inicia_alegro() { /* inicialização do allegro */
    allegro_init(); // inicialização do allegro
    install_keyboard(); // instala a função para usar o teclado
    install_mouse(); // instala a função para usar o mouse
    install_timer(); // instala a função de tempo
    set_color_depth(32); // tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(gfx_autodetect_windowed, 1080, 650, 0, 0); // auto decteta o driver de vídeo
    set_window_title("maze escape"); // define o titulo da janela

    sair_programa = false;
    lock_function(fechar_programa);
    lock_variable(sair_programa);
    set_close_button_callback(fechar_programa);

    lock_variable(tempo);
    lock_function(aumenta_tempo);
    install_int_ex(aumenta_tempo, bps_to_timer(30));
}

void desenha_o_mapa() /* colocando imagens na matriz */
{
    int i, j;
    for (i=0;ilinhas;i++) {
        for (j=0;jcolunas;j++) {
            if(matriz[i][j]=='t') {
                draw_sprite(criacaodomapa, trilha, j*tamanho, i*tamanho); }
            else if (matriz[i][j]=='m') {
                draw_sprite(criacaodomapa, muro, j*tamanho, i*tamanho);
            }
        }
    }
}

void tela() { /* criando da proporção do mapa em tela*/
    // clear_to_color(nomedomapa, makecol(0, 0, 0)); // limpar mapa em caso de substiição
    draw_sprite(criacaodomapa, boneco, px, py);
    blit(criacaodomapa, screen, 0, 0, 2, 80, screen_w, screen_h);
    clear_bitmap(criacaodomapa);
}

void jogar()
{
    // importação das imagens do mapa
    criacaodomapa = create_bitmap(1080, 575); // criando o mapa
    muro = load_bitmap("muro.bmp", null);
    boneco = load_bitmap("boneco1.bmp", null);
    trilha = load_bitmap("trilha.bmp", null);
    /* o null é para definir o padrão do bipmap no sistema de cores */

    desenha_o_mapa(); // desenhar o mapa na tela
    tela(); // atualização da tela
    textprintf_centre_ex(screen, font, screen_w - 500, 10,
        makecol(237, 28, 36), -1,"precione esq a qualquer momento para fechar o programa!");
}

void rankings()
{
    textprintf_centre_ex(screen, font, screen_w - 10, 10,
                           makecol(0, 100, 243), -1,
                           "frase 1");

     textprintf_right_ex(screen, font, screen_w - 500, 200, // coluna e linha
                          makecol(200, 200, 20), -1,
                          "frase 2");

    textprintf_ex(screen, font, screen_w - 500, 500, // coluna e linha
                          makecol(200, 200, 20), -1,
                          "frase 3");

 /* mostra a versão do programa em letras azuis. */
       textout_ex (screen, font, "v4.2.0-beta2", 10, 10,
                  makecol (0, 0, 255), -1);

    textout(screen,font,"testando",60,60, makecol (0,0,246));
}

void creditos()
{

}

void sair()
{

}

menu opcao[] =
{
    { "jogar", jogar},
    { "rankings", rankings},
    { "creditos", creditos},
    { "sair", sair}
};

void inicia_menu(){ /* menu */
    show_mouse(screen); // mostrar mouse na tela
    do_menu(opcao, 375, 375);
}

void finaliza_tudo(){
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    // clear_bitmap(criacaodomapa); // comando pra limpar bitmap
    clear_keybuf(); // limpa buffer do teclado
    return 0;
}

int main()
{
    /*
    inicia_alegro();
    inicia_menu();
    finaliza_tudo();
    while(!key[key_esc]) {} // precionar esq para fechar

    */
    inicia_alegro();
       inicia_menu();
    /*
    criacaodomapa = create_bitmap(1080, 575); // criando o mapa
    muro = load_bitmap("muro.bmp", null);
    boneco = load_bitmap("boneco1.bmp", null);
    trilha = load_bitmap("trilha.bmp", null);

*/
        while(!sair_programa)
    {
        while(tempo > 0)
        {
            if (key[key_esc])
                fechar_programa();

            if(key[key_right])
            {
                dir = 1;
            }
            else if(key[key_left])
            {
                dir = 0;
            }
            else if(key[key_up])
            {
                dir = 2;
            }
            else if(key[key_down])
            {
                dir = 3;
            }

            if(dir == 0)
            {
                if(matriz[py/30][(px-30)/30] != 'm')
                {
                    px -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 1)
            {
                if(matriz[py/30][(px+30)/30] != 'm')
                {
                    px += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 2)
            {
                if(matriz[(py-30)/30][(px)/30] != 'm')
                {
                    py -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 3)
            {
                if(matriz[(py+30)/30][(px)/30] != 'm')
                {
                    py += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            tempo --;
        }

        desenha_o_mapa(criacaodomapa);
        tela();

    } // precionar esq para fechar
    finaliza_tudo();
    return 0;
}
end_of_main() /* termina a execução do allegro /*

 

teste forum.zip

adicionado 25 minutos depois

Achei o probleminha do último bug, rs

 

O tamanho do seu mapa era 30, o meu era 18, estou fazendo as modificações necessárias aqui e já posto

Link para o comentário
Compartilhar em outros sites

Uhuw, já temos um grande progresso nessa parte.

 

CCKzoBxpSX2pceL25BefLQ.png

 

Agora que percebi uma coisa, o bug do menu que ficava a parte no mapa em preto, sumiu, obrigado :)

 

Consegui ajustar no código como fica, muito bacana.

 

Agora fica algumas questões que não consegui encontrar também.

 

1 - é possível diminuir o tamanho do personagem pelo código?, porque mesmo mudando o tamanho dos blocos para 16 exemplo, o personagem continua como veio ao mundo, 32x32.

 

2 - Como faço para o personagem andar somente 1 bloco por vez, em vez de ir até o final da direção que apertei?

 

3 - Estive procurando muito isso, mas não achei nada indicativo, alguém sabe como aumentar a letra do comando abaixo?

    textprintf_centre_ex(screen, font, SCREEN_W - 500, 10,
        makecol(237, 28, 36), -1,"Precione ESQ a qualquer momento para fechar o programa!");

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@erique Como eu nunca tentei usar allegro, pois prefiro o Sdl, não sei te responder detalhadamente como usar as funções, apenas se eu pratica-las. Então, segue algumas informações que eu encontrei:

 

1 - Existe a função stretch_blit, ela serve para esse assunto e da poder de redimensionar a imagem. ( http://slideplayer.com.br/slide/1602885/ )

 

2 - Você precisa arrumar a lógica de movimento do personagem, supondo que:

a ) cada tile tem 32 pixels

b ) o personagem comece em um valor múltiplo de 32 ou 0

 

então use:

posicaox = posicaox+32;

...

nesse caso ele sempre vai ir pro próximo tile da direita;

 

3 - não encontrei muitas informações sobre isso, acho que você precisa pegar uma fonte editada ou alterar a struct FONT

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Para resolver esse problema da fonte, você precisa baixar um programa chamado ttf2pcx, o Allegro 4 não consegue manipular fontes TTF e nem seus atributos. No ttf2pcx você vai configurar os atributos da fonte: itálico, negrito, tamanho e depois manda exportar para um arquivo com formato PCX que você salva na pasta do seu projeto, ai é só carregar as fontes.

 

Lembrando que caso queira usar fontes baixadas na internet, ela precisa ser instalada no Windows para o ttf2pcx reconhecer.

 

https://www.allegro.cc/resource/Tools/Fonts/ttf2pcx

 

fonts.zip

 

#include <allegro.h>

#define Vermelho makecol(255,0,0)
#define Verde makecol(0,255,0)
#define Azul makecol(0,0,255)
#define Amarelo makecol(255,255,0)

#define W 800
#define H 600

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, W, H, 0, 0);

    FONT *Font1 = load_font("font1.pcx", NULL,NULL);
    FONT *Font2 = load_font("font2.pcx", NULL,NULL);

    textout_ex(screen, Font2, "Maze Escape", 100, 100, Amarelo, 0);
    textout_centre_ex(screen, Font1, "Precione ESQ a qualquer momento para fechar o programa!", W/2, H/2, Vermelho, Azul);
    textout_right_ex(screen, Font1, "v4.2.0-beta2", 200, 50, Azul, 0);

    readkey();
    destroy_font(Font1);
    allegro_exit();

    return 0;
}
END_OF_MAIN()

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Benjamin Breeg disse:

Para resolver esse problema da fonte, você precisa baixar um programa chamado ttf2pcx, o Allegro 4 não consegue manipular fontes TTF e nem seus atributos. No ttf2pcx você vai configurar os atributos da fonte: itálico, negrito, tamanho e depois manda exportar para um arquivo com formato PCX que você salva na pasta do seu projeto, ai é só carregar as fontes.

 

Lembrando que caso queira usar fontes baixadas na internet, ela precisa ser instalada no Windows para o ttf2pcx reconhecer.

 

https://www.allegro.cc/resource/Tools/Fonts/ttf2pcx

 

fonts.zip

 


#include <allegro.h>

#define Vermelho makecol(255,0,0)
#define Verde makecol(0,255,0)
#define Azul makecol(0,0,255)
#define Amarelo makecol(255,255,0)

#define W 800
#define H 600

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, W, H, 0, 0);

    FONT *Font1 = load_font("font1.pcx", NULL,NULL);
    FONT *Font2 = load_font("font2.pcx", NULL,NULL);

    textout_ex(screen, Font2, "Maze Escape", 100, 100, Amarelo, 0);
    textout_centre_ex(screen, Font1, "Precione ESQ a qualquer momento para fechar o programa!", W/2, H/2, Vermelho, Azul);
    textout_right_ex(screen, Font1, "v4.2.0-beta2", 200, 50, Azul, 0);

    readkey();
    destroy_font(Font1);
    allegro_exit();

    return 0;
}
END_OF_MAIN()

 

 

Que bacana, que bom que é dessa forma, agora ficou bem mais claro como podemos proceder no caso da fonte :) 

 

Para que serve esse comando no final do código? "readkey();"

 

 

 

 

adicionado 1 minuto depois
18 horas atrás, Benjamin Breeg disse:

Eu to tentando fazer a colisão do personagem com o muro, mas o exemplo do pacman parece não ser a melhor maneira, toda vez que tento mexer na velocidade ou movimentação do personagem da pane na colisão. Fiz uma modificação do seu programa configurando o ajuste de FPS e o Game Loop, temporariamente tirei o menu, e as msg de texto.

 


#include <allegro.h> // Biblioteca gráfica

#define LINHAS 20 // Define a quantidade de linhas da matriz
#define COLUNAS 31 // Define a quantidade de colunas da matriz
#define TAMANHO 30 // Define o tamanho do "quadradro" da imagem importada

int dir = 4;
int px = 5*6;
int py = 5*6;

BITMAP *buffer;
BITMAP *boneco;
BITMAP *muro;
BITMAP *trilha;

volatile int sair_programa;
void fechar_programa() { sair_programa = TRUE; }
END_OF_FUNCTION(fechar_programa)

volatile long tempo = 0;
void aumenta_tempo() { tempo++; }
END_OF_FUNCTION(aumenta_tempo)

char matriz[LINHAS][COLUNAS]=
{
    "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM",
    "MTTTTTTTTTTTMMMMMTTTTTTTTTTTM",
    "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM",
    "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM",
    "MTTTTTTTTTTTTTTTTTTTTTTTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM",
    "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM",
    "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM",
    "MTTTTTMMTMMMMMMMMMMMTMMTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM",
    "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM",
    "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM",
    "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM",
    "MTMMMTTTTTTTTTTTTTTTTTTTMMMTM",
    "MTMMMTMMMMTMMMMMMMMTMMMTMMMTM",
    "MTMMMTMMMMTTTTTTTTTTMMMTMMMTM",
    "MTTTTTTTTTTMMMMMMMMTTTTTTTTTM",
    "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM",
};

void inicia_alegro()   /* Inicialização do allegro */
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instala a função para usar o teclado
    install_mouse(); // Instala a função para usar o mouse
    install_timer(); // Instala a função de tempo
    set_color_depth(32); // Tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0); // Auto decteta o driver de vídeo
    set_window_title("Maze Escape"); // Define o titulo da janela

    sair_programa = FALSE;
    LOCK_FUNCTION(fechar_programa);
    LOCK_VARIABLE(sair_programa);
    set_close_button_callback(fechar_programa);

    LOCK_VARIABLE(tempo);
    LOCK_FUNCTION(aumenta_tempo);
    install_int_ex(aumenta_tempo, BPS_TO_TIMER(30));
}

void desenha_mapa(BITMAP *Buffer) /* Colocando imagens na matriz */
{
    int i, j;
    for (i=0; i<LINHAS; i++)
    {
        for (j=0; j<COLUNAS; j++)
        {
            if(matriz[i][j]== 'M')
            {
                draw_sprite(buffer, muro, j*TAMANHO, i*TAMANHO);
            }

            else if (matriz[i][j]== 'T')
            {
                draw_sprite(buffer, trilha, j*TAMANHO, i*TAMANHO);
            }
        }
    }
}

void tela()   /* Criando da proporção do mapa em tela*/
{
    // clear_to_color(nomedomapa, makecol(0, 0, 0)); // Limpar mapa em caso de substiição
    draw_sprite(buffer, boneco, px, py);
    blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    clear_bitmap(buffer);
}

void jogar()
{

}

void rankings()
{

}

void creditos()
{

}

void sair()
{

}

void finaliza_tudo()
{
    // Destruição do mapa
    destroy_bitmap(buffer);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    clear_keybuf(); // Limpa buffer do teclado
}

int main()
{
    inicia_alegro();

    // Importação das imagens do mapa
    buffer = create_bitmap(SCREEN_W, SCREEN_H); // Criando o mapa
    muro = load_bitmap("ffacd56a-7cfa-45e2-aaa7-0ab704711bea.bmp", NULL);
    boneco = load_bitmap("boneco.bmp", NULL);
    trilha = load_bitmap("594f655c-0380-4a3b-9237-6dd82ffbd75d.bmp", NULL);

    while(!sair_programa)
    {
        while(tempo > 0)
        {
            if (key[KEY_ESC])
                fechar_programa();

            if(key[KEY_RIGHT])
            {
                dir = 1;
            }
            else if(key[KEY_LEFT])
            {
                dir = 0;
            }
            else if(key[KEY_UP])
            {
                dir = 2;
            }
            else if(key[KEY_DOWN])
            {
                dir = 3;
            }

            if(dir == 0)
            {
                if(matriz[py/30][(px-30)/30] != 'M')
                {
                    px -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 1)
            {
                if(matriz[py/30][(px+30)/30] != 'M')
                {
                    px += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 2)
            {
                if(matriz[(py-30)/30][(px)/30] != 'M')
                {
                    py -= 30;
                }
                else
                {
                    dir = 4;
                }
            }

            if(dir == 3)
            {
                if(matriz[(py+30)/30][(px)/30] != 'M')
                {
                    py += 30;
                }
                else
                {
                    dir = 4;
                }
            }

            tempo --;
        }

        desenha_mapa(buffer);
        tela();        

    } // Precionar ESQ para fechar
    finaliza_tudo();
    return 0;
}
END_OF_MAIN()

 

 

Poderia comentar por favor todo esse código que você postou, para fins de consulta e para mim poder comentar no meu também, gosto de deixar tudo comentado para que todos que peguem consigam entender o que cada parte faz, mesmo sem saber a linguagem em si.

adicionado 4 minutos depois

@TYSQUARE89

 

14 horas atrás, TYSQUARE89 disse:

@erique Como eu nunca tentei usar allegro, pois prefiro o Sdl, não sei te responder detalhadamente como usar as funções, apenas se eu pratica-las. Então, segue algumas informações que eu encontrei:

 

1 - Existe a função stretch_blit, ela serve para esse assunto e da poder de redimensionar a imagem. ( http://slideplayer.com.br/slide/1602885/ )

 

2 - Você precisa arrumar a lógica de movimento do personagem, supondo que:

a ) cada tile tem 32 pixels

b ) o personagem comece em um valor múltiplo de 32 ou 0

 

então use:

posicaox = posicaox+32;

...

nesse caso ele sempre vai ir pro próximo tile da direita;

 

3 - não encontrei muitas informações sobre isso, acho que você precisa pegar uma fonte editada ou alterar a struct FONT

 

1 - Obrigado irei pesquisar sobre ela hoje na medida do possível.

 

2 - Entendi o objetivo, mas poderia me dar um exemplo de como ficaria organizando isso no código?

 

3 - Nosso outro amigo Benjamin já deu uma resposta satisfatória sobre isso, obrigado :) 

Link para o comentário
Compartilhar em outros sites

Consegui adaptar a colisão de Caixa e Pixel Perfeito do Anderson Urbano para o boneco não conseguir transpassar o bloco e ter algum controle como mudar a velocidade por ex. A movimentação ficou bem fluida, depois eu vejo como adaptar pra funcionar dentro do mapa de tile.

 

OBS: Atualiza seu código, corrigi o problema na atualização do Loop.

 

#include <allegro.h>

#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))

int dir = 360;
int velPlayer = 3;

///MÉTODO PIXEL PERFECT
int pixel_perfect_colision(int x1, int y1, BITMAP* obj1, int x2, int y2, BITMAP* obj2)
{
    int i, j;
    int colisao = FALSE;

    //Se os retângulos estiverem se intersectando
    if(!( (x1 > x2 + obj2->w) || (y1 > y2 + obj2->h) || (x2 > x1 + obj1->w) || (y2 > y1 + obj1->h) ))
    {
        int cima = max(y1, y2);
        int baixo = min(y1 + obj1->h, y2 + obj2->h);
        int esquerda = max(x1, x2);
        int direita = min(x1 + obj1->w, x2 + obj2->w);

        for(i = cima; i < baixo && !colisao; i++)
        {
            for(j = esquerda; j < direita && !colisao; j++)
            {
                if(getpixel(obj1, j-x1, i-y1) != makecol(255,0,255) && getpixel(obj2, j-x2, i-y2) != makecol(255,0,255))
                    colisao = TRUE;
            }
        }
    }

    return colisao;
}

///MÉTODO DE CAIXAS DE COLISÃO
int bounding_box_collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if( (x1 > x2 + w2) || (y1 > y2 + h2) || (x2 > x1 + w1) || (y2 > y1 + h1) )
        return FALSE;
    else
        return TRUE;
}

volatile int exit_program;
void fecha_programa()
{
    exit_program = TRUE;
}
END_OF_FUNCTION(fecha_programa)

volatile int ticks;
void tick_counter()
{
    ticks++;
}
END_OF_FUNCTION(tick_counter)

int main()
{
    allegro_init();
    install_timer();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
    set_window_title("Tutorial 15 - Colisoes");

    exit_program = FALSE;
    LOCK_FUNCTION(fecha_programa);
    LOCK_VARIABLE(exit_program);
    set_close_button_callback(fecha_programa);

    ticks = 0;
    LOCK_FUNCTION(tick_counter);
    LOCK_VARIABLE(ticks);
    install_int_ex(tick_counter, BPS_TO_TIMER(60));

    ///BITMAPS
    BITMAP* buffer = create_bitmap(SCREEN_W, SCREEN_H);
    BITMAP* objeto1 = load_bitmap("boneco.bmp", NULL);
    BITMAP* objeto2 = load_bitmap("muro.bmp", NULL);

    ///Variáveis
    int x1 = 150;
    int y1 = 150;
    int x2 = 400;
    int y2 = 300;

    ///GAME LOOP
    while(!exit_program)
    {
        while(ticks > 0 && !exit_program)
        {
            ///INPUT
            if(key[KEY_ESC])
                fecha_programa();

            ///Movimentação
            if(key[KEY_UP])
            {
                y1 -= velPlayer;
                dir = 90;
            }

            if(key[KEY_DOWN])
            {
                y1 += velPlayer;
                dir = 270;
            }

            if(key[KEY_LEFT])
            {
                x1 -= velPlayer;
                dir = 180;
            }

            if(key[KEY_RIGHT])
            {
                x1 += velPlayer;
                dir = 360;
            }

            ticks--;
        }

        ///DRAW

        //if(pixel_perfect_colision(x1, y1, objeto1, x2, y2, objeto2) == TRUE)
        if(bounding_box_collision(x1, y1, objeto1->w, objeto1->h, x2, y2, objeto2->w, objeto2->h) == TRUE)
        {
            if (dir == 180)
            {
                x1 += velPlayer;
            }

            if (dir == 90)
            {
                y1 += velPlayer;
            }

            if (dir == 360)
            {
                x1 -= velPlayer;
            }

            if (dir == 270)
            {
                y1 -= velPlayer;
            }

        }
        draw_sprite(buffer, objeto2, 400, 300);
        draw_sprite(buffer, objeto1, x1, y1);
        draw_sprite(screen, buffer, 0, 0);
        clear_to_color(buffer, makecol(255,255,255));
    }

    ///FINALIZAÇÂO
    destroy_bitmap(buffer);
    destroy_bitmap(objeto1);
    destroy_bitmap(objeto2);

    return 0;
}
END_OF_MAIN();

 

 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

20 horas atrás, TYSQUARE89 disse:

Para fazer o boneco atravessar/passar por debaixo do tile é necessário implementar layers(camadas) no mapa.

@TYSQUARE89 Men, eu estou tentando implementar no meu código de acordo com o que me foi apresentado, mas está dando erro para compilar, na última linha.

 

Pelo que eu pesquisei,o erro geralmente é dado por falta do "}" do main, revisei tudo que mexi e não achei o erro, help?

 

eO3HzkJyQRO9cTFw32LiKA.png

Teste forum.zip

adicionado 0 minutos depois

error: expected declaration or statement at end of imput

adicionado 2 minutos depois

@Benjamin Breeg Tentando implementar, no meu caso eu coloquei essa parte onde você desenhou somemnte o personagem é o muro.


        }
        //draw_sprite(buffer, objeto2, 400, 300);
        //draw_sprite(buffer, objeto1, x1, y1);
        //draw_sprite(screen, buffer, 0, 0);
        //clear_to_color(buffer, makecol(255,255,255));
        desenha_o_mapa(criacaodomapa);
        tela();
    }

Está correto nessa lógica?

adicionado 7 minutos depois

@Benjamin Breeg Outra coisa, não entendi essa parte aqui mestre.

///MÉTODO PIXEL PERFECT
int pixel_perfect_colision(int x1, int y1, BITMAP* obj1, int x2, int y2, BITMAP* obj2)
{
    int i, j;
    int colisao = FALSE;

    //Se os retângulos estiverem se intersectando
    if(!( (x1 > x2 + obj2->w) || (y1 > y2 + obj2->h) || (x2 > x1 + obj1->w) || (y2 > y1 + obj1->h) ))
    {
        int cima = max(y1, y2);
        int baixo = min(y1 + obj1->h, y2 + obj2->h);
        int esquerda = max(x1, x2);
        int direita = min(x1 + obj1->w, x2 + obj2->w);

        for(i = cima; i < baixo && !colisao; i++)
        {
            for(j = esquerda; j < direita && !colisao; j++)
            {
                if(getpixel(obj1, j-x1, i-y1) != makecol(255,0,255) && getpixel(obj2, j-x2, i-y2) != makecol(255,0,255))
                    colisao = TRUE;
            }
        }
    }

    return colisao;
}

Mais especificamente com esse obj1 e obj2, pelo que vi, ele não foi declarado anteriormente, sendo um BITMAP, ele tem a única função de não deixar o boneco adentrar ao muro?

 

Para minha adaptação eu preciso mudar ele?, ainda não consegui compilar, pelo erro a cima, para verificar.

Link para o comentário
Compartilhar em outros sites

Cara você tem que assistir os tutoriais do Anderson para entender essas funções, procure por bounding box no google tem muita coisa.

 

 

Esse erro é porque esta falando algum chave, parêntese, eu sugiro que você de uma limpeza no código e tente implementar pouco a pouco as funções , seu código já esta ficando tão confuso que nem você deve estar entendendo mais hehe.

 

Essa semana eu to agarrado, pouco tempo pra ficar no PC, fim de semana ou quando der eu tento desenvolver mais alguma coisa. To longe de ser mestre, ate pouco atrás eu só via a penumbra do console do Windows, pouco tempo que comecei a mexer com parte gráfica, escolhi o Allegro 4 por ele ser mais simples de aprender e pegar os fundamentos iniciais.

 

Link para o comentário
Compartilhar em outros sites

@Benjamin Breeg @Benjamin Breeg Consegui adaptar ao meu código.

 

Achei o probleminha que estava dando pra compilar, tinha comentado uma "}" mesmo, sem querer.

 

Reorganizei o código, para facilitar a leitura e a visualização mais bonita digamos.

 

Agora meu personagem está conseguindo andar livremente, o mapa parece estar só de fundo agora, ele está atravessando todos os objetos.

 

Acredito que seja só a ordem de executamento nesse caso, mas olhando o código alguém consegue visualizar em qual parte os códigos abaixo devem ir.

 

        desenha_o_mapa(); // Desenhao mapa
        tela(); // Atualiza o mapa da tela

 

Movimentação.zip

Link para o comentário
Compartilhar em outros sites

@erique então, dei uma estudada rápida no código e acabei alterando algumas coisas, creio que certa parte pode ser reutilizada. Até porque eventualmente você vai precisar trabalhar com objetos em struct, mapas com camadas(esse é essencial o uso de arquivos, ou xml). Enfim segue o código:

/* MAZE */
#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <allegro.h> // Biblioteca gráfica

#define TAMANHO 25 // Define o tamanho do "quadradro" da imagem importada
#define LINHAS 36 // define a quantidade de linhas da matriz
#define COLUNAS 72 // define a quantidade de colunas da matriz

#define DIR_UP 101
#define DIR_DOWN 102
#define DIR_LEFT 103
#define DIR_RIGHT 104

#define MZVERSION "v1.0-beta"

//Variáveis Globais
BITMAP *criacaodomapa;
BITMAP *boneco;
BITMAP *muro;
BITMAP *trilha;

int x1 = 10;
int y1 = 0;
int x2 = 400;
int y2 = 300;

int velPlayer = 6;
int dir = 0;

//Mapa
char matriz[LINHAS][COLUNAS] = {
          "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttmttttttttttttttttttmtttmtttmttmtttmtttmttmtmmttttmmtmtmtmmmtmtttm",
          "mmmtmmmtmtmmtmtmmmtttmmmmmmmmmmmmmmmmttmmmtmmmtmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttttmtmttttttttttmmmmmmmmmmmmmtmmtmmttttmttmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtmmmmmmmmmmmtmtmmmttttmmmmmmmmmmmtmmttmmmttmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttmmtttttttmmttmmtttmmttmmmtttmmttttmmttmtmmtttttmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmtmtmtmttttttmmtmmmmmttmttmmmtmmttmttmttttmmmmttttttmmmmmmmmmmmm",
          "mmtttttttmmtmmtmmmmtmmttttttmtmmmmmmmmmmtmmttmmmttttttmmmttmmmmmmmmmmmm",
          "mmtmmmmmtmmttmmmmmmtmmmmmmmmtmmmmmttttmmttmmtmmmtmmtmmmmmmmtttmmmmmmmmm",
          "mmtmtttttmmmmttmmmtttmmmmmmtttttttttttttmmmmttmtmmtmmmtttmtmmmmmmmmmmmm",
          "mmmmtmmmmmmmmtttttttmmmmmmmmtttttttttttmmmmmmmmmmmmmttttmttmmmmmmmmmmmm",
          "mmtttttmmtmmttmmmmmttmmmtttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmmmmttttmtmmmmmmmtmmmmmmtmmmmmmtttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmttmtmmtmttmmttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtttttmmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttmmmmmttmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmtmmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmtmmtmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmttttmtmtmmttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mttttmmmmmtmtmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtttmtttttmtmmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmttmttmmmttttmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmmtmtttttmmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttttmmtmmttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtmmmmmtmtmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttmmmmmtmmmmtttttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtttttttmmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmttmmmmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"};

/** Prototipos */
void inicia_alegro();
void desenha_o_mapa();
void tela();
int key_event();


/** INICIO DE FUNÇÕES DO MENU */
/** Iniciar interface de jogo - secao mapa/personagem */
int jogar(){
    // Buffer do mapa
    criacaodomapa = create_bitmap(SCREEN_W, SCREEN_H);

    // Importa imagens
    muro = load_bitmap("muro.bmp", NULL);
    boneco = load_bitmap("boneco.bmp", NULL);
    trilha = load_bitmap("trilha.bmp", NULL);

    //Desenho inicial
    desenha_o_mapa();
    tela();
}

/** Interface de rankings */
int rankings(){
    textprintf_centre_ex(screen, font, SCREEN_W - 10, 10, makecol(0, 100, 243), -1, "Frase 1");
    textprintf_right_ex(screen, font, SCREEN_W - 500, 200, makecol(200, 200, 20), -1, "Frase 2");
    textprintf_ex(screen, font, SCREEN_W - 500, 500, makecol(200, 200, 20), -1, "Frase 3");
    textout_ex (screen, font, MZVERSION, 10, 10, makecol (0, 0, 255), -1);
}

/** Tela de creditos */
int creditos()
{
    //...
}

/** Interrupção do jogo */
int sair()
{
    //...
}
/** Menu inicial */
MENU opcao[] =
{
    { (char *)"JOGAR", &jogar},
    { (char *)"RANKINGS", &rankings},
    { (char *)"CREDITOS", &creditos},
    { (char *)"SAIR", &sair}
};

/** Inicia fase do menu */
void inicia_menu(){
    show_mouse(screen);
    do_menu(opcao, 375, 375);
}
/** FIM DE FUNÇÕES DO MENU */


void finaliza_tudo(){
    //libera memória
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);

    //limpeza de buffer
    clear_keybuf();
}


#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))

/**
  * Teste de colisão 2d
  * TRUE = colidiu
  * FALSE = sem colisao
  */
int colidiu(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if (x1 < x2 + w2 &&
        x1 + w1 > x2 &&
        y1 < y2 + h2 &&
        h1 + y1 > y2) {
            printf("colidiu!\n");
            return TRUE;
        }
        return FALSE;
}

/** Funções voláteis */
volatile int exit_program = FALSE;
void fecha_programa()
{
    exit_program = TRUE;
}
END_OF_FUNCTION(fecha_programa)

volatile int ticks = 1;
void tick_counter()
{
    ticks++;
}
END_OF_FUNCTION(tick_counter)


/**
  * inicializaçãoo de programa
  */
int main(){
    //flags/temp's
    int move = FALSE, x = 10,y = 0, evout = 0;

    //init
    inicia_alegro();
    inicia_menu();

    //Tranca de funcão/variavel
    LOCK_FUNCTION(fecha_programa);
    LOCK_VARIABLE(exit_program);
    set_close_button_callback(fecha_programa);

    LOCK_FUNCTION(tick_counter);
    LOCK_VARIABLE(ticks);
    install_int_ex(tick_counter, BPS_TO_TIMER(60));

    //Game Loop
    while(!exit_program)
    {
        //Eventos
        while(ticks > 0 && !exit_program)
        {
            //filtro de teclas/eventos - recebe flag
            evout = key_event();
            
            //Se for de movimento - altera variaveis de teste
            if(evout == DIR_UP   ||
               evout == DIR_DOWN ||
               evout == DIR_LEFT ||
               evout == DIR_RIGHT){
                    move = true;
                    switch(evout){
                    case DIR_UP:
                    y -= velPlayer;
                    break;

                    case DIR_DOWN:
                    y += velPlayer;
                    break;

                    case DIR_LEFT:
                    x -= velPlayer;
                    break;

                    case DIR_RIGHT:
                    x += velPlayer;
                    break;

                    default:
                    break;
                }
            }
            ticks--;
        }

        //Teste de colisao/movimento
        if(move){//
            move = colidiu(x, y, boneco->w, boneco->h, x2, y2, muro->w, muro->h);
            if(!move){
                // novas coordendas
                x1 = x;
                y1 = y;
                desenha_o_mapa();
                tela();
            }else {
                // coordenadas antigas 
                x = x1;
                y = y1;
            }

            //reseta
            dir = 0;
            move = FALSE;
         }
        }
    finaliza_tudo();
    return 0;
}
END_OF_MAIN()



/**
 * Escopo das funções
 */
int key_event() {
    //saida de programa
    if(key[KEY_ESC]) fecha_programa();
    //movimento
    else if(key[KEY_UP]) return DIR_UP;
    else if(key[KEY_DOWN]) return DIR_DOWN;
    else if(key[KEY_LEFT]) return DIR_LEFT;
    else if(key[KEY_RIGHT]) return DIR_RIGHT;
    return -1;
}

void inicia_alegro() {
    allegro_init();

    install_keyboard();
    install_mouse();
    install_timer();

    set_color_depth(32); // Tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 1080, 650, 0, 0); // Auto decteta o driver de vídeo
    set_window_title("Maze Escape");

}

void desenha_o_mapa()
{
    for (int i=0;i<LINHAS;i++) {
        for (int j=0;j<COLUNAS;j++) {
            if(matriz[i][j]=='t') {
                draw_sprite(criacaodomapa, trilha, j*TAMANHO, i*TAMANHO); }
            else if (matriz[i][j]=='m') {
                draw_sprite(criacaodomapa, muro, j*TAMANHO, i*TAMANHO);
            }
        }
    }
}


/** Atualiza tela */
void tela() {
    draw_sprite(criacaodomapa, boneco, x1, y1);
    blit(criacaodomapa, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    clear_bitmap(criacaodomapa);
}

 

P.S: Ele ta para linux, então adiciona as includes para windows.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Eu acho que não tem o arquivo de fonte, como compilei com:

g++ jogo.cpp -o jogo  `pkg-config --libs allegro`

não sei se implementou o arquivo de fonte do sistema.

 

dc.zip < só tem as imagens

 

Obrigado, mas ainda acho que podemos implementar classes e headers, deixar mais limpo o código.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

8 horas atrás, Benjamin Breeg disse:

Aqui ta apresentando problemas o exe, deve ser a font e bmp, tentei usar os que tinha aqui mas não deu certo,você pode enviar os bmp e os arquivos de fonte que usou?

 

Ficaram excelentes a limpeza e as implementações que você fez no código, muito obrigado.

 

 

Pensei que era só o meu, quando eu compilei, travou também

adicionado 58 minutos depois

@Benjamin Breeg @TYSQUARE89 Consegui realizar as modificações, fiz os ajustes e alterações necessárias.

 

Antes de iniciar a movimentação do personagem, ele fica com essa telinha preta que eu tive problema inicialmente, mas é só começar a mover que atualiza a tela.

 

Ainda não descobri, o porque do boneco está passando em cima de todos os blocos, em vez dele não deixar passar caso colisão com o muro. Vou da uma pesquisada e ver se acha alguma coisa à respeito.

Movimentação - testes.zip

Link para o comentário
Compartilhar em outros sites

Da uma olhada nesse código que eu estava trabalhando, eu tinha simplificado umas coisas inclusive o método de colisão modificando o array, ela é um inteiro de números mas coloquei um define para M0 e T1, esta tudo em if/else if sem precisar de funções. Lembrando que é só um esboço, é melhor colocar o foco na versão do TYSQUARE89 que esta mais organizada e usa as funções de colisão e movimentação mais aprimoradas.

 

maze.zip

 

Eu estou tentando tirar algumas ideias desse código aqui que encontrei no YouTube mas os caras acho que são da indonésia, código confuso, repetitivo, é difícil saber o que faz cada coisa. Porém esta bem completinho tem princesa, monstros, troca de mapa, menu etc etc. Vale a pena gastar um tempo e aprimorar.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Benjamin Breeg Legal legal, implementei junto com o que tenho, é agora o resultado ficou legal ao meu ver.

 

Vou ver o vídeo pra aprender também, parece bem completo o código do vídeo.

Uhuw.zip

Movimentação - Certo v1 - Cópia.zip

adicionado 1 minuto depois

Só tem um probleminha, que ele está travando quando vai em uma opção diferente de jogar, após abrir.

Link para o comentário
Compartilhar em outros sites

Legal você ter feito as modificacoes na versão do TYSQUARE89 para rodar no Windows, tem que ver com ele se la esta colidindo com todo os blocos, aqui apenas colidiu com um bloco. A vantagem desse método ai eh que a colisão funciona para todos os elementos do array. A noite eu vejo esse problema que você relatou mas acho que tem que usar um sistema de telas como os caras usaram no vídeo, so que eles usaram tipo cada mapa é uma função e nessa função faz todo a configuração de tela, desenho tudo novamente. Existem formas melhores de fazer isso.

 

Mas uma dica que dou e que não tente copiar e colar, leia cada linha, tente entender o que foi feito e implemente no seu código sempre fazendo alguma melhoria. Se entrar nessa de copy and paste o código pode funcionar mas vira uma bomba relógio.

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Eu vi aquele vídeo, e no inicio notei que usam imagens para o menu, então fiz nossa versão, segue:

/* MAZE */
#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <allegro.h> // Biblioteca gráfica
#include <string.h>
#include <malloc.h> // Uso de memória dinâmica

//Configurações
#define TAMANHO 25 
#define LINHAS 36 // 768 / 32px p/ tile
#define COLUNAS 72 // 1024 / 32px p/ tile

//Direções
#define DIR_UP 101
#define DIR_DOWN 102
#define DIR_LEFT 103
#define DIR_RIGHT 104

//Info
#define MZVERSION "v1.0-beta"





//Buffer
BITMAP *criacaodomapa;

//Map/Player
BITMAP *boneco;
BITMAP *muro;
BITMAP *trilha;

//Váriaveis globais
int x1 = 10;
int y1 = 0;
int x2 = 400;
int y2 = 300;

int velPlayer = 6;
int dir = 0;


//Mapa
char matriz[LINHAS][COLUNAS] = {
          "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttmttttttttttttttttttmtttmtttmttmtttmtttmttmtmmttttmmtmtmtmmmtmtttm",
          "mmmtmmmtmtmmtmtmmmtttmmmmmmmmmmmmmmmmttmmmtmmmtmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttttmtmttttttttttmmmmmmmmmmmmmtmmtmmttttmttmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtmmmmmmmmmmmtmtmmmttttmmmmmmmmmmmtmmttmmmttmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttmmtttttttmmttmmtttmmttmmmtttmmttttmmttmtmmtttttmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmtmtmtmttttttmmtmmmmmttmttmmmtmmttmttmttttmmmmttttttmmmmmmmmmmmm",
          "mmtttttttmmtmmtmmmmtmmttttttmtmmmmmmmmmmtmmttmmmttttttmmmttmmmmmmmmmmmm",
          "mmtmmmmmtmmttmmmmmmtmmmmmmmmtmmmmmttttmmttmmtmmmtmmtmmmmmmmtttmmmmmmmmm",
          "mmtmtttttmmmmttmmmtttmmmmmmtttttttttttttmmmmttmtmmtmmmtttmtmmmmmmmmmmmm",
          "mmmmtmmmmmmmmtttttttmmmmmmmmtttttttttttmmmmmmmmmmmmmttttmttmmmmmmmmmmmm",
          "mmtttttmmtmmttmmmmmttmmmtttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmmmmttttmtmmmmmmmtmmmmmmtmmmmmmtttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmttmtmmtmttmmttttttttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtttttmmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttmmmmmttmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmtmmmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmtmmtmtmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmttttmtmtmmttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mttttmmmmmtmtmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtttmtttttmtmmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmttmttmmmttttmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmmtmtttttmmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmttttttmmtmmttttttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtmmmmmtmtmmmttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttmmmmmtmmmmtttttmttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmtttttttmmmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmmttmmmmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mttttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmtttmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mmtmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttm",
          "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"};

/** Prototipos */
/* allegro */
void inicia_alegro();
/* draw */
void desenha_o_mapa();
void tela();
/* event in game */
int key_event();

/** FUNÇÕES/SISTEMA DO MENU */

//Eventos
#define MENU_SEL_DOWN 201
#define MENU_SEL_UP 202
#define MENU_SEL_ENTER 203

//Prototipos
BITMAP *crmenu;
int exit_menu = 0;
volatile int exit_program = FALSE;
volatile int ticks = 0;


int jogar();
int creditos();
int rankings();

void menu_draw(struct MenuObject *);
void menu_action_filter(struct MenuObject *, int);
void menu_event_loop(struct MenuObject *);


/* Items de menu */
typedef struct MenuItem {
	BITMAP *buffer; // buffer da imagem
	char action;    // acao por char, usar switch
	char *arquivo;  // caminho de imagem
	int x,y;	// coordenadas
}mItem;

/* Objeto do sistema do menu */
struct MenuObject{
	private:
		//Váriaveis principais
		mItem **items;     // itens do menu
		int count;    	  // contagem de itens
		
		//Selector de item
		BITMAP *sel_buffer; // buffer da imagem
		char *selector_img; // imagem do seletor
		int selector_id;    // para onde o seletor esta apontando
		int dist_sel_x;     // distancia da imagem do item, use 0 para ficar ao lado 
	public:
	MenuObject() {
		count = 0;
		items = NULL;
		sel_buffer = NULL;
		selector_img = NULL;
		selector_id = 0;
		dist_sel_x = 0;
	}
	
	//Adiciona item para struct	
	int additem(const char *file, char unique_action_id, int x, int y){
		//Verifica se o id da acao existe
		if(!action_find(unique_action_id)){
			if(!items){
				items = (mItem **) malloc (sizeof(mItem*)*15);
			}
			items[count] = (mItem *) malloc (sizeof(mItem));
			if(items[count] != NULL){
				// cópia de dados
				items[count]->arquivo = (char *) malloc (sizeof(char)*strlen(file));
				strcpy(items[count]->arquivo, file);
				items[count]->buffer = NULL;
				items[count]->action = unique_action_id;
				items[count]->x = x;
				items[count++]->y = y;
			}
			return TRUE;//adicionado
		}
		return FALSE;//nao adicionado
	}
	
	//Adiciona o seletor do menu
	void addselector(const char *file, int start_id, int set_distance_x){
		selector_img = (char *) malloc (sizeof(char)*strlen(file));
		if(selector_img){
			//copia de dados
			sel_buffer = NULL;
			strcpy(selector_img, file);
			selector_id = start_id;
			dist_sel_x = set_distance_x;
		}
	}

        //Muda opção para baixo
	int selector_down(){
		if((selector_id + 1) >= count){
                        return -1;
                }
                else {
                        selector_id += 1;
                }
                return selector_id;
        }

        //Muda opção para cima
        int selector_up(){
                if((selector_id - 1) < 0 || count == 0)
                        return -1;
                else {
                        selector_id -= 1;
                }
                return selector_id;
        }

        //Verifica se id da acao ja existe!
        int action_find(char x){
                for(int i = 0; i < count; i++){
                        if(items[i]->action == x){
                                return TRUE;
                        }
                }
                return FALSE;
        }

        //Retorna contagem de itens
        int get_count(){
                return count;
        }
	
	//Carrega imagem e retorna item
	MenuItem *load_item_buffer(int id){
		if(items[id]){
			printf("!dd\n");
			if(!items[id]->buffer && items[id]->arquivo){
				items[id]->buffer = load_bitmap(items[id]->arquivo, NULL);
				return items[id]; 
			}else if(items[id]->buffer){
				return items[id];
			}
		}
		return NULL;
	}

	//Selector
	//Retorna o action onde o indicador esta
	char action_get(){
		return items[selector_id]->action;
	}
	
	BITMAP *load_sel_buffer(){
		if(!sel_buffer){
                	sel_buffer = load_bitmap(selector_img, NULL);
			printf("%s %d %d!\n",selector_img);
                        return sel_buffer;
                }else if(sel_buffer){
                        return sel_buffer;
                }
		printf("err\n");
		return NULL;
	}

	int dist_sel_xget(){
		return dist_sel_x;
	}
};


/* Cria menu no estilo do maze */
int _menu_maze(MenuObject *menu){
	if(menu){    
		crmenu = create_bitmap(SCREEN_W, SCREEN_H); // Criando o mapa

		menu->addselector("img/selector.bmp", 0, 10);
		// x = ultimo_x + img.w
		menu->additem("img/jogar.bmp",'J', 0, 0);
		menu->additem("img/rankings.bmp",'R', 0, 34);
		menu->additem("img/creditos.bmp",'C',0, 68);
		menu->additem("img/sair.bmp",'E', 0, 102);

		printf("Menu loaded!\n");

		menu_draw(menu);
		menu_event_loop(menu);	
		clear_keybuf();
	}
}

/* Funcao de desenho do Menu */
void menu_draw(struct MenuObject *menu){
	MenuItem *temp;
	int i, max = menu->get_count(); 

	for(i = 0; i < max; i++){
		temp = menu->load_item_buffer(i);
		//Se o buffer carregou
		if(temp->buffer) draw_sprite(crmenu, temp->buffer, temp->x, temp->y);
		//Se o seletor estiver nesse item, desenhar ao lado
		if(menu->action_get() == temp->action){
			draw_sprite(crmenu, (BITMAP *)menu->load_sel_buffer(), temp->x + temp->buffer->w+menu->dist_sel_xget(), temp->y);
		}
	}
	blit(crmenu, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
	clear_bitmap(crmenu);
}

/* Filtra ações do menu */
void menu_action_filter(struct MenuObject *menu, int event){
	printf("%d\n", event);
	switch(event){
		//acoes do menu
		case 'E':
		exit_menu = TRUE;
		break;

		case 'J':
		jogar();
		break;
		
		case 'C':
		creditos();
		break;
		
		case 'R':
		rankings();
		break;
		
		//ps: invertido
		case MENU_SEL_UP:
		if(menu->selector_up() >= 0){
			printf("menu sel up!\n");
		}
		break;
		
		//ps: invertido
                case MENU_SEL_DOWN:
                if(menu->selector_down() > 0){
                        printf("menu sel down!\n");
                }
                break;

		case MENU_SEL_ENTER:
		menu_action_filter(menu, menu->action_get());
		exit_menu = 1;
		break;
		
		default:
		break;
	}
}

/* Intercede e executa ações das teclas */
void menu_event_loop(struct MenuObject *menu){
	int update_screen = 0;
	
	if(menu){
		 while(!exit_menu){
                        while(ticks > 0 && !exit_menu){
				if(key[KEY_ENTER]){				                             		       menu_action_filter(menu, MENU_SEL_ENTER);
					break;
				}
				if(key[KEY_UP]){
					menu_action_filter(menu, MENU_SEL_UP);
					update_screen = 1;
					break;
				}
				if(key[KEY_DOWN]){
					menu_action_filter(menu, MENU_SEL_DOWN);
                                        update_screen = 1;
					break;
				}
				ticks--;
                        }
			if(update_screen){
				ticks = 0;
				update_screen = 0;
				menu_draw(menu);
				sleep(1);
			}
		}
	}	
}




/** INICIO DE FUNÇÕES DO MENU */
/** Iniciar interface de jogo - secao mapa/personagem */
int jogar(){
    // Buffer
    criacaodomapa = create_bitmap(SCREEN_W, SCREEN_H); // Criando o mapa

    // Importa imagens
    muro = load_bitmap("muro.bmp", NULL);
    boneco = load_bitmap("boneco.bmp", NULL);
    trilha = load_bitmap("trilha.bmp", NULL);

    //Desenho inicial
    desenha_o_mapa();
    tela();
}

/** Interface de rankings */
int rankings(){
    textprintf_centre_ex(screen, font, SCREEN_W - 10, 10, makecol(0, 100, 243), -1, "Frase 1");
    textprintf_right_ex(screen, font, SCREEN_W - 500, 200, makecol(200, 200, 20), -1, "Frase 2");
    textprintf_ex(screen, font, SCREEN_W - 500, 500, makecol(200, 200, 20), -1, "Frase 3");
    textout_ex (screen, font, MZVERSION, 10, 10, makecol (0, 0, 255), -1);
}

/** Tela de creditos */
int creditos()
{
    //...
}

/** Interrupção do jogo */
int sair()
{
    //...
}
/** FIM DE FUNÇÕES DO MENU */

void finaliza_tudo(){
    //libera memória
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(boneco);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);

    //limpeza de buffer
    clear_keybuf();
}


#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))

/**
  * Teste de colisão 2d
  * TRUE = colidiu
  * FALSE = sem colisao
  */
int colidiu(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    printf("%d %d %d %d\n! %d %d %d %d\n",x1,y1,w1,h1,x2,y2,w2,h2);
    if (x1 < x2 + w2 &&
        x1 + w1 > x2 &&
        y1 < y2 + h2 &&
        h1 + y1 > y2) {
            printf("colidiu!\n");
            return TRUE;
        }
        return FALSE;
}

/** Funcoes volateis */
void fecha_programa()
{
    exit_program = TRUE;
}
END_OF_FUNCTION(fecha_programa)

void tick_counter()
{
    ticks++;
}
END_OF_FUNCTION(tick_counter)


/**
  * inicializao de programa
  */
int main(){
    //flags/temp's
    int move = FALSE, x = 10,y = 0, evout = 0;

    //init
    inicia_alegro();

    //Tranca de funcão/variavel
    LOCK_FUNCTION(fecha_programa);
    LOCK_VARIABLE(exit_program);
    set_close_button_callback(fecha_programa);

    LOCK_FUNCTION(tick_counter);
    LOCK_VARIABLE(ticks);
    install_int_ex(tick_counter, BPS_TO_TIMER(60));

    //Menu
    struct MenuObject menu;
    _menu_maze(&menu);

    //Game Loop
    while(!exit_program)
    {
        //Eventos
        while(ticks > 0 && !exit_program)
        {
            //filtro de teclas/eventos
            evout = key_event();
            //Se for de movimento - altera variaveis de teste
            if(evout == DIR_UP   ||
               evout == DIR_DOWN ||
               evout == DIR_LEFT ||
               evout == DIR_RIGHT){
                move = true;
                switch(evout){
                    case DIR_UP:
                    y -= velPlayer;
                    break;

                    case DIR_DOWN:
                    y += velPlayer;
                    break;

                    case DIR_LEFT:
                    x -= velPlayer;
                    break;

                    case DIR_RIGHT:
                    x += velPlayer;
                    break;

                    default:
                    break;
                }
            }
            ticks--;
        }

        //Teste de colisao/redesenho
        if(move){
            move = colidiu(x, y, boneco->w, boneco->h, x2, y2, muro->w, muro->h);
            if(!move){
                // novas coordendas
                x1 = x;
                y1 = y;
                desenha_o_mapa();
                tela();
            }else {
                // antigas coordenadas
                x = x1;
                y = y1;
            }

            //reseta
            dir = 0;
            move = FALSE;
         }
        }
    printf("aff");
    finaliza_tudo();
    return 0;
}
END_OF_MAIN()



/**
 * Escopo das funções
 */

int key_event() {
    //saida de programa
    if(key[KEY_ESC]) fecha_programa();
    else if(key[KEY_UP]) return DIR_UP;
    else if(key[KEY_DOWN]) return DIR_DOWN;
    else if(key[KEY_LEFT]) return DIR_LEFT;
    else if(key[KEY_RIGHT]) return DIR_RIGHT;
    return -1;
}

void inicia_alegro() {
    allegro_init();

    install_keyboard();
    install_mouse();
    install_timer();
    

    set_color_depth(24); // Tipo de cor 8/15/16/24/32 bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 1080, 650, 0, 0); // Auto decteta o driver de vídeo
    set_window_title("Maze Escape");

}

void desenha_o_mapa()
{
    for (int i=0;i<LINHAS;i++) {
        for (int j=0;j<COLUNAS;j++) {
            if(matriz[i][j]=='t') {
                draw_sprite(criacaodomapa, trilha, j*TAMANHO, i*TAMANHO); }
            else if (matriz[i][j]=='m') {
                draw_sprite(criacaodomapa, muro, j*TAMANHO, i*TAMANHO);
            }
        }
    }
}


/** Atualiza tela */
void tela() {
    printf("d: %d %d\n",x1,x2);
    draw_sprite(criacaodomapa, boneco, x1, y1);
    blit(criacaodomapa, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    clear_bitmap(criacaodomapa);
}

P.S:

 - Está para linux, então vai ter que fazer aquela mudança pra windows.

 - Eu não revisei toda lógica do código, só fui fazendo, então alguma coisa ainda precisa sair/entrar

 - Imagens do menu em anexo

 - Os tiles são os mesmos

 - Print em anexo

 - Alterei para 24 bits e para usar transparente coloque fundo de rosa(255,0,255)

 

Sem título.png

img.zip

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

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...