pygame代码和错误如下所述:

问题描述

这是我的 space-arcade pygame 的源代码。这是一个非常简单的操作,不会发射子弹。只有这样我们才能在障碍物也移动的情况下移动玩家。但是,已将飞船(玩家)在屏幕上移动的限制从x = 0设置为x = 765,从y = 200设置为y =480。但是,飞船以某种方式越过了y轴的限制也就是说,它可以移动到y = 0和y = 600之外,但只能在特定的x轴上移动,例如x分别为10和590时如何在以下python代码解决这一差距

import random

pygame.init()

screen = pygame.display.set_mode((800,600))  

pygame.display.set_caption("Space Invader")    
icon = pygame.image.load("space-invaders.png")  
pygame.display.set_icon(icon)  

background = pygame.image.load("background.png") 

player_image = pygame.image.load("space-invaders.png")    
playerX = 370  
playerY = 480  
playerX_change = 0
playerY_change = 0

def player(x,y):
    screen.blit(player_image,(x,y))  

obs_image = pygame.image.load("cave-painting (1).png")    
obsX = random.randint(0,800)       
obsY = random.randint(0,100)        
obsX_change = 2      
obsY_change = 0.3      

def obstacle(x,y):
    screen.blit(obs_image,y))  

running = True
while running:
    screen.fill( (0,0) )  
    screen.blit(background,(0,0))  

    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  
        
        if event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_LEFT:  
                playerX_change = -4  
            if event.key == pygame.K_RIGHT:  
                playerX_change = 4 
            if event.key == pygame.K_UP:  
                playerY_change = -4
            if event.key == pygame.K_DOWN:  
                playerY_change = 4

        if event.type == pygame.KEYUP:  
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0  
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                playerY_change = 0

    playerX += playerX_change  
    playerY += playerY_change 

    # Stopping our player beyond screen:
    if playerX <= 0:
        playerX = 0
    elif playerX >= 765:  
        playerX = 765
    elif playerY <= 200:
        playerY = 200
    elif playerY >= 480:
        playerY = 480

    obsX += obsX_change
    obsY += obsY_change

    # Movement mechanics for obstacles:
    if obsX <= 0:
        obsX_change = 3
        obsY += obsY_change
    elif obsX >= 736:
        obsX_change = -3
        obsY += obsY_change
  
    player(playerX,playerY)  
    obstacle(obsX,obsY)  

    pygame.display.update()```

Here are the source pictures used in the aforementioned code:

[background][1]
[cave-painting (1)][2]
[space-invaders][3]

  [1]: https://i.stack.imgur.com/EZFLs.png

  [2]: https://i.stack.imgur.com/CxNs4.png

  [3]: https://i.stack.imgur.com/Z97n7.png  

解决方法

请勿使用elif。您的代码说(伪代码):

If x is beyond or equal to 0 then go back to zero
If x is not beyond or equal to 0 but x is beyond or equal to 765 then go back to 765
If none of the above are true but y is beyond or equal to 200 then go back to 200

您看到问题了吗?如果x等于0,则永不进行y检查。将第三个elif更改为if可以解决此问题。这是固定代码:

if playerX <= 0:
    playerX = 0

elif playerX >= 765:  
    playerX = 765

if playerY <= 200:
    playerY = 200

elif playerY >= 480:
    playerY = 480
,

这些比较应该彼此独立。 通过链接然后在单个int deposit(int &total) { ...your code... } 块中,检查 仅在第一次检查失败后才进行,等等。

鉴于您的问题的性质,这可能是原因。 只需将if/elif/elif/...语句替换为普通的elif:每次检查都会 独立运行并修复应保护的限制:

if
,

您可以简化代码。使用pygame.key.get_pressed()可以平稳地移动播放器,而不要使用键盘事件KEYDOWNKEYDUPpygame.key.get_pressed()返回带有每个键状态的列表。如果按住某个键,则该键的状态为True,否则为False

keys = pygame.key.get_pressed()
playerX += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 4
playerY += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * 4

分别使用pygame.Rect对象和pygame.Rect.clamp() pygame.Rect.clamp_ip()将播放器的位置限制为矩形区域。

border_rect = pygame.Rect(0,200,800,312)
player_rect = player_image.get_rect(topleft = (playerX,playerY))
player_rect.clamp_ip(border_rect)
playerX,playerY = player_rect.topleft

或更短:

keys = pygame.key.get_pressed()
playerX,playerY = player_image.get_rect(topleft = (playerX,playerY)) \
    .move((keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 4,\
          (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * 4) \
    .clamp((0,312)).topleft

示例代码:

running = True
while running:
    screen.blit(background,(0,0))  
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  

    keys = pygame.key.get_pressed()
    playerX += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 4
    playerY += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * 4

    border_rect = pygame.Rect(0,312)
    player_rect = player_image.get_rect(topleft = (playerX,playerY))
    player_rect.clamp_ip(border_rect)
    playerX,playerY = player_rect.topleft

    obsX += obsX_change
    obsY += obsY_change

    # Movement mechanics for obstacles:
    if obsX <= 0:
        obsX_change = 3
        obsY += obsY_change

    elif obsX >= 736:
        obsX_change = -3
        obsY += obsY_change
  
    player(playerX,playerY)  
    obstacle(obsX,obsY)  
    pygame.display.update()