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, (x, y))  
running = True
while running:
screen.fill( (0, 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

这些比较应该相互独立。通过在单个if/elif/elif/...块中进行链接只有在第一次检查失败时才会发生超出第一次的情况,依此类推

考虑到问题的性质,这很可能是原因。只需将elif语句替换为普通的if语句:每次检查都将独立运行并修复它应该保护的限制:

# 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

您可以简化代码。使用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, 200, 800, 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, 200, 800, 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()

最新更新