Ir ao conteúdo

Posts recomendados

Postado

gostaria de transformar essa matriz de c, para imagem para criação de um mapa de labirinto, sendo que o T, algo como uma grama, e M algo como um tijolo, em forma de quadrados os 2 casos, como posso proceder?

 

provavelmente algo com bmp, mas não tenho ideia de como fazer ainda, alguém da uma luz pra guiar?

 

T = Trilha

M = Muro

 

int matriz[25][25] = {
    {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
};

 

  • Curtir 1
Postado

P.S: Antes de um moderador apagar, entenda que o código abaixo NÃO é REAL, apenas ilustrativo...

 

Saudades de criar tileset's para o The Mana World, um dos jogos que influenciou muito na minha vontade de programar, tal qual, faz parte da história de muitos jogadores. Esse jogo se tornou base de muitos desenvolvedores, por ser simples e lógico. Enfim, voltando a suas duvidas, você diz:

 

"gostaria de transformar essa matriz em c..."

 

porém, a matriz informada ja está em C, SENDO que o correto seria (tanto faz o tamanho):

 

char matriz[Y_MAX][X_MAX] = 

{{'m','m','m','m'},

 {'m','t','t','m'},

 {'m','t','t','m'},

{'m','m','m','m'}};

 

Seguindo...Vou dar uma "breve" introdução lógica na questão de mapa de tiles, tal qual eu mesmo experienciei:

 

@vangodp mencionou tile maps, algo muito importante, pois sem essa "teoria lógica", não teríamos muitos jogos 2d. Enfim, um tile map, nada mais é que um conjunto de imagens, ocupando a main screen, seja considerado o mapa ou apenas uma tela com imagens.Podendo ser usado em um tiled editor ou apenas no allegro, como você quer. 

 

Uma pergunta que vem a mente, como é desenhado um tile map? 

Temos várias etapas, como: construção de mapa, importação de imagens, identificação de imagens, e desenho final.

 

Construção de mapa:

Em um código simples, temos aquela sua matriz, a mesma podemos considerar o mapa, cada mapa tem sua matriz. Depois de construirmos o mapa, precisamos identificar cada código do mapa, como você quer é assim:

 

T = Trilha

M = Muro

 

Em um mapa como:

MMMTM

MMTTM

MMTMM

 

Então, já temos dois tiles a serem identificados no mapa(matriz), agora precisamos finalizar esse código com a importação de imagens, identificação de imagens, e enfim o método de desenho.

 

Importação de imagens:

As imagens podem ser importadas normalmente com o allegro, considerando que você ja sabe como, use uma função qualquer e armazene elas em uma variável global para facilitar as coisas.

Recomendo a usar imagens no tamanho de 32x32, existem milhares de tiles nesse tamanho.

 

Identificação de imagens:

Nessa etapa precisamos saber o que é cada tile, sendo feito em código. Pode ser feito uma struct, tal qual informa o que é tal tile, qual seu tamanho, o que tem nele, e se ele pode ser trilha, muro etc. Enfim, assim pode abrir espaço para varias futuras implementações. Porém quando há muitos tiles, é importante deixar essa identificação para um editor externo de mapas, pois ocupa muita memória.Exemplo:

 

struct Tile

{

    int tipo; // 1 trilha, 2 muro

    int acao1; // 1 normal, 2 teleporta, etc...

    int evento1; // 0 sem evento, 1 ...

    Imagem *ptr; // ponteiro para imagem carregada

};

 

Tile trilha(1,1,0,IMG_TRILHA);

Tile muro(2,1,0,IMG_MURO);

...

São variadas funcionalidades...

 

Desenho de mapa:

Por fim, precisamos de uma função que interprete o mapa(matriz), igual a uma leitura comum de uma matriz multidimensional, usando for com coordenadas y e x. Sendo que cada tile deve ser relacionados com os tiles identificados na etapa 2, para podermos encontrar o arquivo de imagem. E por fim, poderemos mostrar corretamente na tela.

 

Exemplo de código simples, sem allegro nem sdl, apenas lógica, COMECE DE BAIXO PARA CIMA:

#include <stdio.h>
#define tile_rua '1'
#define tile_muro '2'

//mapa da cidade
#define map1_w 5 //20px
#define map1_h 5 //20px
  
  
struct Tile
{
    int codigo_unico;//quando existem muitos tiles, use um código para cada tile
    int tipo;
	const char *arquivo; 
}

struct Tileset
{
	int count;
    Tile **tiles;//array de Tile
  
    Tileset(): count(0){}
    void novo_tile(int tipo, const char *arq_imagem){
      //aloca memoria em tiles e armazena os dados tipo e arq_imagem - count é incrementado
    }
    const char *procurar_tile(int tipo){
      //retorna o arquivo do tipo encontrado
    }
}
  
bool carrega_imagem(const char *file){
  //se encontrou/carregou a imagem, retorna true, etc...
}

//Etapa 3 - Desenhar mapa
int desenha_mapa(char *map[5], struct *Tset, int h, int w){
  if(Tset){
  //Esses 2 for são padrões para 2D
  for(int y = 0; y < h; y++){
  	for(int x = 0; x < w; x++){
      //Aqui vamos relacionar o tile no mapa com os tiles identificados na struct Tset(Tileset, conjunto de tiles)
      switch(map[y][x]){
        case tile_rua:
          //procurar o tile de rua e desenhar
          carregar_imagem(Tset->procurar_tile(tile_rua));
        break;
        case tile_muro:
          //procurar o tile de muro e desenhar
          carregar_imagem(Tset->procurar_tile(tile_muro));
        break;
        
        //tile não encontrado...
        default:
        break;
      }
    }
  }
 }
}

//Etapa 1 - construção do mapa
char mapa_cidade[map1_h][map1_w]= {{'2','1','1','1','2'}
                                {'2','1','1','1','2'},
                                {'2','1','1','2','2'},
                                {'2','1','1','1','2'},
                                {'2','1','1','2','2'}};
int main(){
  //Etapa 2 - Identificar tiles
  Tileset tset;
  tset.novo_tile(tile_rua, "tile_rua.bmp");
  tset.novo_tile(tile_muro, "tile_muro.bmp");
  
  //Etapa 3
  desenhar_mapa(&mapa_cidade, &tset, map1_h, map1_w);
}
  

Além disso tudo que eu informei, vem o controle de frame, interface, e lógica do jogo(npcs, monstros, pvp, etc)

  • Curtir 2
Postado
1 hora atrás, Xaws disse:

@TYSQUARE89  Pela forma como o erique se expressou deu a entender que não se trata de um exercício logo não está quebrando nenhuma regra 

Realmente não é exercício nenhum, apenas um projeto em desenvolvimento que estou participando.

 

Que regra? :confused:

 

@TYSQUARE89 Gracias, vou analisar amanhã com mais calma as informações que me apresentou, muitíssimo obrigado pelo help, logo posto continuando a saga do mapa..

 

Tinha um código anterior?, rs realmente eu não vi o que queria mostrar no inicio do seu post.

  • Curtir 2
Postado

@erique Beleza, qualquer coisa pode perguntar, muitos aqui vão lhe ajudar. Na verdade era apenas para informar aos moderadores que não estou dando código, já que pensei ser um trabalho acadêmico. :D 

 

  • Curtir 2
Postado

@erique  É porque uma das regras do fórum fala que quando se trata de exercícios não podemos dar códigos e nem modelos a não ser que a pessoa tenha postado o código dela

  • Curtir 1
Postado

@TYSQUARE89

 

porém, a matriz informada ja está em C, SENDO que o correto seria (tanto faz o tamanho):

Eu errei no inicio, depois corrigi, era para ser de c para imagem com allegro :)

 

