Level traversal works better now, compass is accurate, and direction is maintained when you traverse.
This commit is contained in:
parent
b75a2b8c31
commit
14c7f660de
11 changed files with 35 additions and 16 deletions
|
@ -62,6 +62,10 @@ void Raycaster::position_camera(float player_x, float player_y) {
|
|||
// x and y start position
|
||||
$pos_x = player_x;
|
||||
$pos_y = player_y;
|
||||
$dir_x = 1;
|
||||
$dir_y = 0;
|
||||
$plane_x = 0;
|
||||
$plane_y = 0.66;
|
||||
}
|
||||
|
||||
void Raycaster::draw_pixel_buffer() {
|
||||
|
@ -81,8 +85,8 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) {
|
|||
for(auto& rec : sprite_order) {
|
||||
if(!$sprites.contains(rec.second)) continue;
|
||||
|
||||
// BUG: eventually this needs to go away too
|
||||
auto& sf_sprite = $sprites.at(rec.second).sprite;
|
||||
auto& sprite_texture = $sprites.at(rec.second);
|
||||
auto& sf_sprite = sprite_texture.sprite;
|
||||
auto sprite_pos = $level.world->get<components::Position>(rec.second);
|
||||
|
||||
double sprite_x = double(sprite_pos.location.x) - $pos_x + 0.5;
|
||||
|
@ -100,11 +104,12 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) {
|
|||
// calculate the height of the sprite on screen
|
||||
//using "transform_y" instead of the real distance prevents fisheye
|
||||
int sprite_height = abs(int($height / transform_y));
|
||||
if(sprite_height == 0) continue;
|
||||
|
||||
// calculate width the the sprite
|
||||
// same as height of sprite, given that it's square
|
||||
int sprite_width = abs(int($height / transform_y));
|
||||
// CUT
|
||||
if(sprite_width == 0) continue;
|
||||
|
||||
int draw_start_x = -sprite_width / 2 + sprite_screen_x;
|
||||
if(draw_start_x < 0) draw_start_x = 0;
|
||||
|
@ -369,12 +374,11 @@ void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite)
|
|||
}
|
||||
|
||||
void Raycaster::update_level(GameLevel level) {
|
||||
$level = level;
|
||||
$sprites.clear();
|
||||
|
||||
$level = level;
|
||||
auto& tiles = $level.map->tiles();
|
||||
$map = textures::convert_char_to_texture(tiles.$tile_ids);
|
||||
$dir_x = 1; // reset dir vector
|
||||
$dir_y = 0;
|
||||
|
||||
$level.world->query<components::Sprite>([&](const auto ent, auto& sprite) {
|
||||
// player doesn't need a sprite
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue