Dev - C++ - ayuda con raycasting c++ [traducir al español]

 
Vista:
Imágen de perfil de felipe
Val: 141
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con raycasting c++ [traducir al español]

Publicado por felipe (74 intervenciones) el 12/05/2020 16:22:22
Hola
Estoy intentando crear un raycasting y tengo la mayoría del algoritmo completado para renderizar muros sin textura.
Tengo un problema y es que los muros no se ven correctamente.
Solo se muestra en pantalla un muro del mismo tamaño y eso obviamente esta mal.
Ojala puedan ayudarme, en verdad lo necesito.
Estoy haciendo uso de una libreria grafica y estoy seguro que el error no es ese.

codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//header que incluye variables y funciones para el renderizado y manipulacion del mapa.
 
#define black       0,0,0
#define red   		255,0,0
#define green 		0,255,0
#define blue        0,0,255
#define light_gray  97,97,97
#define brown       126,79,52        //color cafe
 
const unsigned int mapSize  = 12;
 
char map[mapSize+1][mapSize+1]{
	"XXXXXXXXXXXX",
	"X          X",
	"X          X",
	"X  X       X",
	"X    X     X",
	"X          X",
	"X       X  X",
	"X          X",
	"X  X   X   X",
	"X   X      X",
	"X          X",
	"XXXXXXXXXXXX",
};
 
struct St2DMap{
	void keys();
	void render();
}2dmap;
 
struct St2DRay{
	float distance;
	float angle;
	float reasonX,reasonY;
	float step;
	bool hitWall;
 
	float finalXcoord; //coordenadas finales para detectar muros
	float finalYcoord;
 
	int wallHeight;  //altura de la pared (depende de la distancia)
 
	int initWall; //coordenada Y inicial de la pared
	int endWall;  //coord Y final de la pared
 
}2DRay;
 
 
void St2DMap::keys(){
	//mover la camara del jugador
	if(keyStack.a) player.angle -= PI/9/window.maxFps;
	if(keyStack.d) player.angle += PI/9/window.maxFps;
 
	//mover al jugador
	if(keyStack.w) player.y -= 1.0/window.maxFps;
	if(keyStack.s) player.y += 1.0/window.maxFps;
}
 
 
void St2DMap::render(){
 
	for(int xx=0;xx<=window.width;xx++){
 
		2DRay.angle    = (player.angle - (player.FOV/2)) + (xx/window.width*player.FOV);
 
		2DRay.reasonX  = cos(2DRay.angle);
		2DRay.reasonY  = sin(2DRay.angle);
 
		2DRay.distance = -0.1;
		2DRay.step     = 0.1;
		2DRay.hitWall  = false;
 
		while(!2DRay.hitWall){
			2DRay.distance += 2DRay.step;
 
			2DRay.finalXcoord = player.x + 2DRay.reasonX * 2DRay.distance;
			2DRay.finalYcoord = player.y + 2DRay.reasonY * 2DRay.reasonX;
 
			//comprobar si el rayo golpeo un muro
			if(map[int(2DRay.finalYcoord)][int(2DRay.finalXcoord)] == 'X'){
				//2DRay.block = map[int(2DRay.finalYcoord)][int(2DRay.finalXcoord)];
				2DRay.hitWall = true;
			}
		}
 
		2DRay.wallHeight = window.height-(2DRay.distance*30)+0.1;   //altura de la pared
 
		2DRay.initWall = (window.height - 2DRay.wallHeight) /2;
		2DRay.endWall  = 2DRay.initWall + 2DRay.wallHeight;
 
 
		//dibujar color de "techo"
		al_draw_line(xx,1,xx,2DRay.initWall,al_map_rgb(light_gray),0);
 
		//dibujar color de muro
		al_draw_line(xx,2DRay.initWall,xx,2DRay.endWall,al_map_rgb(black),0);
 
		//dibujar color de "piso"
		al_draw_line(xx,2DRay.endWall,xx,window.height,al_map_rgb(brown),0);
 
		/* al_draw_line(x1,y1,x2,y2,color,0); */
	}
}
 
/*
otras variables que no aparecian en este header:
window.width = 800
window.height = 450
player.fov = 0.785 (en radianes)
*/

y video:


Si observan bien, la ultima columna de pixeles de la derecha (vertical), tiene una altura diferente

estoy estancado en esta parte del trabajo y no puedo avanzar
ayuda, gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder