- Inici de soport per a diferents altures de sostre i piso dels sectors
This commit is contained in:
75
main.cpp
75
main.cpp
@@ -9,6 +9,8 @@
|
|||||||
struct vec2 { float x, y; };
|
struct vec2 { float x, y; };
|
||||||
struct wall { Uint16 v1, v2; vec2 normal; float u1, u2; int portal; };
|
struct wall { Uint16 v1, v2; vec2 normal; float u1, u2; int portal; };
|
||||||
struct sector {
|
struct sector {
|
||||||
|
float floor_height;
|
||||||
|
float ceiling_height;
|
||||||
std::vector<wall> walls;
|
std::vector<wall> walls;
|
||||||
std::vector<vec2> verts;
|
std::vector<vec2> verts;
|
||||||
};
|
};
|
||||||
@@ -25,7 +27,8 @@ std::vector<sector> sectors;
|
|||||||
int current_sector;
|
int current_sector;
|
||||||
|
|
||||||
vec2 position = { 128.0f, 192.0f };
|
vec2 position = { 128.0f, 192.0f };
|
||||||
float height = 32.0f;
|
float height = 48.0f;
|
||||||
|
float real_height = 48.0f;
|
||||||
float orientation = 90.0f;
|
float orientation = 90.0f;
|
||||||
|
|
||||||
float accel = 500.0f;
|
float accel = 500.0f;
|
||||||
@@ -133,6 +136,9 @@ void createMap()
|
|||||||
current_sector = 0;
|
current_sector = 0;
|
||||||
{
|
{
|
||||||
sector s;
|
sector s;
|
||||||
|
s.floor_height = 0.0f;
|
||||||
|
s.ceiling_height = 128.0f;
|
||||||
|
|
||||||
s.verts.push_back({ 64.0f, 0.0f});
|
s.verts.push_back({ 64.0f, 0.0f});
|
||||||
s.verts.push_back({256.0f, 0.0f});
|
s.verts.push_back({256.0f, 0.0f});
|
||||||
s.verts.push_back({256.0f, 64.0f});
|
s.verts.push_back({256.0f, 64.0f});
|
||||||
@@ -155,6 +161,9 @@ void createMap()
|
|||||||
|
|
||||||
{
|
{
|
||||||
sector s;
|
sector s;
|
||||||
|
s.floor_height = 0.0f;
|
||||||
|
s.ceiling_height = 128.0f;
|
||||||
|
|
||||||
s.verts.push_back({256.0f, 0.0f});
|
s.verts.push_back({256.0f, 0.0f});
|
||||||
s.verts.push_back({ 64.0f, 0.0f});
|
s.verts.push_back({ 64.0f, 0.0f});
|
||||||
s.verts.push_back({ 64.0f,-256.0f});
|
s.verts.push_back({ 64.0f,-256.0f});
|
||||||
@@ -203,16 +212,19 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
|
|||||||
}
|
}
|
||||||
if (w)
|
if (w)
|
||||||
{
|
{
|
||||||
|
const int tex_height = 64;
|
||||||
|
const float sector_height = s.ceiling_height - s.floor_height;
|
||||||
|
|
||||||
map::putp(result.x, result.y, 6);
|
map::putp(result.x, result.y, 6);
|
||||||
dist *= SDL_cosf(a_inc*DEG_TO_RAD);
|
dist *= SDL_cosf(a_inc*DEG_TO_RAD);
|
||||||
const vec2 AB = {s.verts[w->v2].x-s.verts[w->v1].x, s.verts[w->v2].y-s.verts[w->v1].y};
|
const vec2 AB = {s.verts[w->v2].x-s.verts[w->v1].x, s.verts[w->v2].y-s.verts[w->v1].y};
|
||||||
const vec2 AP = {result.x-s.verts[w->v1].x, result.y-s.verts[w->v1].y};
|
const vec2 AP = {result.x-s.verts[w->v1].x, result.y-s.verts[w->v1].y};
|
||||||
float v = dot(AP,AB) / dot(AB,AB); v *= w->u2; v = (v-int(v))*64.0f;
|
float v = dot(AP,AB) / dot(AB,AB); v *= w->u2; v = (v-int(v))*tex_height;
|
||||||
//const float v = distance(s.verts[w.v1], result);
|
|
||||||
float wall_height = (64*277)/dist;
|
float wall_height = (sector_height*277)/dist; // [64=altura sector]
|
||||||
float dpix = 64/wall_height;
|
float dpix = tex_height/wall_height; // [64=crec que altura sector]
|
||||||
float cpix = 0;
|
float cpix = 0;
|
||||||
float wall_start = 120-(wall_height/64)*(64-height);
|
float wall_start = 120-(wall_height/sector_height)*(sector_height-(height-s.floor_height)); // [64=els dos crec que altura sector]
|
||||||
if (wall_start<start) {
|
if (wall_start<start) {
|
||||||
cpix = (start-wall_start)*dpix;
|
cpix = (start-wall_start)*dpix;
|
||||||
wall_height -= (start-wall_start);
|
wall_height -= (start-wall_start);
|
||||||
@@ -221,19 +233,20 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
|
|||||||
|
|
||||||
// Pinta el sostre
|
// Pinta el sostre
|
||||||
for (int y=start; y<wall_start-1; y++) {
|
for (int y=start; y<wall_start-1; y++) {
|
||||||
float straight_dist = (277 * (64-height)) / (y - (240 >> 1));
|
float straight_dist = (277 * (sector_height-(height-s.floor_height))) / (y - (240 >> 1));
|
||||||
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
|
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
|
||||||
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) - position.x)) % 64;
|
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) - position.x)) % tex_height;
|
||||||
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) - position.y)) % 64;
|
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) - position.y)) % tex_height;
|
||||||
putp(screen_column, y, gif[tx+ty*64]);
|
putp(screen_column, y, gif[tx+ty*tex_height]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (w->portal == -1)
|
if (w->portal == -1)
|
||||||
{
|
{
|
||||||
// Pinta la pared
|
// Pinta la pared
|
||||||
for (int i=0; i<wall_height; ++i) {
|
for (int i=0; i<wall_height; ++i) {
|
||||||
if (wall_start+i>=end) break;
|
if (wall_start+i>=end) break;
|
||||||
putp(screen_column, wall_start+i, gif[(int(v)%64)+int(cpix)*64]);
|
putp(screen_column, wall_start+i, gif[(int(v)%tex_height)+int(cpix)*tex_height]);
|
||||||
cpix += dpix;
|
cpix += dpix;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -244,11 +257,11 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
|
|||||||
// Pinta el piso
|
// Pinta el piso
|
||||||
int paint_end = wall_start+wall_height-1;
|
int paint_end = wall_start+wall_height-1;
|
||||||
for (int y=paint_end+1; y<end-1; y++) {
|
for (int y=paint_end+1; y<end-1; y++) {
|
||||||
float straight_dist = (277 * height) / (y - (240 >> 1));
|
float straight_dist = (277 * (height-s.floor_height)) / (y - (240 >> 1));
|
||||||
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
|
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
|
||||||
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) + position.x)) % 64;
|
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) + position.x)) % tex_height;
|
||||||
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) + position.y)) % 64;
|
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) + position.y)) % tex_height;
|
||||||
putp(screen_column, y, gif[tx+ty*64]);
|
putp(screen_column, y, gif[tx+ty*tex_height]);
|
||||||
}
|
}
|
||||||
//line(screen_column, 120-(wall_height), screen_column, 120+(wall_height), 5);
|
//line(screen_column, 120-(wall_height), screen_column, 120+(wall_height), 5);
|
||||||
}
|
}
|
||||||
@@ -337,7 +350,7 @@ int main(int argc, char *argv[])
|
|||||||
millis = SDL_GetTicks();
|
millis = SDL_GetTicks();
|
||||||
|
|
||||||
bobbing += dt*1000.0f;
|
bobbing += dt*1000.0f;
|
||||||
height = 32 + SDL_sinf(bobbing*DEG_TO_RAD)*(speed/100.0f);
|
height = real_height + SDL_sinf(bobbing*DEG_TO_RAD)*(speed/100.0f);
|
||||||
|
|
||||||
while (SDL_PollEvent(&e))
|
while (SDL_PollEvent(&e))
|
||||||
{
|
{
|
||||||
@@ -346,8 +359,31 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool *keys = SDL_GetKeyboardState(NULL);
|
const bool *keys = SDL_GetKeyboardState(NULL);
|
||||||
if (keys[SDL_SCANCODE_Q]) height += dt*speed;
|
if (keys[SDL_SCANCODE_Q])
|
||||||
if (keys[SDL_SCANCODE_A]) height -= dt*speed;
|
{
|
||||||
|
real_height += dt*100.0f;
|
||||||
|
}
|
||||||
|
if (keys[SDL_SCANCODE_A])
|
||||||
|
{
|
||||||
|
real_height -= dt*100.0f;
|
||||||
|
}
|
||||||
|
if (keys[SDL_SCANCODE_W])
|
||||||
|
{
|
||||||
|
//real_height += dt*100.0f;
|
||||||
|
sectors[0].ceiling_height -= dt*100.0f;
|
||||||
|
sectors[1].ceiling_height -= dt*100.0f;
|
||||||
|
sectors[0].floor_height -= dt*100.0f;
|
||||||
|
sectors[1].floor_height -= dt*100.0f;
|
||||||
|
}
|
||||||
|
if (keys[SDL_SCANCODE_S])
|
||||||
|
{
|
||||||
|
//real_height -= dt*100.0f;
|
||||||
|
sectors[0].ceiling_height += dt*100.0f;
|
||||||
|
sectors[1].ceiling_height += dt*100.0f;
|
||||||
|
sectors[0].floor_height += dt*100.0f;
|
||||||
|
sectors[1].floor_height += dt*100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_RIGHT])
|
if (keys[SDL_SCANCODE_RIGHT])
|
||||||
{
|
{
|
||||||
orientation += dt*rspeed;
|
orientation += dt*rspeed;
|
||||||
@@ -428,6 +464,9 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
debug::println("fps:", fps);
|
debug::println("fps:", fps);
|
||||||
debug::println("sector:", current_sector);
|
debug::println("sector:", current_sector);
|
||||||
|
debug::println("height:", real_height);
|
||||||
|
debug::println("ceil_height:", sectors[0].ceiling_height);
|
||||||
|
debug::println("floor_height:", sectors[0].floor_height);
|
||||||
debug::render(sdl_renderer);
|
debug::render(sdl_renderer);
|
||||||
|
|
||||||
SDL_RenderPresent(sdl_renderer);
|
SDL_RenderPresent(sdl_renderer);
|
||||||
|
|||||||
Reference in New Issue
Block a user