As imagens podem ser importadas normalmente com o allegro, considerando que você ja sabe como, use uma função qualquer e armazene elas em uma variável global para facilitar as coisas.
Recomendo a usar imagens no tamanho de 32x32, existem milhares de tiles nesse tamanho.

Eu ainda não sei, já que estou iniciando com o allegro agora, mas vou pesquisar, obg pela dica do 32x32

 

Na parte do código..

Notei que faltou o ";" no final do struct, coloquei, porque o compilador estava indicando a falta dela, porém quando tento compilar, agora aparentemente não acha a struct, tem alguma configuração adicional para conseguir compilar?

 

Screenshot_2.png

#include <stdio.h>


#define tile_rua '1'
#define tile_muro '2'

//mapa da cidade
#define map1_w 5 //20px
#define map1_h 5 //20px
  
  
struct Tile
{
    int codigo_unico; //quando existem muitos tiles, use um código para cada tile
    int tipo;
	const char *arquivo; 
};

struct Tileset
{
	int count;
    Tile **tiles;//array de Tile
  
    Tileset(): count(0){}
    void novo_tile(int tipo, const char *arq_imagem){
      //aloca memoria em tiles e armazena os dados tipo e arq_imagem - count é incrementado
    }
    const char *procurar_tile(int tipo){
      //retorna o arquivo do tipo encontrado
    }
};
  
bool carrega_imagem(const char *file){
  //se encontrou/carregou a imagem, retorna true, etc...
}

//Etapa 3 - Desenhar mapa
int desenha_mapa(char *map[5], struct *Tset, int h, int w){
  if(Tset){
  //Esses 2 for são padrões para 2D
  for(int y = 0; y < h; y++){
  	for(int x = 0; x < w; x++){
      //Aqui vamos relacionar o tile no mapa com os tiles identificados na struct Tset(Tileset, conjunto de tiles)
      switch(map[y][x]){
        case tile_rua:
          //procurar o tile de rua e desenhar
          carregar_imagem(Tset->procurar_tile(tile_rua));
        break;
        case tile_muro:
          //procurar o tile de muro e desenhar
          carregar_imagem(Tset->procurar_tile(tile_muro));
        break;
        
        //tile não encontrado...
        default:
        break;
      }
    }
  }
 }
}

//Etapa 1 - construção do mapa
char mapa_cidade[map1_h][map1_w]= {{'2','1','1','1','2'}
                                {'2','1','1','1','2'},
                                {'2','1','1','2','2'},
                                {'2','1','1','1','2'},
                                {'2','1','1','2','2'}};
int main(){
  //Etapa 2 - Identificar tiles
  Tileset tset;
  tset.novo_tile(tile_rua, "tile_rua.bmp");
  tset.novo_tile(tile_muro, "tile_muro.bmp");
  
  //Etapa 3
  desenhar_mapa(&mapa_cidade, &tset, map1_h, map1_w);
}
  

 

Enquanto isso, vou criando um código com base nesse exemplo, e posto para ver se estou no caminho certo.

 

@TYSQUARE89 Tranks :)

 

@Benjamin Breeg Muito obrigado pelo vídeo, bem instrutivo, vou analisar tmb o código para implementar ao meu.

1 hora atrás, Xaws disse:

