Загрузка данных


import pygame as pg
import pytmx

pg.init()

SCREEN_WIDTH = 900
SCREEN_HEIGHT = 600
TILE_SCALE = 2
FPS = 80

class Platform(pg.sprite.Sprite):
    def __init__(self, image, x, y, width, height):
        super(Platform, self).__init__()
        self.image = pg.transform.scale(image, (width * TILE_SCALE, height* TILE_SCALE))
        self.rect = self.image.get_rect()
        self.rect.x = x * TILE_SCALE
        self.rect.y = y * TILE_SCALE
class Player(pg.sprite.Sprite):
    def __init__(self, map_width, map_height):
        super(Player, self).__init__()

        self.image = pg.Surface((50,50))
        self.image.fill("red")

        self.rect = self.image.get_rect()
        self.rect.center = (200, 100)  # Начальное положение персонажа

        # Начальная скорость и гравитация
        self.velocity_x = 0
        self.velocity_y = 0
        self.gravity = -2
        self.is_moving_left = True
        self.is_moving_right = True
        self.is_jumping = False
        self.is_grounded = False
        self.map_width = map_width * TILE_SCALE
        self.map_height = map_height * TILE_SCALE

    def update(self, platforms, keys):
        # is_running1 = True
        # is_running2 = True
        # for platform in platforms:
        #     if self.rect.right >= platform.rect.left:
        #         self.is_moving_right = False
        #         is_running1 = False
        #     elif self.rect.right <= platform.rect.right and is_running1:
        #         self.is_moving_right = True
        #     if self.rect.left <= platform.rect.right:
        #         self.is_moving_left = False
        #         is_running2 = False
        #     elif self.rect.left >= platform.rect.right and is_running2:
        #         self.is_moving_left = True
        # for platform in platforms:
        #     if self.rect.colliderect(platform.rect):
        #         if self.rect.left <= platform.rect.right:
        #             self.is_moving_left = False
        #         else:
        #             self.is_moving_left = True
        #         if self.rect.right >= platform.rect.left:
        #             self.is_moving_right = False
        #         else:
        #             self.is_moving_right = True
        for platform in platforms:
            # print(platform.rect.center, self.rect.center)

            if platform.rect.collidepoint(self.rect.midbottom):
              self.is_grounded = True
            else:
                self.is_grounded = False

            if self.rect.collidepoint(platform.rect.left, platform.rect.centery):
                self.is_moving_left = False
            else:
                self.is_moving_left = True
            if self.rect.collidepoint(platform.rect.right, platform.rect.centery):
                self.is_moving_right = False
            else:
                self.is_moving_right = True
        self.velocity_x = 0
        if keys[pg.K_a]:
            self.velocity_x = -3

        elif keys[pg.K_d]:
            self.velocity_x = 3

        else:
            self.velocity_x = 0
        if keys[pg.K_w] and not self.is_jumping:
            self.velocity_y = -10
        else:
            self.velocity_y = 0
        self.rect.y += self.velocity_y
        self.rect.y -= self.gravity
        self.rect.x += self.velocity_x






class Game:
    def __init__(self):
        self.screen = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pg.display.set_caption("Платформер")
        self.clock = pg.time.Clock()
        self.tmx_map = pytmx.load_pygame("maps/tileset/безымянный.tmx")
        self.is_running = False
        self.player = Player(self.tmx_map.width, self.tmx_map.height)
        self.background = pg.transform.scale(pg.image.load('maps/tileset/tilesetOpenGameBackground.png'), (SCREEN_WIDTH, SCREEN_HEIGHT))
        self.platforms = pg.sprite.Group()
        self.all_sprites = pg.sprite.Group()
        self.all_sprites.add(self.player)
        self.camera_y = 0
        self.camera_x = 0
        self.camera_speed = 3
        for layer in self.tmx_map:
            for x, y, gid in layer:
                tile = self.tmx_map.get_tile_image_by_gid(gid)
                if tile:
                    platform = Platform(tile, x * self.tmx_map.tilewidth, y * self.tmx_map.tileheight,
                             self.tmx_map.tilewidth,
                             self.tmx_map.tileheight)
                    self.platforms.add(platform)
                    self.all_sprites.add(platform)

        self.run()
    def run(self):
        self.is_running = True
        while self.is_running:
            self.event()
            self.update()
            self.draw()
            self.clock.tick(FPS)
        pg.quit()
        quit()

    def event(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.is_running = False
        if pg.key.get_pressed()[pg.K_a] or pg.key.get_pressed()[pg.K_d]:
            self.camera_x += self.player.velocity_x
        if not self.player.is_grounded:
          self.camera_y -= self.player.gravity
        self.camera_y += self.player.velocity_y


    def update(self):

        self.player.update(self.platforms, pg.key.get_pressed())

    def draw(self):
        self.screen.blit(self.background, (0, 0))
        for sprites in self.all_sprites:
          if sprites != self.player:
            self.screen.blit(sprites.image, sprites.rect.move(-self.camera_x, -self.camera_y))
          else:
              self.screen.blit(sprites.image, (200,100))
        pg.display.flip()


if __name__ == "__main__":
    game = Game()