问题描述
这是我的 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()
可以平稳地移动播放器,而不要使用键盘事件KEYDOWN
和KEYDUP
。 pygame.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()