@erique  É porque uma das regras do fórum fala que quando se trata de exercícios não podemos dar códigos e nem modelos a não ser que a pessoa tenha postado o código dela

 

Ah sim obrigado, felizmente não é meu caso :)

 

adicionado 42 minutos depois

To apanhando aqui pra descobrir o que está de errado, com a referência de rectfill e makecol

 

Pelo que entendi as 2 são do allegro, e tem como finalidade pintar o quadrado no meu caso da posição que ele achar com o if, porém não entendi muito bem a coisa como um todo.

 

Ps: estou seguindo a lógica do tutorial desse vídeo: 

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
// #include <windows.h> // Incompativel com <winalleg.h> por conflito
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, necessita do allegro
#define T 0 // Trilha
#define M 1 // Muro

const int TILESIZE = 50;

enum {
	TRILHA = T,
	MURO = M
};

int matriz[25][25] = {
    {M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
};

void Desenhar_Mapa(BITMAP* buffer, int** matriz)
{
    int i, j;
    for(i = 0; i < 25; i++){
        for(j = 0; j < 25; j++){
           if(matriz[i][j] == MURO)
             rectfill(buffer, j * TILESIZE, i * TILESIZE, (j * TILESIZE) + TILESIZE, (i * TILESIZE) + TILESIZE, makecol(183,150,89));

           else if(matriz[i][j] == TRILHA)
             rectfill(buffer, j * TILESIZE, i * TILESIZE, (j * TILESIZE) + TILESIZE, (i * TILESIZE) + TILESIZE, makecol(0,230,0));
        }
     }
}

void Libera_Mapa(int** mapa, int linhas)
{
   int i;
   for(i = 0; i < linhas; i++)
    free(mapa[i]);

   free(mapa);
}

void main() {
        system("cls");
        printf("\t\t\t\t\t\t\tGAME\n");
// TESTE IMAGEM - INICIO



// TESTE IMAGEM - FIM
	printf("\n\n\n");
// Início do Código do jogo
    int coluna,linha;
        for (coluna=0;coluna<25;coluna++){
            printf("\n");
            for (linha=0;linha<25;linha++){
                printf("%d",matriz[coluna][linha]);
        }
    }
// Fim do Código do Jogo
	printf("\n\n\n");
	system("pause");
}
END_OF_MAIN();

 

adicionado 43 minutos depois

Screenshot_3.png

  • Curtir 1
Postado

o END_OF_MAIN(); não tem o " ; " no final

 

Ele não esta reconhecendo as funções porque falta você configurar o biblioteca do Allegro nas opções de compilador aba Linker, ai em Link libraries você coloca o caminho para esse dll: allegro-4.4.2-monolith-md-debug.dll

 

Lembrando que o exemplo do rapaz do vídeo ele usa o Allegro 4.4.2.

 

Esse teu código não faz nada, falta o game loop, configurar o ambiente do Allegro, janelas, etc etc. Eu recomendo você assistir desde o tutorial 1 com bastante atenção e estar com funções, ponteiros, operadores aritméticos, estruturas de repetição muito bem assimilados na cabeça.

 

 

 

  • Curtir 2
Postado

@Benjamin Breeg Já conheço a estrutura de repetição for e while tmb, os ponteiros estou vendo agora, operadores já sei como funcionam.

 

Resolvi, ajustei e compilei o código abaixo, para testar:

 

Tirei aquela função de desenhar_mapa, porque era de outro código, então não encaixava no meu objetivo ainda.

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
// #include <windows.h> // Incompativel com <winalleg.h> por conflito
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, necessita do allegro
#define T 0 // Trilha
#define M 1 // Muro

const int TILESIZE = 50;

enum {
	TRILHA = T,
	MURO = M
};

int matriz[25][25] = {
    {M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,M},
    {M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
};


int main(void) {
// Funções de inicialização do allegro
   allegro_init();
   install_timer();
   install_keyboard();
   set_color_depth(32);
   set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
   set_window_title("Maze Escape");

    void Desenhar_Mapa();
 rectfill(screen, 200,200,100,100,makecol(255,254,200)); //teste

	system("pause");
	return 0;
}
END_OF_MAIN()

Pergunta: Como posso esconder a janela do cmd?, porque atualmente ele abre o cmd + allegro.

 

Pergunta¹: Como posso executar os comandos que fazia no cmd dentro do allegro?, porque se eu deixar para mostrar a matriz no for no puro 0 e 1, ele mostra no cmd ainda, vou procurar para saber, mas se já tiver como fazer, ajuda tmb.

 

Meu próximo passo, vai ser importar as imagens para o mapa, e verificar como vou mostrar ela, valeu pelo help, até aqui :)

 

  • Curtir 1
Postado

Eu postei no tópico errado hehe...

 

Ah sim.. a logica é no c/c++.  seria interessante você portar o código do menu para o allegro, naquele exemplo usou as funcoes da WinAPI, no Allegro você pode fazer menus com imagens ou ate mesmo esses de texto.

 

Da uma olhada nesse video:

 

 

Eu achei o código do primeiro tutorial do PACMAN do deividcoptero mas não esta completo, eu não cheguei terminar o tutorial mas da uma ideia de como fazer o labirinto usando um bmp. Veja se ajuda.

 

Baixa os arquivos do tutorial, coloca o arquivo roca.bmp na pasta do seu projeto.

 

https://www.mediafire.com/folder/cff2zi955gj265z,ej135roc11aho6z/shared

 

#include <allegro.h>
#define MAXFILAS 20
#define MAXCOLS 31

BITMAP *buffer;
BITMAP *roca;

char mapa[MAXFILAS][MAXCOLS]={
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "X           XXXXX           X",
  "X XXX XXXXX XXXXX XXXXX XXX X",
  "X XXX XXXXX XXXXX XXXXX XXX ",
  "X                           X",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X     XX     XXX     XX     X",
  "X XXX XXXXXX XXX XXXXXX XXX X",
  "X XXX XX             XX XXX X",
  "      XX XXXXXXXXXXX XX     ",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X XXX XX             XX XXX X",
  "X XXX XXXXXX XXX XXXXXX XXX X",
  "X     XX     XXX     XX     X",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X XXX                   XXX ",
  "X XXX XXXX XXXXXXXX XXX XXX X",
  "X XXX XXXX          XXX XXX X",
  "X          XXXXXXXX         X",
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
};

void desenha_mapa()
{
    int row, col;
    for (row = 0; row < MAXFILAS; row++) {
        for (col = 0; col < MAXCOLS; col++) {
            if(mapa[row][col] == 'X') {
                draw_sprite(buffer, roca, col*30, row*30);
            }

        }
    }

}

void pantalla() {
    blit(buffer, screen, 0, 0, 0, 0, 880, 600);
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0);
    set_window_title("Labirinto");

    buffer = create_bitmap(880, 600);
    roca = load_bitmap("roca.bmp", NULL);

    while(!key[KEY_ESC]) {
            desenha_mapa();
            pantalla();
    }

}
END_OF_MAIN()

 

 

  • Curtir 2
Postado

Boa noite, isso aqui é sinistro:

 

while(!key[KEY_ESC]) {

desenha_mapa();

pantalla();

}

 

melhor colocar um delay ou sleep...ou implemente a logica de fps.

 

Interessante o código, @Benjamin Breeg 

Da para continuar dai, na função draw_sprite, é possível relacionar com essa minha parte do código:

 

switch(map[y][x]){
	case 'X':
    imprimir_imagem(arquivo, x, y); //aqui seria a blit do tile
    break;
    //tile não encontrado...
    default:
    break;
}

@erique Aquele código la em cima não está pronto, é apenas para você se baser, mas se uma hora precisar eu mostro um exemplo mais proveitoso.

  • Curtir 2
Postado

@Benjamin Breeg Legal, agora entendi, no meu caso, são aqueles códigos do meu outro tópico, onde criou o menu, por hora vou deixar daquela forma.

 

Ainda não mesclei com aqueles códigos, mas seria algo assim?:

 

#include <allegro.h>
#define MAXFILAS 20
#define MAXCOLS 31
BITMAP *buffer;
BITMAP *roca;

char mapa[MAXFILAS][MAXCOLS]={
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "X           XXXXX           X",
  "X XXX XXXXX XXXXX XXXXX XXX X",
  "X XXX XXXXX XXXXX XXXXX XXX ",
  "X                           X",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X     XX     XXX     XX     X",
  "X XXX XXXXXX XXX XXXXXX XXX X",
  "X XXX XX             XX XXX X",
  "      XX XXXXXXXXXXX XX     ",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X XXX XX             XX XXX X",
  "X XXX XXXXXX XXX XXXXXX XXX X",
  "X     XX     XXX     XX     X",
  "X XXX XX XXXXXXXXXXX XX XXX X",
  "X XXX                   XXX ",
  "X XXX XXXX XXXXXXXX XXX XXX X",
  "X XXX XXXX          XXX XXX X",
  "X          XXXXXXXX         X",
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
};

void desenha_mapa()
{
    int row, col;
    for (row = 0; row < MAXFILAS; row++) {
        for (col = 0; col < MAXCOLS; col++) {
            if(mapa[row][col] == 'X') {
                draw_sprite(buffer, roca, col*30, row*30);
            }

        }
    }

}

void pantalla() {
    blit(buffer, screen, 0, 0, 0, 0, 880, 600);
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0);
    set_window_title("Labirinto");

    buffer = create_bitmap(880, 600);
    roca = load_bitmap("roca.bmp", NULL);

    while(!key[KEY_ESC]) {
            
            // Meus lindos códigos inicio
            

            desenha_mapa();
            pantalla();
    }
}
END_OF_MAIN()

O códigos daquele menu switch case, posso colocar dentro das chaves do while, é chamar o mapa que no caso é desenha_mapa(); dentro do case de jogar, exemplo?

 

O que eu quero dizer, é que necessita que esses códigos agora, sejam dentro do while?

adicionado 0 minutos depois

@TYSQUARE89 valeu pela força, vou mesclar primeiro o que eu preciso que apareça, e dai vamos mexendo para aperfeiçoar.

  • Curtir 2
Postado
em 18/09/2017 às 21:38, tysquare89 disse:

cionou tile maps, algo muito importante, pois sem essa "teoria lógica", não teríamos muitos jogos 2d. enfim, um tile map, nada mais é que um conjunto de imagens, ocupando a main screen, seja considerado o mapa ou apenas uma tela com imagens.podendo ser usado em um tiled editor ou apenas no allegro, como você quer. 

 

com certeza, vamos ver ainda, agora estou mostrando o mapa, como exemplo

 

@tysquare89 @benjamin breeg fiz uma coisinha legal com o exemplo anterior, só que atualmente essa parte de código está em um loop infinito criando mapas infinitos de grama e muro

 

#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 de acentuação de caracteres
// #include  // incompativel com  por conflito
#include  // biblioteca gráfica
#include  // inclui , necessita do allegro
#define linhas 25
#define colunas 25
#define m 1
#define t 0
bitmap *criacaodagrama;
bitmap *criacaodomuro;
bitmap *roca;
bitmap *roca2;

