[C] Labirintum!

Sub-fórum especial para usuários que querem discutir/aprender programação, como as linguagens C/C++/C#, Java, HTML, e por aí vai...
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
18
Localização: Sampa/Sanca
Contato:

[C] Labirintum!

Mensagem por Fabio914 »

Este é o primeiro jogo que eu estou fazendo na Z1 engine , e é simplesmente um jogo em que o objetivo é atravessar os labirintos.

Já possui mapa em formato de matriz , vista em 2D e 3D.

OBS.: Eu que fiz o algoritmo desse 3D do jogo , quem quiser eu ensino a fazer. :wink:

Screenshot
ImagemImagem

Download do Beta
http://rapidshare.com/files/148872663/L ... o.rar.html
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Avatar do usuário
SSKLegaia
Mensagens: 217
Registrado em: Dom Fev 26, 2006 2:48 pm
Answers: 0
19

Mensagem por SSKLegaia »

Cara, que foda xD
Eu quer aprender, se você mandar pro meu e-mail qualquer dia eu estudo com calma ^^
So seu fan véio xD
Imagem
Yeah \o/
Avatar do usuário
Space Marine
Mensagens: 1920
Registrado em: Sáb Fev 11, 2006 6:47 pm
Answers: 0
19
Localização: Brasil
Gender:
Contato:

Mensagem por Space Marine »

:o

To comecando a ficar com medo do fabio
Avatar do usuário
Z-Man
Mensagens: 1406
Registrado em: Dom Jan 13, 2008 2:37 pm
Answers: 0
17
Localização: Atrás do Rico.
Contato:

Mensagem por Z-Man »

O Fabio eh Fodastico pra faze essas coisa 8)
Avatar do usuário
DU0
Mensagens: 6690
Registrado em: Sáb Abr 01, 2006 6:59 am
Answers: 0
19
Localização: Deimos Lab.
Contato:

Mensagem por DU0 »

SSKLegaia escreveu:Cara, que foda xD
Eu quer aprender, se você mandar pro meu e-mail qualquer dia eu estudo com calma ^^
So seu fan véio xD
Jogando atualmente:
Xbox 360: Ninja Gaiden Black
Xbox One: Need for Speed: Hot Pursuit, Yakuza 3
PlayStation 2: Fatal Frame 3: The Tormented
PlayStation 3: RE: The Darkside Chronicles, RE: The Umbrella Chronicles
Nintendo Switch: Phantasy Star, SIFU
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
18
Localização: Sampa/Sanca
Contato:

Mensagem por Fabio914 »

Hehe já que tem gente interessada em saber como se faz eu explico.

Bom , para começar o mapa é uma matriz 12x32 (12 linhas por 32 colunas) , no C eu consigo extrair os valores que estão em cada posição da matriz , assim eu fiz para que o programa carregasse o mapa. A diferença para o 3D é que nele eu não carrego todos os valores da matriz e desenho o mapa , eu carrego apenas aqueles que estão "próximos" ao jogador , ou seja , apenas os que eu quero carregar na tela. Como geralmente o 3D antigo só aparece 3 paredes então eu carrego 3 variaveis da matriz. Porém isso somente não é o suficiente pois o jogador não teria muita mobilidade , eu precisaria que ele pudesse rotacionar a câmera para ver as coisas de ângulos diferentes. Portanto eu criei 4 ângulos de câmera (0º , 90º , 180º e 270º) e fiz com que , dependendo do ângulo da câmera no momento , as teclas de W A S D se deslocassem em sentidos diferentes na matriz (pois eu não poderia mudar o que o jogador ver e fazer com que ele aperte para ir pra frente e no final ele vá para a direita). Em resumo isso ai se reduz a poucas linhas de código , que eu vou listar abaixo:

Switch que recebe os comandos do jogador
Note nos ifs

Código: Selecionar todos

