Нужна помощь в выполнении 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,

Другие вопросы по тегам