[Python] How can I create a 2-d scrolling tiled map in pygame?

Discussão em 'Python' iniciado por Stack, Junho 25, 2025.

  1. Stack

    Stack Membro Participativo

    I am creating an RPG like game, however, I have absolutely no idea how to scroll through the map so the player is in the centre. Any other suggestions you may have would be greatly appreciated too! Thanks for all your help! Here's my code:

    import pygame
    from pytmx import load_pygame

    pygame.init()

    transparent = (0,0,0,0)
    black = (0,0,0)
    white = (255,255,255)
    x,y = 0,0

    moveSpeed = 5

    #create window
    screenSize = (800,600)
    screen = pygame.display.set_mode(screenSize)
    pygame.display.set_caption("Frozen")

    gameMap = load_pygame("Frozen.tmx")

    def getMap(layer):
    #creates list of single tiles
    images = []
    for y in range(50):
    for x in range(50):
    image = gameMap.get_tile_image(x,y,layer)
    images.append(image)

    #displays tiles in locations
    i = 0
    for y in range(50):
    for x in range(50):
    screen.blit(images,(x*32,y*32))
    i += 1

    def getProperties():
    #gets properties of tiles in map
    properties = []
    for y in range(50):
    for x in range(50):
    tileProperties = gameMap.get_tile_properties(x,y,3)
    properties.append(tileProperties)
    return properties

    def createBoxes():
    #creates collision rectangles for unpassable tiles
    noWalkLocs = []
    rects = []
    i = 0
    testSurf = pygame.Surface(screenSize).convert_alpha()
    testSurf.fill(transparent)
    for y in range(50):
    for x in range(50):
    tileProperties = properties
    walkable = tileProperties.get("walkable")
    if walkable == "False":
    rect = pygame.draw.rect(testSurf,(0,0,0, 0),(x*32,y*32,32,32))
    rects.append(rect)
    i += 1
    return rects



    def getCollisions():
    global x
    global y
    collisionLoc = player.rect.collidelist(rects)
    collision = rects[collisionLoc]
    if player.rect.collidepoint(collision.bottomleft):
    if x > 0 and y < 0:
    player.rect.topright = collision.bottomleft
    x,y = 0, 0
    elif x > 0:
    player.rect.right = collision.left
    x =0
    elif y < 0:
    player.rect.top = collision.bottom
    y = 0
    elif player.rect.collidepoint(collision.topleft):
    if x > 0 and y > 0:
    player.rect.bottomright = collision.topleft
    x,y = 0, 0
    elif x > 0:
    player.rect.right = collision.left
    x =0
    elif y > 0:
    player.rect.bottom = collision.top
    y = 0
    elif player.rect.collidepoint(collision.bottomright):
    if x < 0 and y <0:
    player.rect.topleft = collision.bottomright
    x,y = 0, 0
    elif x < 0:
    player.rect.left = collision.right
    x =0
    elif y < 0:
    player.rect.top = collision.bottom
    y = 0
    elif player.rect.collidepoint(collision.topright):
    if x < 0 and y > 0:
    player.rect.bottomleft = collision.topright
    x,y = 0, 0
    elif x < 0:
    player.rect.left = collision.right
    x =0
    elif y > 0:
    player.rect.bottom = collision.top
    y = 0
    elif player.rect.collidepoint(collision.midbottom):
    player.rect.top = collision.bottom
    y = 0
    elif player.rect.collidepoint(collision.midtop):
    player.rect.bottom = collision.top
    y = 0
    elif player.rect.collidepoint(collision.midright):
    player.rect.left = collision.right
    x = 0
    elif player.rect.collidepoint(collision.midleft):
    player.rect.right = collision.left
    x = 0
    return player.rect.x, player.rect.y, x, y

    class sprite(pygame.sprite.Sprite):
    def __init__(self,x,y):
    pygame.sprite.Sprite.__init__(self)

    self.x,self.y = x,y

    self.image = standFront

    self.rect = self.image.get_rect()

    self.frontImages = [standFront,walkFront1,walkFront2,walkFront3]

    self.backImages = [standBack,walkBack1,walkBack2,walkBack3]

    self.leftImages = [standLeft,walkLeft1,walkLeft2,walkLeft3]

    self.rightImages = [standRight,walkRight1,walkRight2,walkRight3]

    self.index = 0

    def walkFront(self):
    self.index += 1
    if self.index >= len(self.frontImages):
    self.index=0
    self.image = self.frontImages[self.index]

    def walkBack(self):
    self.index += 1
    if self.index >= len(self.backImages):
    self.index=0
    self.image = self.backImages[self.index]

    def walkLeft(self):
    self.index += 1
    if self.index >= len(self.leftImages):
    self.index=0
    self.image = self.leftImages[self.index]

    def walkRight(self):
    self.index += 1
    if self.index >= len(self.rightImages):
    self.index=0
    self.image = self.rightImages[self.index]

    def render(self):
    screen.blit(self.image,(self.x,self.y))
    self.rect.x, self.rect.y = self.x, self.y

    #loads images
    standFront = pygame.image.load("Images/Elsa Sprite/WalkFront/StandFront.png").convert_alpha()
    walkFront1 = pygame.image.load("Images/Elsa Sprite/WalkFront/WalkFront1.png").convert_alpha()
    walkFront2 = pygame.image.load("Images/Elsa Sprite/WalkFront/WalkFront2.png").convert_alpha()
    walkFront3 = pygame.image.load("Images/Elsa Sprite/WalkFront/WalkFront3.png").convert_alpha()

    standBack = pygame.image.load("Images/Elsa Sprite/WalkBack/StandBack.png").convert_alpha()
    walkBack1 = pygame.image.load("Images/Elsa Sprite/WalkBack/WalkBack1.png").convert_alpha()
    walkBack2 = pygame.image.load("Images/Elsa Sprite/WalkBack/WalkBack2.png").convert_alpha()
    walkBack3 = pygame.image.load("Images/Elsa Sprite/WalkBack/WalkBack3.png").convert_alpha()

    standLeft = pygame.image.load("Images/Elsa Sprite/WalkLeft/StandLeft.png").convert_alpha()
    walkLeft1 = pygame.image.load("Images/Elsa Sprite/WalkLeft/WalkLeft1.png").convert_alpha()
    walkLeft2 = pygame.image.load("Images/Elsa Sprite/WalkLeft/WalkLeft2.png").convert_alpha()
    walkLeft3 = pygame.image.load("Images/Elsa Sprite/WalkLeft/WalkLeft3.png").convert_alpha()

    standRight = pygame.image.load("Images/Elsa Sprite/WalkRight/StandRight.png").convert_alpha()
    walkRight1 = pygame.image.load("Images/Elsa Sprite/WalkRight/WalkRight1.png").convert_alpha()
    walkRight2 = pygame.image.load("Images/Elsa Sprite/WalkRight/WalkRight2.png").convert_alpha()
    walkRight3 = pygame.image.load("Images/Elsa Sprite/WalkRight/WalkRight3.png").convert_alpha()


    #creates tick
    clock = pygame.time.Clock()

    #creates player
    player = sprite(250, 300)

    properties = getProperties()
    rects = createBoxes()

    #main loop
    running = True
    while running:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    running = False

    #gets keypresses
    if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    x, y = 0, 0
    x -= moveSpeed
    elif event.key == pygame.K_RIGHT:
    x, y = 0, 0
    x += moveSpeed
    elif event.key == pygame.K_UP:
    x, y = 0, 0
    y -= moveSpeed
    elif event.key == pygame.K_DOWN:
    x, y = 0, 0
    y += moveSpeed


    if event.type == pygame.KEYUP:
    if event.key == pygame.K_LEFT:
    x = 0
    player.image = player.leftImages[0]
    elif event.key == pygame.K_RIGHT:
    x = 0
    player.image = player.rightImages[0]
    elif event.key == pygame.K_UP:
    y = 0
    player.image = player.backImages[0]
    elif event.key == pygame.K_DOWN:
    y = 0
    player.image = player.frontImages[0]

    player.x += x
    player.y += y

    if y > 0:
    player.walkFront()
    if y < 0:
    player.walkBack()
    if x > 0:
    player.walkRight()
    if x < 0:
    player.walkLeft()

    getMap(0)
    getMap(1)
    getMap(2)
    player.render()
    pygame.display.flip()

    player.rect.x, player.rect.y, x, y = getCollisions()
    player.x, player.y = player.rect.x, player.rect.y

    clock.tick(10)
    pygame.quit()

    Continue reading...

Compartilhe esta Página