Уменьшите крошечный TileMap до большего размера в PyTMX и PyGame - PullRequest
0 голосов
/ 07 февраля 2020

Итак, мне удалось создать, импортировать и отобразить TileMap 16x16 в моем проекте PyGame. У меня есть слой активов под названием ground и слой Objects, первоначально названный objects .

Скриншот программного обеспечения для плитки с моими слоями

Тогда у меня есть этот простой код для создания моей TileMap:

class TiledMap:
def __init__(self, filename):
    tm = pytmx.load_pygame(filename, pixelalpha=True)
    self.width = tm.width * TILE_SIZE
    self.height = tm.height * TILE_SIZE
    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:
                    tile = pg.transform.scale(tile,(TILE_SIZE,TILE_SIZE))
                    surface.blit(tile, (x * TILE_SIZE,
                                        y * TILE_SIZE))

def make_map(self):
    temp_surface = pg.Surface((self.width, self.height), pg.SRCALPHA).convert_alpha()
    self.render(temp_surface)
    return temp_surface

РЕДАКТИРОВАТЬ: я забыл сказать, что моя карта 16x16 на самом деле масштабируется до изображения 64x64 (TILE_SIZE), но только для видимый слой земля , я хочу сделать это со слоем объекты .

Это прекрасно работает для масштабирования моего "видимого слоя", который земля . Но когда я рисую коллизии, вы видите, что объекты все еще очень малы и не соответствуют моему новому разрешению карты:

Снимок экрана игры с синим: поле игрока и в желтом: коллайдеры

Как вы можете видеть, хитбоксы стен , которые я установил в моей TileMap, неправильно масштабируются.

Итак, вопрос в том, как масштабировать слой объектов в TileMap с помощью pyTMX?

Спасибо всем.

1 Ответ

0 голосов
/ 07 февраля 2020

Так что я нашел способ исправить это, я не знаю, является ли это самым чистым способом сделать это, но вот код решения:

def new(self):
    # Initialization and setup for a new game
    self.all_sprites = pg.sprite.LayeredUpdates()
    self.walls = pg.sprite.Group()
    self.items = pg.sprite.Group()

    for tile_object in self.map.tmxdata.objects:

        tile_object.x *= int(TILE_SIZE / self.map.tilesize)
        tile_object.y *= int(TILE_SIZE / self.map.tilesize)

        obj_center = vec(tile_object.x + tile_object.width / 2,
                         tile_object.y + tile_object.height / 2)

        if tile_object.name == 'player':
            self.player = Player(self, obj_center.x, obj_center.y)

        elif tile_object.name in ['pickaxe']:
            Item(self, obj_center, tile_object.name)

        else:
            tile_object.width *= int(TILE_SIZE / self.map.tilesize)
            tile_object.height *= int(TILE_SIZE / self.map.tilesize)

        # if tile_object.name == 'zombie':
        #     Mob(self, tile_object.x, tile_object.y)

        if tile_object.name == 'wall':
            Obstacle(self, tile_object.x, tile_object.y, tile_object.width, tile_object.height)


    self.camera = Camera(self.map.width, self.map.height)
    self.paused = False
    self.draw_debug = False

Так что в моей game.new () функция Я извлекаю спрайты игрока и объекты путем анализа таблицы спрайтов и уже масштабирую их до нужного размера. Но для размера других объектов и для позиции исправление состоит в том, чтобы просто умножить значения на правильное число. Число, которое является масштабным коэффициентом : 16x16 для наборов плиток 64x64, дает 64/16, что равно 4.

Так что мне просто нужно было умножить объекты x, y, width и height на 4.

Надеюсь, это все равно кому-нибудь поможет.

...