char matriz[linhas][colunas] = {

"mmmmmmmmmmmmmmmmmmmmmmmm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mttttttttttttttttttttttm",
"mmmmmmmmmmmmmmmmmmmmmmmm",
    /*
    {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,m},
    {m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
    */
};

void desenha_mapa()
{
    int i, j;
    for (i = 0; i  linhas; i++) {
        for (j = 0; j  colunas; j++) {
            if(matriz[i][j] == 't') {
                draw_sprite(criacaodagrama, roca, j*30, i*30); }
            if (matriz[i][j] == 'm') {
                draw_sprite(criacaodomuro, roca2, j*30, i*30); }
        }
    }

}

void pantalla() {
    blit(criacaodagrama, screen, 0, 0, 0, 0, 880, 600);
    blit(criacaodomuro, screen, 0, 0, 0, 0, 880, 600);
}

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(gfx_autodetect_windowed, 880, 600, 0, 0);
    set_window_title("maze escape");

    criacaodagrama = create_bitmap(880, 600);
    roca = load_bitmap("grama.bmp", null);
    criacaodomuro = create_bitmap(880, 600);
    roca2 = load_bitmap("muro.bmp", null);

    while(!key[key_esc]) {
            desenha_mapa();
            pantalla();
    }
}
end_of_main()

como posso juntar as 2 coisas em 1 mapa só?, pensei que criando um novo mapa ele colocaria por cima do anterior, mas como falei ele fica em loop. 

grama.bmp

muro.bmp

Postado

Então, como eu disse, isso aqui: 

while(!key[key_esc]) {

desenha_mapa();

pantalla();

}

 

é o seu problema, pois um loop sem delay nem contexto não tem sentido. Portanto, coloque o desenha_mapa(); e pantalla(); ( esse pantalla seria a atualização da tela ), antes de while(!key[key_esc]).

Caso você deseja trocar mapas no meio da execução ou mover um sprite (imagem 2d do player), sempre pinte a tela de preto e redesenhe o mapa, enfim use clear_to_color(bmp, makecol(0, 0, 0)); antes dos blit's em pantalla();

 

Postado

Cara o Loop tem todo sentido, quando se trata de jogos, todo jogo tem um Game Loop que vai conter toda a lógica, entrada de dados, renderização, atualização, regular fps, temporização  etc etc, como C não é orientada e objetos e sim procedural, se usa funções para não poluir o Game Loop, isso é considerado uma boa pratica de programação.

 

Isso que você quer fazer não é tão simples, teria que criar funções para carregar os mapas a partir de arquivos, criar eventos dentro do cenário para passar de fase, colisão etc etc.

 

Ali no exemplo ele desenha tudo em um buffer, essa técnica chama double buffer, perceba que nao da aquele efeito de piscada nas atualizações de tela, ai ele usa a função blit para "imprimir" o que esta no buffer  na screen, o allegro ja tem um ponteiro screen predefinido. Caso contrario você veria tudo preto.

Postado

@TYSQUARE89 Entendi o que quis dizer.

 

Consegui resolver o meu problema também, percebi que estava criando 2 mapas distintos, mas na verdade eu queria era juntar os 2 em 1 só. Então o código final ficou assim

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, dependente do allegro
#define LINHAS 25 // Define a quantidade de linhas da matriz
#define COLUNAS 25 // Define a quantidade de colunas da matriz
#define TAMANHO 25 // Define o tamanho do "quadradro" da imagem importada
BITMAP *criacaodomapa;
BITMAP *muro;
BITMAP *trilha;

char matriz[LINHAS][COLUNAS] = {
"MMMMMMMMMMMMMMMMMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTMMMMMMMMMMMMTTMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTMMMMMMMMMMMMMTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTMMMMMMMMMMMMMMMTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MMMMMMMMTTTTTTTMMMMMMMMM",
};

void desenha_o_mapa() /* Criando o mapa */
{
    int i, j;
    for (i=0;i<LINHAS;i++) {
        for (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);
                }
        }
    }
}

