diff --git a/doc/016.png b/doc/016.png new file mode 100644 index 0000000..202a5e6 Binary files /dev/null and b/doc/016.png differ diff --git a/sprite.h b/sprite.h index 8dcc710..bc76fa5 100644 --- a/sprite.h +++ b/sprite.h @@ -6,6 +6,8 @@ struct Sprite { float x, y; size_t tex_id; + float player_dist; + bool operator < (const Sprite& s) const; }; #endif // SPRITE_H diff --git a/tinyraycaster.cpp b/tinyraycaster.cpp index ffbf2e9..aee16e8 100644 --- a/tinyraycaster.cpp +++ b/tinyraycaster.cpp @@ -1,6 +1,7 @@ #define _USE_MATH_DEFINES #include #include +#include #include #include #include @@ -38,14 +39,13 @@ void draw_sprite(Sprite &sprite, std::vector &depth_buffer, FrameBuffer & while (sprite_dir - player.a > M_PI) sprite_dir -= 2*M_PI; // remove unncesessary periods from the relative direction while (sprite_dir - player.a < -M_PI) sprite_dir += 2*M_PI; - float sprite_dist = std::sqrt(pow(player.x - sprite.x, 2) + pow(player.y - sprite.y, 2)); // distance from the player to the sprite - size_t sprite_screen_size = std::min(1000, static_cast(fb.h/sprite_dist)); // screen sprite size + size_t sprite_screen_size = std::min(1000, static_cast(fb.h/sprite.player_dist)); // screen sprite size int h_offset = (sprite_dir - player.a)/player.fov*(fb.w/2) + (fb.w/2)/2 - tex_sprites.size/2; // do not forget the 3D view takes only a half of the framebuffer int v_offset = fb.h/2 - sprite_screen_size/2; for (size_t i=0; i=fb.w/2) continue; - if (depth_buffer[h_offset+i]=fb.h) continue; uint32_t color = tex_sprites.get(i*tex_sprites.size/sprite_screen_size, j*tex_sprites.size/sprite_screen_size, sprite.tex_id); @@ -101,7 +101,12 @@ void render(FrameBuffer &fb, Map &map, Player &player, std::vector &spri } // ray marching loop } // field of view ray sweeping - for (size_t i=0; i sprites{ {3.523, 3.812, 2}, {1.834, 8.765, 0}, {5.323, 5.365, 1}, {4.123, 10.265, 1} }; + std::vector sprites{ {3.523, 3.812, 2, 0}, {1.834, 8.765, 0, 0}, {5.323, 5.365, 1, 0}, {4.123, 10.265, 1, 0} }; render(fb, map, player, sprites, tex_walls, tex_monst); drop_ppm_image("./out.ppm", fb.img, fb.w, fb.h);