comando = getch();
        switch(comando){
            case'j':rot--; break;       /* rotação para esquerda */
            case'l':rot++; break;       /* rotação para direita */
            case'w':if(rot==1){ y--; }  /* Ir para cima */
                    else if(rot==2){ x++; }
                    else if(rot==3){ y++; }
                    else if(rot==4){ x--; }
                    break;
            case's':if(rot==1){ y++; }  /* Ir para baixo */
                    else if(rot==2){ x--; }
                    else if(rot==3){ y--; }
                    else if(rot==4){ x++; }
                    break;
            case'd':if(rot==1){ x++; }  /* Ir para esquerda */
                    else if(rot==2){ y++; }
                    else if(rot==3){ x--; }
                    else if(rot==4){ y--; }
                    break;
            case'a':if(rot==1){ x--; }  /* Ir para direita */
                    else if(rot==2){ y--; }
                    else if(rot==3){ x++; }
                    else if(rot==4){ y++; }
                    break;
            case'q':quit=1; break;      /* Sair */
        }
    fflush(stdin);
Como quando o jogador aperta 3 vezes para a esquerda é como se ele tivesse apertado 1 para a direita , eu tive que fazer a seguinte adaptação (também para evitar que a variavel de rotação tivesse mais que 4 valores , ou seja , mais que 4 ângulos. OBS.: Isso não significa que eu não poderia criar um jogo com mais ângulos , eu fiz com 4 para ficar mais fácil a leitura dos dados na Matriz.

Código: Selecionar todos

    if (rot>4){
    rot=1;
    }

    else if (rot<1){
    rot=4;
    }
Antes de prosseguir , para ficar mais facil a compreensão do sistema de leituras de dados na matriz eu tinha feito o seguinte esquema :

quando rot = 1 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ x ]
[y*z]
[ ]

quando rot = 2 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ y ]
[ *x]
[ z ]

quando rot = 3 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ ]
[z*y]
[ x ]

quando rot = 4 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ z ]
[x* ]
[ y ]


Assim em cada caso X , Y e Z são valores de coordenadas diferentes (que dependerão de como você fez a matriz em seu jogo). Então na minha engine , eu "puxo" o valor de cada uma dessas posições em cada caso (da mesma forma que eu fiz para "puxar" na hora de desenhar o mapa no 2D , mas dessa vez eu só estarei "puxando" o que eu preciso para colocar na tela , ou seja , as 3 paredes). Portanto eu criei funções que imprimem as paredes , a da direita , a do centro e a da esquerda e nelas eu criei um if definindo qual desenho fazer para cada valor puxado da matriz. Observe:

Código: Selecionar todos

        int k=1;
        for(k=1;k<=7;k++){
        if (rot==1) { imprime_esq(matrix[y-1][x-2],k); imprime_cent(matrix[y-2][x-1],k); imprime_dir(matrix[y-1][x],k); }
        else if (rot==2) { imprime_esq(matrix[y-2][x-1],k); imprime_cent(matrix[y-1][x],k); imprime_dir(matrix[y][x-1],k); }
        else if (rot==3) { imprime_esq(matrix[y-1][x],k); imprime_cent(matrix[y][x-1],k); imprime_dir(matrix[y-1][x-2],k); }
        else if (rot==4) { imprime_esq(matrix[y][x-1],k); imprime_cent(matrix[y-1][x-2],k); imprime_dir(matrix[y-2][x-1],k); }
        printf("\n");
        }
OBS.: Está com for pois na hora de desenhar eu tenho que fazê-lo linha a linha se não a imagem não se forma.

OBS.2: X e Y são as coordenadas da posição do jogador naquele momento.

E em seguida observem como é a função que retorna a imagem para o tipo de valor na posição da matriz.

Código: Selecionar todos

imprime_esq(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("##__");
else if(line==2)printf("###_");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("###_");
else if(line==7)printf("##__");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("#EE#");
else if(line==6)printf("_EE_");
else if(line==7)printf("____");
}
}

imprime_cent(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("____");
else if(line==4)printf("____");
else if(line==5)printf("____");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("____");
else if(line==4)printf("_EE_");
else if(line==5)printf("_EE_");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
}

imprime_dir(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("__##");
else if(line==2)printf("_###");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("_###");
else if(line==7)printf("__##");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("#EE#");
else if(line==6)printf("_EE_");
else if(line==7)printf("____");
}
}
Bom , isso é tudo , acho que já da pra dar uma esclarecida de como eu montei isso ai. OBSERVAÇÃO : para fazer isso ai eu não tomei como base nenhuma outra engine (3D ou não) por isso eu não sei se tinha algum outro método mais fácil de fazê-lo...
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Rico
Mensagens: 2354
Registrado em: Dom Set 10, 2006 11:49 am
Answers: 0
18
Localização: Atrás do DU0
Contato:

