Properly fixed missing chunks

This commit is contained in:
Kyler Olsen 2024-11-10 22:21:04 -07:00
parent 901225ac21
commit de165606cb
1 changed files with 72 additions and 31 deletions

103
game.py
View File

@ -38,6 +38,7 @@ def draw_map(
player_pos: pygame.Vector2, player_pos: pygame.Vector2,
player_dir: pygame.Vector2, player_dir: pygame.Vector2,
world_map: maze.Maze, world_map: maze.Maze,
max_dis: float,
): ):
screen.fill(pygame.Color(64,64,64)) screen.fill(pygame.Color(64,64,64))
@ -52,21 +53,24 @@ def draw_map(
plane = pygame.Vector2(0,0.66).rotate(player_dir.as_polar()[1]) plane = pygame.Vector2(0,0.66).rotate(player_dir.as_polar()[1])
for x in range(0, screen.width, 50): # for x in range(0, screen.width, 50):
camera = 2 * x / screen.width - 1 # camera = 2 * x / screen.width - 1
# if True: if True:
# camera = 0 camera = 0
ray_dir = player_dir.normalize() + (plane * camera) ray_dir = player_dir.normalize() + (plane * camera)
wall_dist, side = ray(player_pos, ray_dir, world_map, debug=True) wall_dist, side = ray(
if side is not None: player_pos, ray_dir, world_map, max_dis*max_dis, debug=True)
pygame.draw.line( if side is None: color = pygame.Color(255,0,0)
screen, elif side == 0: color = pygame.Color(255,255,0)
pygame.Color(0,255,0) if side else pygame.Color(255,0,0), else: color = pygame.Color(0,255,255)
(player_pos) + (pygame.Vector2(screen.size) // 2), pygame.draw.line(
(player_pos) + (ray_dir * wall_dist) + screen,
(pygame.Vector2(screen.size) // 2), color,
) (player_pos) + (pygame.Vector2(screen.size) // 2),
(player_pos) + (ray_dir * wall_dist) +
(pygame.Vector2(screen.size) // 2),
)
for y in range(world_map.height): for y in range(world_map.height):
for x in range(world_map.width): for x in range(world_map.width):
@ -80,6 +84,8 @@ def draw_game(
player_pos: pygame.Vector2, player_pos: pygame.Vector2,
player_dir: pygame.Vector2, player_dir: pygame.Vector2,
world_map: maze.Maze, world_map: maze.Maze,
max_dis: float,
fog: bool = True,
): ):
screen.fill(pygame.Color(0,0,0)) screen.fill(pygame.Color(0,0,0))
@ -89,7 +95,7 @@ def draw_game(
camera = 2 * x / screen.width - 1 camera = 2 * x / screen.width - 1
ray_dir = player_dir.normalize() + (plane * camera) ray_dir = player_dir.normalize() + (plane * camera)
wall_dist, side = ray(player_pos, ray_dir, world_map) wall_dist, side = ray(player_pos, ray_dir, world_map, max_dis*max_dis)
if side is not None: if side is not None:
lineHeight = int(screen.height / max(wall_dist, 1e-3)) lineHeight = int(screen.height / max(wall_dist, 1e-3))
@ -99,10 +105,14 @@ def draw_game(
draw_end = lineHeight / 2 + screen.height / 2 draw_end = lineHeight / 2 + screen.height / 2
if draw_end >= screen.height: draw_end = screen.height - 1 if draw_end >= screen.height: draw_end = screen.height - 1
if side == 0: c = pygame.Vector3(255,255,255) / 256
else: c = pygame.Vector3(192,192,192) / 256
if fog: c *= max(min(1 - (wall_dist / (3 * max_dis / 4)), 1), 0)
color = pygame.Color.from_normalized(c) # type: ignore
pygame.draw.line( pygame.draw.line(
screen, screen,
pygame.Color(192,192,192) if side else color,
pygame.Color(255,255,255),
(x, draw_start), (x, draw_start),
(x, draw_end), (x, draw_end),
) )
@ -111,14 +121,19 @@ def ray(
ray_pos: pygame.Vector2, ray_pos: pygame.Vector2,
ray_dir: pygame.Vector2, ray_dir: pygame.Vector2,
world_map: maze.Maze, world_map: maze.Maze,
max_dis_squared: int = 10_000, max_dis_squared: float,
debug: bool = False debug: bool = False
) -> tuple[float, int | None]: ) -> tuple[float, int | None]:
delta = pygame.Vector2( delta = pygame.Vector2(
1/max(abs(ray_dir.x),1e-3),1/max(abs(ray_dir.y),1e-3)) 1/max(abs(ray_dir.x),1e-3),1/max(abs(ray_dir.y),1e-3))
# delta = pygame.Vector2(
# 1e-31 if ray_dir.x == 0 else 1/abs(ray_dir.x),
# 1e-31 if ray_dir.y == 0 else 1/abs(ray_dir.y)
# )
map_pos = pygame.Vector2(int(ray_pos.x),int(ray_pos.y)) map_pos = pygame.Vector2(int(ray_pos.x),int(ray_pos.y))
step = pygame.Vector2(0,0) step = pygame.Vector2(0,0)
side_dis = pygame.Vector2(0,0) side_dis = pygame.Vector2(0,0)
test_dist = pygame.Vector2(0,0)
# if debug: print(map_pos) # if debug: print(map_pos)
@ -155,17 +170,29 @@ def ray(
not world_map[int(map_pos.x),int(map_pos.y)] not world_map[int(map_pos.x),int(map_pos.y)]
): break ): break
# if ( test_dist.x = (side_dis.x - delta.x) if \
# map_pos.x < 0 or (side_dis.x - delta.x) > -1e-5 else min(side_dis.x, 15)
# map_pos.y < 0 or test_dist.y = (side_dis.y - delta.y) if \
# map_pos.x > world_map.width or (side_dis.y - delta.y) > -1e-5 else min(side_dis.y, 15)
# map_pos.y > world_map.height or
# side_dis.length_squared() > max_dis_squared
# ): return 0, None
# if debug: print(map_pos, side_dis) if (
map_pos.x < 0 or
map_pos.y < 0 or
map_pos.x > world_map.width or
map_pos.y > world_map.height or
# side_dis.length_squared() > max_dis_squared
# (side == 0 and side_dis.x > max_dis_squared) or
# (side == 1 and side_dis.y > max_dis_squared)
# (side_dis - delta).length_squared() > max_dis_squared
test_dist.length_squared() > max_dis_squared
):
side = None
break
if side == 0: perp_wall_dist = side_dis.x - delta.x if debug: print(ray_pos, map_pos, test_dist, side_dis, delta, side)
if side is None: perp_wall_dist = side_dis.length()
elif side == 0: perp_wall_dist = side_dis.x - delta.x
else: perp_wall_dist = side_dis.y - delta.y else: perp_wall_dist = side_dis.y - delta.y
return perp_wall_dist, side return perp_wall_dist, side
@ -176,7 +203,7 @@ def game_loop():
pygame.display.set_caption("Maze Raycaster") pygame.display.set_caption("Maze Raycaster")
screen = pygame.display.set_mode((1280, 720)) screen = pygame.display.set_mode((1280, 720))
show_top = False show_top = False# or True
if show_top: if show_top:
top_view = pygame.Surface( top_view = pygame.Surface(
@ -196,7 +223,8 @@ def game_loop():
# world_map = Maze(maze.RecursiveBacktracker(63), 4) # world_map = Maze(maze.RecursiveBacktracker(63), 4)
# world_map = Maze(maze.VectorWrapper(maze.BinaryTree(31)), 4) # world_map = Maze(maze.VectorWrapper(maze.BinaryTree(31)), 4)
# world_map = Maze(maze.Sidewinder(63, run_param=0.2), 4) # world_map = Maze(maze.Sidewinder(63), 4)
# world_map = Maze(maze.Sidewinder(63, run_param=0), 4)
# world_map = Maze(maze.RecursiveDivision(63), 4) # world_map = Maze(maze.RecursiveDivision(63), 4)
# world_map = Maze(maze.RecursiveDivision(63, binary=True), 4) # world_map = Maze(maze.RecursiveDivision(63, binary=True), 4)
# world_map = Maze(maze.VectorWrapper(maze.Prim(31)), 4) # world_map = Maze(maze.VectorWrapper(maze.Prim(31)), 4)
@ -209,6 +237,9 @@ def game_loop():
s = 0 s = 0
s_param = 0.35 s_param = 0.35
max_dis = 1000
fog = False
while running: while running:
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
@ -221,8 +252,9 @@ def game_loop():
world_map.step() world_map.step()
s -= s_param s -= s_param
if show_top: draw_map(top_view, player_pos, player_dir, world_map) if show_top:
draw_game(game_view, player_pos, player_dir, world_map) draw_map(top_view, player_pos, player_dir, world_map, max_dis)
draw_game(game_view, player_pos, player_dir, world_map, max_dis, fog)
keys = pygame.key.get_pressed() keys = pygame.key.get_pressed()
if keys[pygame.K_w]: if keys[pygame.K_w]:
@ -237,10 +269,18 @@ def game_loop():
player_dir.rotate_ip(-90 * dt) player_dir.rotate_ip(-90 * dt)
if keys[pygame.K_e]: if keys[pygame.K_e]:
player_dir.rotate_ip(90 * dt) player_dir.rotate_ip(90 * dt)
if keys[pygame.K_u]:
player_dir.rotate_ip(-1 * dt)
if keys[pygame.K_o]:
player_dir.rotate_ip(1 * dt)
if keys[pygame.K_n]: if keys[pygame.K_n]:
player_dir.scale_to_length(player_dir.length() / 1.01) player_dir.scale_to_length(player_dir.length() / 1.01)
if keys[pygame.K_m]: if keys[pygame.K_m]:
player_dir.scale_to_length(player_dir.length() * 1.01) player_dir.scale_to_length(player_dir.length() * 1.01)
if keys[pygame.K_COMMA]:
max_dis = max_dis / 1.01
if keys[pygame.K_PERIOD]:
max_dis = max_dis * 1.01
# if keys[pygame.K_t]: # if keys[pygame.K_t]:
# show_top = not show_top # show_top = not show_top
if keys[pygame.K_ESCAPE]: if keys[pygame.K_ESCAPE]:
@ -253,7 +293,8 @@ def game_loop():
label = myfont.render( label = myfont.render(
f"Player: {player_pos} {player_dir} {round(player_dir.length())}" f"Player: {player_pos} {player_dir} {round(player_dir.length())}"
f" | FPS: {int(clock.get_fps())} | Change: {round(s, 2)}", f" | FPS: {int(clock.get_fps())} | Change: {round(s, 2)}"
f" | View Distance: {round(max_dis,1)}",
True, (192,192,192) True, (192,192,192)
) )
screen.blit(label, (10, 10)) screen.blit(label, (10, 10))