void pantalla() { /* 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, 0, 0, 900, 750);
}

int main()
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instalação da função para usar o teclado
    set_color_depth(32); // Tipo de cor (16) ou (32) bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 900, 750, 0, 0); // Auto decteta o tamanho da tela e o ajusta
    set_window_title("Maze Escape"); // Define o titulo da janela

    criacaodomapa = create_bitmap(900, 750); // Criando o mapa
    muro = load_bitmap("muro.bmp", NULL); // Importação da imagem do Muro
    trilha = load_bitmap("trilha.bmp", NULL); // // Importação da imagem da Trilha

    desenha_o_mapa(); // Desenhar o mapa na tela
    pantalla(); // Atualização da tela

    while(!key[KEY_ESC]) {} // Precionar ESQ para fechar
    destroy_bitmap(criacaodomapa); // Destruição do mapa para limpar memoria
    return 0;
}
END_OF_MAIN()

Agora que consegui resolver isso, vamos transformar o código do outro tópico nesse do allegro para integrar os 2.

 

Sendo que, pretendo manter o menu inicial por enquanto, porque o próximo passo seria mexer mais no mapa e na parte de personagem e funcionalidades do mapa agora.

muro.bmp

trilha.bmp

adicionado 1 minuto depois

Obs: Eu dei uma comentada geral no código, veja se está tudo certo por favor, se eu não estou comentando nenhuma asneira

adicionado 20 minutos depois

Continuando a saga allegro, juntei o código anterior com o código novo do allegro, aí temos esse dilema.

 

Existe como fazer os comandos que aparecem no cmd atualmente, aparecerem na tela do allegro?, ou sou obrigado a criar menus inteiramente no allegro, e colocar os comandos digamos "normais" dentro?

 

Código atual juntado:

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, dependente do allegro
#define LINHAS 25 // Define a quantidade de linhas da matriz
#define COLUNAS 25 // Define a quantidade de colunas da matriz
#define TAMANHO 25 // Define o tamanho do "quadradro" da imagem importada
BITMAP *criacaodomapa;
BITMAP *muro;
BITMAP *trilha;

int a,b,co,L3,L4,L,L2; // Variaveis das setas

void gotoxy(int x,int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

char matriz[LINHAS][COLUNAS] = {
"MMMMMMMMMMMMMMMMMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTMMMMMMMMMMMMTTMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTMMMMMMMMMMMMMTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTMMMMMTTMTTTTM",
"MTTTTTTTTTTTTTTMTTTTTTTM",
"MTTTTTTTTTTTTTTMTTMTTTTM",
"MTTTTTTTTTTTTTTMTTMTTTTM",
"MTTTTTTTTTTTTTTMTTMTTTTM",
"MTTTTTTMMMMMMMMMMMMMMMTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MMMMMMMMTTTTTTTMMMMMMMMM",
};

void desenha_o_mapa() /* Criando o mapa */
{
    int i, j;
    for (i=0;i<LINHAS;i++) {
        for (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);
                }
        }
    }
}

void pantalla() { /* 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, 0, 0, 900, 750);
}




int main()
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instalação da função para usar o teclado
    set_color_depth(32); // Tipo de cor (16) ou (32) bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 900, 750, 0, 0); // Auto decteta o tamanho da tela e o ajusta
    set_window_title("Maze Escape"); // Define o titulo da janela


    //menu
    int opcao;
    setlocale(LC_ALL, "Portuguese"); // Definindo português como linguagem dentro de printf
    do{
        inicio:
        opcao=0;
        L=2;L2=2;b=2;
        system("cls"); // Limpar a tela dos comandos anteriores
        system("color 1F"); // Definindo a cor do fundo e a letra no cmd
        printf("Dica: Precione a tecla ESQ a qualquer momento para voltar para o menu principal!");


    gotoxy(30,11); printf("    /\\        /\\          /\\      =======    =======");
    gotoxy(30,12); printf("   /  \\      /  \\        /  \\         //     ||     ");
    gotoxy(30,13); printf("  /    \\    /    \\      /====\\       //      =======");
    gotoxy(30,14); printf(" /      \\  /      \\    /      \\     //       ||     ");
    gotoxy(30,15); printf("/        \\/        \\  /        \\   =======   =======");

    gotoxy(27,17); printf("=======  =======   =======      /\\      =======   ======= ");
    gotoxy(27,18); printf("||       ||        ||          /  \\     ||   ||   ||      ");
    gotoxy(27,19); printf("=======  =======   ||         /====\\    =======   ======= ");
    gotoxy(27,20); printf("||            ||   ||        /      \\   ||        ||      ");
    gotoxy(27,21); printf("=======  ======    =======  /        \\  ||        ======= ");
// Início do Código da Seta
        /*modificando o valor de co muda a coluna de inicio do menu que pose ser de zero ate 63*/
        /*modificando o valor de L muda a linha de inicio do menu que pode ser de zero ate 20*/
        opcao=0;co=0;/*co é a coluna onde colocar a seta*/
        L=3;/*L é a linha onde fica as opções, mudando as opções p/baixo mude o valor de L igual*/
        L2=L;    /*L2 é onde estava a seta */
        L3=L+3;  /*L3 é a linha final do menu*/
        L4=L;    /*L4 é a linha de inicio do menu*/
        system("color 1F"); // Definindo a cor do fundo e a letra no cmd
        gotoxy(co+5,L);     // co é a coluna de inicio do menu e L é a linha de inico do menu
        printf("JOGAR");
        gotoxy(co+5,L+1);
        printf("RANKINGS");
        gotoxy(co+5,L+2);
        printf("CRÉDITOS");
        gotoxy(co+5,L+3);
        printf("SAIR");
        do{   /*loop para movimentar a seta*/
            gotoxy(co,L);/*gotoxy posiciona o cursor, o co é a coluna e L é a linha onde imprimir a seta*/
            printf("~~>",16);   /*imprime a seta*/
            gotoxy(0,25);         /*posiciona o cursor fora da tela para ele não ficar piscando*/
            if(kbhit){a=getch();} /*se alguma tecla foi pressionada a igual a tecla*/
            if(a == 80){          /*80 é valor do cactere seta p/baixo do teclado*/
                L2=L;             /*L2 é posição onde estava a seta para apagar senao fica duas setas*/
                L++;              /*L aponta para a nova posição da seta*/
                if(L>L3){L=L4;}     /*L vai de 2 ate 5 pois é onde estão as 4 opções, mudando mude tambem os valores*/
            }                     /*a seta estando no 4 e for movida p/baixo ela vai para a primeira opção*/
            if(a == 72){          /*72 é valor do cactere seta p/cima do teclado*/
                L2=L;             /*L2 é onde estava a seta para apagar*/
                L--;              /*L aponta para a nova posição da seta*/
                if(L<L4){L=L3;}     /*a seta estando no 1 e for movida p/cima ela vai para a ultima opção*/
            }
            if(L!=L2){            /*se a seta for movida */
                gotoxy(co,L2);     /*posicione o cursor onde estava a seta*/
                printf("    ");   /*imprime espaços em branco(que sao pretos) em cima da seta para apaga-la*/
                L2=L;             /*L2 igual a nova posição da seta*/
            }
            if(a == 13){          /*se a tecla enter for pressionada*/
                opcao=L-(L4-1);        /*opção igual a linha onde esta a opção menos um, pois a primeira opção */
                                  /*esta na linha 2*/
            }
        }while(opcao == 0);       /*repete enquanto opção igual a zero*/
// Fim do código da seta
    switch (opcao) {
    case 1:
        system("cls");
        printf("\t\t\t\t\t\t\tGAME\n");
// Início do Código do jogo
    criacaodomapa = create_bitmap(900, 750); // Criando o mapa
    muro = load_bitmap("muro.bmp", NULL); // Importação da imagem do Muro
    trilha = load_bitmap("trilha.bmp", NULL); // // Importação da imagem da Trilha

    desenha_o_mapa(); // Desenhar o mapa na tela
    pantalla(); // Atualização da tela

// Fim do Código do Jogo
        do{
            if(kbhit){a=getch();}
        }while(a != 27);
        break;
    case 2:
        system("cls");
        printf("Ranking\n");
        do{
            if(kbhit){a=getch();}
        }while(a != 27);
        break;
    case 3:
        system("cls");
        printf("Creditos\n");
        do{
            if(kbhit){a=getch();}
        }while(a != 27);
        break;
    case 4:
        system("cls");
        printf("voce pediu para sair, fechando programa...");
        for(a=0;a<10;a++){
            printf(".");
            Sleep(300);
        }
        printf("!\n\n");
		exit(0);
    default:
        system("cls");
        printf("Você deve escolher uma opção válida\n");
        printf("Precione qualquer tecla para voltar ao menu\n");
        system("pause");
        goto inicio;
        }
    }while(opcao!=4);
    while(!key[KEY_ESC]) {} // Precionar ESQ para fechar
    destroy_bitmap(criacaodomapa); // Destruição do mapa para limpar memoria
    return 0;
}
END_OF_MAIN()

 

adicionado 22 minutos depois

Screenshot_52d512.png

 

Screenshot_6.png

Postado

Esse seu ultimo código não funcionou aqui, isso que você quer fazer não da porque o seu primeiro jogo usa a saída do console, no allegro você tem que desenhar os objetos na screen ou no buffer, teria que adaptar o menu usando funções do próprio Allegro. Não sei se da pra usar funções da winapi, pelo menos não as de texto.

adicionado 13 minutos depois

Saca só isso, pesquisando  ontem achei uma forma bem simples de fazer menu com suporte a setas e mouse no Allegro nos próprios exemplos que vem no pacote do Allegro. Procura o arquivo "exgui.c" na pasta examples, compile e execute.

 

Versão simplificada:

 

#include <allegro.h>

void jogar()
{
    allegro_message("GAME");
}

void rankings()
{
    allegro_message("Rankings");
}

void creditos()
{
    allegro_message("Creditos");
}

void sair()
{
    allegro_message("sair");
}

MENU opcao[] =
{
    { "JOGAR", jogar, NULL, 0, NULL },
    { "RANKINGS", rankings, NULL, 0, NULL },
    { "CREDITOS", creditos, NULL, 0, NULL },
    { "SAIR", sair, NULL, 0, NULL }
    };

    int main()
    {
        allegro_init();
        install_keyboard();
        install_mouse();
        set_color_depth(32);
        set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
        show_mouse(screen);
        do_menu(opcao, 300, 300);

        return 0;
}
END_OF_MAIN()

 

  • Curtir 1
Postado

@Benjamin Breeg To procurando alternativas pro menu, seguindo esse vídeo

 

 

Também da pra fazer, esse que você postou é legal tmb.

 

Estou procurando o arquivo exgui.c na net, porque na pasta do code blocks não existe.

 

Aceitando recomendações de menus, haha

Postado
30 minutos atrás, Benjamin Breeg disse:

Ah sim desculpe, os exemplos estão no arquivo do código fonte da biblioteca Allegro.

 

Baixa esse arquivo:

 

http://cdn.allegro.cc/file/library/allegro/4.4.2/allegro-4.4.2.zip

 

Esse não consegui fazer rodar, abre janela branca de tela inteira, 3x seguidas, e fecha, alegando erro.

 

Enfim..

Acho que vou acabar fazendo desse estilo aqui, com imagem do menu, e posições de x e y do mouse

 

 

Já que não achei outra alternativa, é no código abaixo, ele fica bem simplizão

 

Ou tem como personalizar a partir desse código abaixo?

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, dependente do allegro
#define LINHAS 25 // Define a quantidade de linhas da matriz
#define COLUNAS 25 // Define a quantidade de colunas da matriz
#define TAMANHO 25 // Define o tamanho do "quadradro" da imagem importada
BITMAP *criacaodomapa;
BITMAP *muro;
BITMAP *trilha;

char matriz[LINHAS][COLUNAS] = {
"MMMMMMMMMMMMMMMMMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTMMMMMMMMMMMMTTMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTMMMMMMMMMMMMMTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTMMMMMMMMMMMMMMMTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MMMMMMMMTTTTTTTMMMMMMMMM",
};

void desenha_o_mapa() /* Criando o mapa */
{
    int i, j;
    for (i=0;i<LINHAS;i++) {
        for (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);
                }
        }
    }
}

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, 0, 0, 900, 750);
}