Mensagem por Rico »

Gostei do First Person View :D
[xfire]p0br3[/xfire]
Futuro PC:

CPU: AMD Athlon x2 64Bits 7750 2.7GHz Black Edition
MoBo: Asus M2 ou M3.
VGA: XFX Geforce 9800 GTX 512MB ou 1GB/256Bits
HD: Seagate 1TB
PSU: ATX 600w REAIS
RAM: 4GB Ram DDR2 Kingstone @800MHz [2x2Gb]
Avatar do usuário
Pyrö
Mensagens: 2825
Registrado em: Sex Jun 09, 2006 11:40 am
Answers: 0
18
Gender:

Mensagem por Pyrö »

Fabio, VOCÊ É UM BUCHA!

Falou que não tinha tempo para mexer no Doom, nem ir em encontros, e muito menos ter tempo para dormir, mas tem tempo para fazer esses joguinhos do mal!



:?




















O Rocks também concorda com esse post
Avatar do usuário
DU0
Mensagens: 6690
Registrado em: Sáb Abr 01, 2006 6:59 am
Answers: 0
19
Localização: Deimos Lab.
Contato:

Mensagem por DU0 »

o.o

*palmas*

Vou estudar isso com calma hoje quando chegar em casa.
Jogando atualmente:
Xbox 360: Ninja Gaiden Black
Xbox One: Need for Speed: Hot Pursuit, Yakuza 3
PlayStation 2: Fatal Frame 3: The Tormented
PlayStation 3: RE: The Darkside Chronicles, RE: The Umbrella Chronicles
Nintendo Switch: Phantasy Star, SIFU
Belzebul

Mensagem por Belzebul »

Fabio914 escreveu:Hehe já que tem gente interessada em saber como se faz eu explico.

Bom , para começar o mapa é uma matriz 12x32 (12 linhas por 32 colunas) , no C eu consigo extrair os valores que estão em cada posição da matriz , assim eu fiz para que o programa carregasse o mapa. A diferença para o 3D é que nele eu não carrego todos os valores da matriz e desenho o mapa , eu carrego apenas aqueles que estão "próximos" ao jogador , ou seja , apenas os que eu quero carregar na tela. Como geralmente o 3D antigo só aparece 3 paredes então eu carrego 3 variaveis da matriz. Porém isso somente não é o suficiente pois o jogador não teria muita mobilidade , eu precisaria que ele pudesse rotacionar a câmera para ver as coisas de ângulos diferentes. Portanto eu criei 4 ângulos de câmera (0º , 90º , 180º e 270º) e fiz com que , dependendo do ângulo da câmera no momento , as teclas de W A S D se deslocassem em sentidos diferentes na matriz (pois eu não poderia mudar o que o jogador ver e fazer com que ele aperte para ir pra frente e no final ele vá para a direita). Em resumo isso ai se reduz a poucas linhas de código , que eu vou listar abaixo:

Switch que recebe os comandos do jogador
Note nos ifs

Código: Selecionar todos

comando = getch();
        switch(comando){
            case'j':rot--; break;       /* rotação para esquerda */
            case'l':rot++; break;       /* rotação para direita */
            case'w':if(rot==1){ y--; }  /* Ir para cima */
                    else if(rot==2){ x++; }
                    else if(rot==3){ y++; }
                    else if(rot==4){ x--; }
                    break;
            case's':if(rot==1){ y++; }  /* Ir para baixo */
                    else if(rot==2){ x--; }
                    else if(rot==3){ y--; }
                    else if(rot==4){ x++; }
                    break;
            case'd':if(rot==1){ x++; }  /* Ir para esquerda */
                    else if(rot==2){ y++; }
                    else if(rot==3){ x--; }
                    else if(rot==4){ y--; }
                    break;
            case'a':if(rot==1){ x--; }  /* Ir para direita */
                    else if(rot==2){ y--; }
                    else if(rot==3){ x++; }
                    else if(rot==4){ y++; }
                    break;
            case'q':quit=1; break;      /* Sair */
        }
    fflush(stdin);
Como quando o jogador aperta 3 vezes para a esquerda é como se ele tivesse apertado 1 para a direita , eu tive que fazer a seguinte adaptação (também para evitar que a variavel de rotação tivesse mais que 4 valores , ou seja , mais que 4 ângulos. OBS.: Isso não significa que eu não poderia criar um jogo com mais ângulos , eu fiz com 4 para ficar mais fácil a leitura dos dados na Matriz.

Código: Selecionar todos

    if (rot>4){
    rot=1;
    }

    else if (rot<1){
    rot=4;
    }
Antes de prosseguir , para ficar mais facil a compreensão do sistema de leituras de dados na matriz eu tinha feito o seguinte esquema :

quando rot = 1 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ x ]
[y*z]
[ ]

quando rot = 2 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ y ]
[ *x]
[ z ]

quando rot = 3 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ ]
[z*y]
[ x ]

quando rot = 4 eu carrego os valores das posições X , Y , Z , sendo * a posição do jogador.

[ z ]
[x* ]
[ y ]


Assim em cada caso X , Y e Z são valores de coordenadas diferentes (que dependerão de como você fez a matriz em seu jogo). Então na minha engine , eu "puxo" o valor de cada uma dessas posições em cada caso (da mesma forma que eu fiz para "puxar" na hora de desenhar o mapa no 2D , mas dessa vez eu só estarei "puxando" o que eu preciso para colocar na tela , ou seja , as 3 paredes). Portanto eu criei funções que imprimem as paredes , a da direita , a do centro e a da esquerda e nelas eu criei um if definindo qual desenho fazer para cada valor puxado da matriz. Observe:

Código: Selecionar todos

        int k=1;
        for(k=1;k<=7;k++){
        if (rot==1) { imprime_esq(matrix[y-1][x-2],k); imprime_cent(matrix[y-2][x-1],k); imprime_dir(matrix[y-1][x],k); }
        else if (rot==2) { imprime_esq(matrix[y-2][x-1],k); imprime_cent(matrix[y-1][x],k); imprime_dir(matrix[y][x-1],k); }
        else if (rot==3) { imprime_esq(matrix[y-1][x],k); imprime_cent(matrix[y][x-1],k); imprime_dir(matrix[y-1][x-2],k); }
        else if (rot==4) { imprime_esq(matrix[y][x-1],k); imprime_cent(matrix[y-1][x-2],k); imprime_dir(matrix[y-2][x-1],k); }
        printf("\n");
        }
OBS.: Está com for pois na hora de desenhar eu tenho que fazê-lo linha a linha se não a imagem não se forma.

OBS.2: X e Y são as coordenadas da posição do jogador naquele momento.

E em seguida observem como é a função que retorna a imagem para o tipo de valor na posição da matriz.

Código: Selecionar todos

imprime_esq(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("##__");
else if(line==2)printf("###_");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("###_");
else if(line==7)printf("##__");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("#EE#");
else if(line==6)printf("_EE_");
else if(line==7)printf("____");
}
}

imprime_cent(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("____");
else if(line==4)printf("____");
else if(line==5)printf("____");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("____");
else if(line==4)printf("_EE_");
else if(line==5)printf("_EE_");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
}

imprime_dir(int i,int line){
if (i==0){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("____");
else if(line==7)printf("____");
}
else if (i==1){
if(line==1)printf("__##");
else if(line==2)printf("_###");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("####");
else if(line==6)printf("_###");
else if(line==7)printf("__##");
}
else if (i==2){
if(line==1)printf("____");
else if(line==2)printf("____");
else if(line==3)printf("####");
else if(line==4)printf("####");
else if(line==5)printf("#EE#");
else if(line==6)printf("_EE_");
else if(line==7)printf("____");
}
}
Bom , isso é tudo , acho que já da pra dar uma esclarecida de como eu montei isso ai. OBSERVAÇÃO : para fazer isso ai eu não tomei como base nenhuma outra engine (3D ou não) por isso eu não sei se tinha algum outro método mais fácil de fazê-lo...
er....
....alguém traduz o que ele disse? :podre: