Skip to main content
 首页 » 编程设计

python之如何在 pygame 中使瓦片 map 滚动

2024年11月24日27birdshome

我使用 pytmx 实现了一个瓦片 map ,我试图弄清楚如何使用 if Keys[pygame.K_somekey]: 让它滚动(整个 map )。我渲染了一些按钮,这样当你按下播放按钮时,它就会开始渲染要显示的 map 。从那里,我需要实现 map 的滚动或移动。

我尝试使用 Screen.blit(Map,(MAP_X - 5, MAP_Y)) 在 x 或 y 方向上渲染它超过 -5 或 +5 以及其他方向的其他操作但它似乎没有用。我也试过 pygame.scroll 但也没有用。

#======= 
# Imports  
#======= 
 
import pygame ,sys , pytmx , time 
 
#======= 
# Start Pygame 
#======= 
 
pygame.init() 
 
#======= 
# Variables  
#======= 
 
#NUMBER VARIABLES 
DISPLAY_WIDTH = 1920 
DISPLAY_HEIGHT = 1080 
WHITE = (255,255,255) 
FPS = 120 
BUTTON_X = DISPLAY_WIDTH/2 - 64 
PB_Y = 400 
CB_Y  = 450 
EB_Y  = 500 
MOUSE_X = 0 
MOUSE_Y = 1 
OVER = 1 
NOT_OVER = 0 
 
#FUNCTION VARIABLES 
Screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT),pygame.FULLSCREEN) 
Keys = pygame.key.get_pressed() 
MOUSE = pygame.mouse.get_pos() 
 
#TRUE/FALSE 
Game_Over = False 
Pressed = False 
 
#======= 
# Pre-Loads  
#======= 
 
#BUTTONS 
Config_Button = [pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Config.png"), 
                    pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Config_Over.png")] 
Play_Button = [pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Play.png"), 
                pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Play_Over.png")] 
Exit_Button = [pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Exit.png"), 
                pygame.image.load(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Menu Buttons\Exit_Over.png")] 
 
#MAP ( TMX ) 
Map = pytmx.load_pygame(r"C:\Users\Damien Santiago\Desktop\Test\@Resources\Maps\Map.tmx") 
 
#====== 
# Defined Functions 
#====== 
def Render_Map(): 
    for layer in Map.visible_layers: 
        for x, y, gid, in layer: 
            MAP_X = x * Map.tilewidth 
            MAP_Y = y * Map.tileheight 
            tile = Map.get_tile_image_by_gid(gid) 
            Screen.blit(tile, (MAP_X,MAP_Y)) 
 
#======= 
# Code 
#======= 
 
 
while not Game_Over: 
 
    MOUSE = pygame.mouse.get_pos() 
 
    for event in pygame.event.get(): 
 
        if event.type == pygame.QUIT: 
            sys.exit() 
            break  
 
        if event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_ESCAPE: 
                sys.exit() 
                break 
            break 
 
        if event.type == pygame.MOUSEBUTTONDOWN: 
            #PLAY BUTTON 
            if  892 < MOUSE[MOUSE_X] < 1020 and 480 > MOUSE[MOUSE_Y] > 440: 
                Pressed = True 
                Render_Map() 
                pygame.display.update() 
 
            #SETTINGS/CONFIG BUTTON 
            if  892 < MOUSE[0] < 1020 and 530 > MOUSE[1] >500: 
                Pressed = True 
 
            #EXIT BUTTON 
            if  892 < MOUSE[MOUSE_X] < 1020 and 580 > MOUSE[MOUSE_Y] >550: 
                sys.exit() 
 
            break 
 
        if Pressed == False: 
 
            #PLAY BUTTON 
            if  892 < MOUSE[MOUSE_X] < 1020 and 480 > MOUSE[MOUSE_Y] > 440: 
                Screen.blit(Play_Button[OVER],(BUTTON_X, PB_Y)) 
                pygame.display.update() 
 
            else: 
                Screen.blit(Play_Button[NOT_OVER],(BUTTON_X, PB_Y)) 
                pygame.display.update() 
 
            #SETTINGS/CONFIG BUTTON 
            if  892 < MOUSE[MOUSE_X] < 1020 and 530 > MOUSE[MOUSE_Y] >500: 
                Screen.blit(Config_Button[OVER],(BUTTON_X, CB_Y)) 
                pygame.display.update() 
 
            else: 
                Screen.blit(Config_Button[NOT_OVER],(BUTTON_X, CB_Y)) 
                pygame.display.update() 
 
            #EXIT BUTTON 
            if  892 < MOUSE[MOUSE_X] < 1020 and 580 > MOUSE[MOUSE_Y] >550: 
                Screen.blit(Exit_Button[OVER],(BUTTON_X, EB_Y)) 
                pygame.display.update() 
 
            else: 
                Screen.blit(Exit_Button[NOT_OVER],(BUTTON_X, EB_Y)) 
                pygame.display.update() 

请您参考如下方法:

map 的所有瓦片在函数Render_Map中分别.blit到屏幕。计算每个瓦片的位置。
如果你想滚动 map ,那么你必须通过动态偏移来移动图 block :

def Render_Map(offset_x, offset_y): 
    for layer in Map.visible_layers: 
        for x, y, gid, in layer: 
            MAP_X = x * Map.tilewidth  + offset_x 
            MAP_Y = y * Map.tileheight + offset_y 
            tile = Map.get_tile_image_by_gid(gid) 
            Screen.blit(tile, (MAP_X, MAP_Y)) 

按下键时改变方 block 的原点。例如:

pos_x = 0 
 
while not Game_Over: 
 
    for event in pygame.event.get(): 
 
        if event.type == pygame.QUIT: 
            sys.exit() 
            break  
 
    # [...] 
 
    Keys = pygame.key.get_pressed() 
 
    if Keys[pygame.K_a]: 
        pos_x += 5 
 
    Render_Map(pos_x, 0) 
    pygame.display.update()