void jogar()
{
    desenha_o_mapa(); // Desenhar o mapa na tela
    tela(); // Atualização da tela
}

void rankings()
{
    allegro_message("Rankings");
}

void creditos()
{
    allegro_message("Creditos");
}

void sair()
{
    allegro_message("sair");
}

MENU opcao[] =
{
    { "JOGAR", jogar, NULL, 0, NULL },
    { "RANKINGS", rankings, NULL, 0, NULL },
    { "CREDITOS", creditos, NULL, 0, NULL },
    { "SAIR", sair, NULL, 0, NULL }
    };

int main()
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instalação da função para usar o teclado
    install_mouse(); // Instalação da função para usar o mouse
    set_color_depth(32); // Tipo de cor (16) ou (32) bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 900, 750, 0, 0); // Auto decteta o tamanho da tela e o ajusta
    set_window_title("Maze Escape"); // Define o titulo da janela

    criacaodomapa = create_bitmap(900, 750); // Criando o mapa
    muro = load_bitmap("muro.bmp", NULL); // Importação da imagem do Muro
    trilha = load_bitmap("trilha.bmp", NULL); // // Importação da imagem da Trilha

        show_mouse(screen);
        do_menu(opcao, 375, 375);

    while(!key[KEY_ESC]) {} // Precionar ESQ para fechar
    // Destruição do mapa
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    return 0;
}
END_OF_MAIN()

 

Teste forum.zip

Postado
4 minutos atrás, vangodp disse:

@erique Aqui tem um exemplo de menu em allegro de davidcoptero:

http://devcpp-allegro.blogspot.com.es/2012/02/como-creo-un-menu-en-c.html#more

 

Acho que vou fazer o seguinte, vou dividir esse menu abaixo, em várias funções, 1 para cada opção do menu, e vou posicionar 1 em cada posição do mapa em forma sequencial, assim eu posso manipular, uma imagem fixa para o menu, e vai me atender, pelo menos na teoria

 

Uma dúvida, tem como importar imagem em gif?, para ser o fundo da tela no caso, penso em fazer algo animado, caso tenha como fazer.

 

Se sim, a importação seria da mesma forma de um .bmp, só que com a extensão normal do .gif?, tranks pelo help

 

#include <stdio.h> // Biblioteca de entrada e saída de dados
#include <stdlib.h> // Biblioteca de conversão das strings
#include <conio.h> // Biblioteca de manipulação de caracteres
#include <locale.h> // Biblioteca de acentuação de caracteres
#include <allegro.h> // Biblioteca gráfica
#include <winalleg.h> // Inclui <windows.h>, dependente do allegro
#define LINHAS 25 // Define a quantidade de linhas da matriz
#define COLUNAS 25 // Define a quantidade de colunas da matriz
#define TAMANHO 25 // Define o tamanho do "quadradro" da imagem importada
BITMAP *criacaodomapa;
BITMAP *muro;
BITMAP *trilha;

char matriz[LINHAS][COLUNAS] = {
"MMMMMMMMMMMMMMMMMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTMMMMMMMMMMMMTTMMMMMMMM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTMMMMMMMMMMMMMTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTMTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTMMMMMMMMMMMMMMMTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MTTTTTTTTTTTTTTTTTTTTTTM",
"MMMMMMMMTTTTTTTMMMMMMMMM",
};

void desenha_o_mapa() /* Criando o mapa */
{
    int i, j;
    for (i=0;i<LINHAS;i++) {
        for (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);
                }
        }
    }
}

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, 0, 0, 900, 750);
}

void jogar()
{
    desenha_o_mapa(); // Desenhar o mapa na tela
    tela(); // Atualização da tela
}

void rankings()
{
    allegro_message("Rankings");
}

void creditos()
{
    allegro_message("Creditos");
}

void sair()
{
    allegro_message("sair");
}

MENU opcao[] =
{
    { "JOGAR", jogar, NULL, 0, NULL },
    { "RANKINGS", rankings, NULL, 0, NULL },
    { "CREDITOS", creditos, NULL, 0, NULL },
    { "SAIR", sair, NULL, 0, NULL }
    };

int main()
{
    allegro_init(); // Inicialização do allegro
    install_keyboard(); // Instalação da função para usar o teclado
    install_mouse(); // Instalação da função para usar o mouse
    set_color_depth(32); // Tipo de cor (16) ou (32) bits
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 900, 750, 0, 0); // Auto decteta o tamanho da tela e o ajusta
    set_window_title("Maze Escape"); // Define o titulo da janela

    criacaodomapa = create_bitmap(900, 750); // Criando o mapa
    muro = load_bitmap("muro.bmp", NULL); // Importação da imagem do Muro
    trilha = load_bitmap("trilha.bmp", NULL); // // Importação da imagem da Trilha

        show_mouse(screen);
        do_menu(opcao, 375, 375);

    while(!key[KEY_ESC]) {} // Precionar ESQ para fechar
    // Destruição do mapa
    destroy_bitmap(criacaodomapa);
    destroy_bitmap(trilha);
    destroy_bitmap(muro);
    return 0;
}
END_OF_MAIN()

Outra dúvida, no meu mapa atual, com o código a cima, quando compila, e entra na opção jogar, ele quebra o mapa, com o anterior, eu tenho que limpar o mapa anterior?, destruir por exemplo, para conseguir printar o próximo mapa na tela?

 

_N2FHre8TtK-qrca-ZojWA.png

 

Teste forum.zip

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!