【问题标题】:Avoid having my character fall off the screen in pygame避免让我的角色在 pygame 中从屏幕上掉下来
【发布时间】:2021-03-25 11:00:19
【问题描述】:

我正处于使用 pygame 制作 Jetpack Joyride 风格游戏的早期阶段。 我目前有当你按下空格时,它会向上移动角色,当你不按住空格时,角色会掉到地上,但问题是它没有地面,我的屏幕周围没有边框,所以角色可能会消失. 到目前为止,我为游戏编写的代码如下,我试图添加那些边框/块,无论它叫什么,但我就是找不到可行的方法。如果有人可以提供帮助,将非常感谢

import pygame
pygame.init()

width=800
height=800
x=(width*0.45)
y=(height*0.6)
bgspeed=30
x_change=0
y_change=0
speed=2.5

mainDisplay=pygame.display.set_mode((width,height))
pygame.display.set_caption("jetpack")

bg=pygame.image.load("bg.png")
bg=pygame.transform.scale(bg,(width,height))
bgX=0
bgX2=bg.get_width()

dababy_jetpack=pygame.image.load("dababy.png")
dababy_jetpack.convert()
rect=dababy_jetpack.get_rect()
rect.center=0,0
player_rect=dababy_jetpack.get_rect(topleft=(200,200))
mainDisplay_rect=mainDisplay.get_rect()

jetpacker=pygame.image.load("dababy.png")
jetpacker=pygame.transform.scale(jetpacker,(100,200))

mainDisplay_rect=mainDisplay.get_rect()
player_rect=jetpacker.get_rect()



def redrawWindow():
    mainDisplay.blit(bg,(bgX,0))
    mainDisplay.blit(bg,(bgX2,0))
    pygame.display.update()

clock=pygame.time.Clock()

def test(x,y):
    mainDisplay.blit(jetpacker,(x,y))

crashed=False
while not crashed:
    redrawWindow()
    bgX-=1.4
    bgX2-=1.4
    if bgX<bg.get_width()*-1:
        bgX=bg.get_width()
    elif bgX2<bg.get_width()*-1:
        bgX2=bg.get_width()

    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            crashed=True

        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_SPACE:
                y_change=-1*speed
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_SPACE:
                y_change=0.7*speed
    y+=y_change
    test(x,y)
    player_rect.clamp_ip(mainDisplay_rect)
    
    pygame.display.update()
    clock.tick(60)
pygame.quit()
quit()

【问题讨论】:

    标签: python python-3.x pygame border helper


    【解决方案1】:

    您需要检查您的y 值是否在正确的范围内。 由于在 pygame 中,左上角是 (0,0),因此您希望获得正值(因此它不会超过顶部),并且您希望他的最低点小于您定义的 height 值。通常一个字符的位置是从它的左上角定义的,所以你检查y&gt;0y&lt;height-height_character

    在您的示例中,可以在 y 更新后添加检查 (y+=y_change)。有几种方法可以做到这一点,但一种简单易懂的方法可能是:

    import pygame
    pygame.init()
    
    width=800
    height=800
    x=(width*0.45)
    y=(height*0.6)
    bgspeed=30
    x_change=0
    y_change=0
    speed=2.5
    
    mainDisplay=pygame.display.set_mode((width,height))
    pygame.display.set_caption("jetpack")
    
    bg=pygame.image.load("bg.jpg")
    bg=pygame.transform.scale(bg,(width,height))
    bgX=0
    bgX2=bg.get_width()
    
    dababy_jetpack=pygame.image.load("dababy.png")
    dababy_jetpack.convert()
    rect=dababy_jetpack.get_rect()
    rect.center=0,0
    player_rect=dababy_jetpack.get_rect(topleft=(200,200))
    mainDisplay_rect=mainDisplay.get_rect()
    
    jetpacker=pygame.image.load("dababy.png")
    jetpacker=pygame.transform.scale(jetpacker,(100,200))
    
    mainDisplay_rect=mainDisplay.get_rect()
    player_rect=jetpacker.get_rect()
    
    
    
    def redrawWindow():
        mainDisplay.blit(bg,(bgX,0))
        mainDisplay.blit(bg,(bgX2,0))
        pygame.display.update()
    
    clock=pygame.time.Clock()
    
    def test(x,y):
        mainDisplay.blit(jetpacker,(x,y))
    
    crashed=False
    while not crashed:
        redrawWindow()
        bgX-=1.4
        bgX2-=1.4
        if bgX<bg.get_width()*-1:
            bgX=bg.get_width()
        elif bgX2<bg.get_width()*-1:
            bgX2=bg.get_width()
    
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                crashed=True
    
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_SPACE:
                    y_change=-1*speed
            elif event.type==pygame.KEYUP:
                if event.key==pygame.K_SPACE:
                    y_change=0.7*speed
        y+=y_change
        # check border
        # at the bottom, you want your top left point of the character to stop
        # at height_screen-height_character (since 0,0 is the top left)
        if y>height-200:  # this 200 is the height of your character
            y=height-200
        # at the top, just avoid negative values
        elif y<0:
            y=0
        test(x,y)
        player_rect.clamp_ip(mainDisplay_rect)
    
        pygame.display.update()
        clock.tick(60)
    pygame.quit()
    quit()
    

    对我来说效果很好。有帮助吗?

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多