From 323e3f7c24e220260ef651ecf039b1ffce1d0cda Mon Sep 17 00:00:00 2001 From: "Dmitry V. Sokolov" Date: Sat, 9 Feb 2019 21:38:13 +0100 Subject: [PATCH] monsters shown on the map --- doc/013.png | Bin 0 -> 23680 bytes framebuffer.cpp | 1 - monsters.png | Bin 7546 -> 8808 bytes sprite.h | 12 ++++++++++++ textures.h | 2 +- tinyraycaster.cpp | 44 ++++++++++++++++++++++++++------------------ 6 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 doc/013.png create mode 100644 sprite.h diff --git a/doc/013.png b/doc/013.png new file mode 100644 index 0000000000000000000000000000000000000000..98263a466c0a338224007ab0708a9c3f8701327e GIT binary patch literal 23680 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 literal 0 HcmV?d00001 diff --git a/framebuffer.cpp b/framebuffer.cpp index 860679d..d5715e4 100644 --- a/framebuffer.cpp +++ b/framebuffer.cpp @@ -27,4 +27,3 @@ void FrameBuffer::clear(const uint32_t color) { img = std::vector(w*h, color); } - diff --git a/monsters.png b/monsters.png index 637e3710edbf108a1faa3c8c171033b09ae1f22a..ee99b3ab4a0ce3f077c1890105ef7ee118d911a2 100644 GIT binary patch literal 8808 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 Q!7VAEt7)XssBRbaf8W!GMgRZ+ diff --git a/sprite.h b/sprite.h new file mode 100644 index 0000000..8dcc710 --- /dev/null +++ b/sprite.h @@ -0,0 +1,12 @@ +#ifndef SPRITE_H +#define SPRITE_H + +#include + +struct Sprite { + float x, y; + size_t tex_id; +}; + +#endif // SPRITE_H + diff --git a/textures.h b/textures.h index a833bcb..2f5533a 100644 --- a/textures.h +++ b/textures.h @@ -7,7 +7,7 @@ struct Texture { std::vector img; // textures storage container Texture(const std::string filename); - uint32_t &get(const size_t i, const size_t j, const size_t idx); // get the pixel (i,j) from the textrue idx + uint32_t &get(const size_t i, const size_t j, const size_t idx); // get the pixel (i,j) from the texture idx std::vector get_scaled_column(const size_t texture_id, const size_t tex_coord, const size_t column_height); // retrieve one column (tex_coord) from the texture texture_id and scale it to the destination size }; diff --git a/tinyraycaster.cpp b/tinyraycaster.cpp index d5ff79f..bc00c75 100644 --- a/tinyraycaster.cpp +++ b/tinyraycaster.cpp @@ -10,22 +10,29 @@ #include "map.h" #include "utils.h" #include "player.h" +#include "sprite.h" #include "framebuffer.h" #include "textures.h" -int wall_x_texcoord(const float x, const float y, Texture &tex_walls) { - float hitx = x - floor(x+.5); // hitx and hity contain (signed) fractional parts of x and y, - float hity = y - floor(y+.5); // they vary between -0.5 and +0.5, and one of them is supposed to be very close to 0 - int tex = hitx*tex_walls.size; - if (std::abs(hity)>std::abs(hitx)) // we need to determine whether we hit a "vertical" or a "horizontal" wall (w.r.t the map) - tex = hity*tex_walls.size; +int wall_x_texcoord(const float hitx, const float hity, Texture &tex_walls) { + float x = hitx - floor(hitx+.5); // x and y contain (signed) fractional parts of hitx and hity, + float y = hity - floor(hity+.5); // they vary between -0.5 and +0.5, and one of them is supposed to be very close to 0 + int tex = x*tex_walls.size; + if (std::abs(y)>std::abs(x)) // we need to determine whether we hit a "vertical" or a "horizontal" wall (w.r.t the map) + tex = y*tex_walls.size; if (tex<0) // do not forget x_texcoord can be negative, fix that tex += tex_walls.size; assert(tex>=0 && tex<(int)tex_walls.size); return tex; } -void render(FrameBuffer &fb, Map &map, Player &player, Texture &tex_walls) { +void map_show_sprite(Sprite &sprite, FrameBuffer &fb, Map &map) { + const size_t rect_w = fb.w/(map.w*2); // size of one map cell on the screen + const size_t rect_h = fb.h/map.h; + fb.draw_rectangle(sprite.x*rect_w-3, sprite.y*rect_h-3, 6, 6, pack_color(255, 0, 0)); +} + +void render(FrameBuffer &fb, Map &map, Player &player, std::vector &sprites, Texture &tex_walls, Texture &tex_monst) { fb.clear(pack_color(255, 255, 255)); // clear the screen const size_t rect_w = fb.w/(map.w*2); // size of one map cell on the screen @@ -52,7 +59,8 @@ void render(FrameBuffer &fb, Map &map, Player &player, Texture &tex_walls) { size_t texid = map.get(x, y); // our ray touches a wall, so draw the vertical column to create an illusion of 3D assert(texid column = tex_walls.get_scaled_column(texid, x_texcoord, column_height); int pix_x = i + fb.w/2; // we are drawing at the right half of the screen, thus +fb.w/2 @@ -65,6 +73,10 @@ void render(FrameBuffer &fb, Map &map, Player &player, Texture &tex_walls) { break; } // ray marching loop } // field of view ray sweeping + + for (size_t i=0; i sprites{ {1.834, 8.765, 0}, {5.323, 5.365, 1}, {4.123, 10.265, 1} }; - for (size_t frame=0; frame<360; frame++) { - std::stringstream ss; - ss << std::setfill('0') << std::setw(5) << frame << ".ppm"; - player.a += 2*M_PI/360; - - render(fb, map, player, tex_walls); - drop_ppm_image(ss.str(), fb.img, fb.w, fb.h); - } + render(fb, map, player, sprites, tex_walls, tex_monst); + drop_ppm_image("./out.ppm", fb.img, fb.w, fb.h); return 0; }