1
0
mirror of https://github.com/ssloy/tinyraycaster.git synced 2025-09-09 21:50:43 +02:00

crude SDL event handling; walking in the game shows plenty of bugs :)

This commit is contained in:
Dmitry V. Sokolov
2019-02-09 22:38:32 +01:00
parent 152b477820
commit a7e92d5543
3 changed files with 29 additions and 9 deletions

33
gui.cpp
View File

@@ -12,7 +12,7 @@
int main() {
FrameBuffer fb{1024, 512, std::vector<uint32_t>(1024*512, pack_color(255, 255, 255))};
Player player{3.456, 2.345, 1.523, M_PI/3.};
Player player{3.456, 2.345, 1.523, M_PI/3., 0, 0};
Map map;
Texture tex_walls("../walltext.png");
Texture tex_monst("../monsters.png");
@@ -20,8 +20,7 @@ int main() {
std::cerr << "Failed to load textures" << std::endl;
return -1;
}
std::vector<Sprite> 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);
std::vector<Sprite> sprites{ {3.523, 3.812, 2, 0}, {1.834, 8.765, 0, 0}, {5.323, 5.365, 1, 0}, {4.123, 10.765, 1, 0} };
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr;
@@ -37,15 +36,35 @@ int main() {
}
SDL_Texture *framebuffer_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, fb.w, fb.h);
SDL_UpdateTexture(framebuffer_texture, NULL, reinterpret_cast<void *>(fb.img.data()), fb.w*4);
SDL_Event event;
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_QUIT) {
break;
if (SDL_PollEvent(&event)) {
if (SDL_QUIT==event.type || (SDL_KEYDOWN==event.type && SDLK_ESCAPE==event.key.keysym.sym)) break;
if (SDL_KEYUP==event.type) {
if ('a'==event.key.keysym.sym || 'd'==event.key.keysym.sym) player.turn = 0;
if ('w'==event.key.keysym.sym || 's'==event.key.keysym.sym) player.walk = 0;
}
if (SDL_KEYDOWN==event.type) {
if ('a'==event.key.keysym.sym) player.turn = -1;
if ('d'==event.key.keysym.sym) player.turn = 1;
if ('w'==event.key.keysym.sym) player.walk = 1;
if ('s'==event.key.keysym.sym) player.walk = -1;
}
}
player.a += float(player.turn)*.05;
float nx = player.x + player.walk*cos(player.a)*.1;
float ny = player.y + player.walk*sin(player.a)*.1;
if (int(nx)>=0 && int(nx)<int(map.w) && int(ny)>=0 && int(ny)<int(map.h) && map.is_empty(nx, ny)) {
player.x = nx;
player.y = ny;
}
render(fb, map, player, sprites, tex_walls, tex_monst);
SDL_UpdateTexture(framebuffer_texture, NULL, reinterpret_cast<void *>(fb.img.data()), fb.w*4);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, framebuffer_texture, NULL, NULL);
SDL_RenderPresent(renderer);

View File

@@ -5,6 +5,7 @@ struct Player {
float x, y; // position
float a; // view direction
float fov; // field of view
int turn, walk;
};
#endif // PLAYER_H

View File

@@ -40,7 +40,7 @@ void draw_sprite(Sprite &sprite, std::vector<float> &depth_buffer, FrameBuffer &
while (sprite_dir - player.a < -M_PI) sprite_dir += 2*M_PI;
size_t sprite_screen_size = std::min(1000, static_cast<int>(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 h_offset = (sprite_dir - player.a)*(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<sprite_screen_size; i++) {
@@ -85,7 +85,7 @@ void render(FrameBuffer &fb, Map &map, Player &player, std::vector<Sprite> &spri
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<tex_walls.count);
float dist = t*cos(angle-player.a);
float dist = .2+t*cos(angle-player.a);
depth_buffer[i] = dist;
size_t column_height = fb.h/dist;
int x_texcoord = wall_x_texcoord(x, y, tex_walls);