Нужна помощь в выполнении Frustum Culling на моей платформе
То, что я пытаюсь сделать, чтобы реализовать алгоритм Frustum Culling, - это запустить вложенный цикл for в функции render() из позиции, которая будет зависеть от позиции игрока x и y, так что код будет проходить только через цикл небольшая часть файла.tmx, часть, которая должна отображаться. Теперь вопрос в том, как мне начать цикл с позиции, которая будет зависеть от координат моего игрока? Заранее спасибо за помощь.
import pygame
import pytmx
pygame.init()
class Map():
def __init__(self,filename):
tm=pytmx.load_pygame(filename,pixelalpha=True)
self.width=tm.width * tm.tilewidth
self.height=tm.height*tm.tileheight
self.tmxdata=tm
def render(self,surface):
ti=self.tmxdata.get_tile_image_by_gid
for layer in self.tmxdata.visible_layers:
if isinstance(layer,pytmx.TiledTileLayer):
for x,y,gid in layer:
tile = ti(gid)
if tile
surface.blit(tile,(x*self.tmxdata.tilewidth,y*self.tmxdata.tileheight))
def make_map(self):
temp_surface=pygame.Surface((self.width,self.height))
self.render(temp_surface)
return temp_surface
1 ответ
Вы можете вычислить текущую координату карты тайла в точке мира, если размеры карты тайла постоянны (то есть каждая плитка имеет одинаковую ширину и высоту).
Скажем, у нас есть плитки шириной 20 и высотой 20 пикселей, и ваш игрок находится на позиции (432, 36). Затем мы можем определить, на какой плитке он / она находится, выполняя целочисленное деление (делить и усекать /"удалять десятичные дроби").
tile_x = player_x // tile_width
tile_y = player_y // tile_height
В нашем случае игрок будет стоять на плитке 21
по оси х (432 // 20 = 21
) и плитка 1 на оси у (36 // 20 = 1
).
Оттуда вы можете определить, насколько большой области вокруг игрока вы хотите быть видимым. Если вы хотите рендерить по 1 плитке в каждом направлении (включая тот, на котором стоит игрок), вам придется выполнить итерацию x = 20 to 22
а также y = 0 to 2
,