[phpBB Debug] PHP Warning: in file /bitnami/phpbb/ext/kinerity/bestanswer/event/main_listener.php on line 514: Undefined array key "poster_answers"
BrDoom Fórum • [C] Labirintum!
Página 1 de 2

[C] Labirintum!

Enviado: Sáb Set 27, 2008 2:13 pm
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

Enviado: Sáb Set 27, 2008 2:20 pm
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

Enviado: Sáb Set 27, 2008 3:03 pm
por Space Marine
:o

To comecando a ficar com medo do fabio

Enviado: Sáb Set 27, 2008 3:42 pm
por Z-Man
O Fabio eh Fodastico pra faze essas coisa 8)

Enviado: Sáb Set 27, 2008 4:17 pm
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

Enviado: Sáb Set 27, 2008 4:44 pm
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...

Enviado: Sáb Set 27, 2008 5:16 pm
por Rico
Gostei do First Person View :D

Enviado: Sáb Set 27, 2008 7:20 pm
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

Enviado: Sáb Set 27, 2008 7:25 pm
por DU0
o.o

*palmas*

Vou estudar isso com calma hoje quando chegar em casa.

Enviado: Sáb Set 27, 2008 8:20 pm
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: