【问题标题】:How do I make the tile map scroll in pygame?如何在pygame中使瓦片地图滚动?
【发布时间】:2019-11-03 20:53:15
【问题描述】:

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

我尝试使用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()

【问题讨论】:

  • 你必须更具体。 “我尝试使用Screen.blit(Map,(MAP_X - 5, MAP_Y)) [...] 在 x 或 y 方向上渲染它超过 -5 或 +5,但它似乎没有工作。我也尝试过 pygame.scroll 但没有也不起作用。” - 什么不起作用?你是如何使用pygame.scroll的?
  • 我运行该代码时地图没有移动/滚动,pygame.scroll 函数也没有。我什至尝试过使用 Pyscroll,但由于文档很少,而且存在哪些文档,我有点困惑。
  • 您对Screen.blit(Map,(MAP_X - 5, MAP_Y)) 有何期待?瓷砖放置在左侧 5 个像素处。如果你想滚动,那么你必须到Screen.blit(Map,(MAP_X - shift, MAP_Y)) 并不断增加shiftpygame.scroll 也是如此。
  • @Rabbid76 所以我添加了这段代码来使 MAP_X 变量在按下 K_a 键时增加。但是地图没有变化。 if Keys[pygame.K_a]: MAP_X = MAP_X - 5 Screen.blit(Map, (MAP_X, MAP_Y)) pygame.display.update()

标签: python pygame 2d-games pytmx


【解决方案1】:

地图的所有图块在Render_Map函数中分别在屏幕上显示.blit。计算每个图块的位置。
如果要滚动地图,则必须将图块移动一个动态偏移量:

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))

按下键时更改图块的原点。例如:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多