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