我在pygame中创建了一个小程序,玩家控制在屏幕上移动的蓝色方块,但我想阻止玩家移动到屏幕边缘。这是我到目前为止的代码,我该怎么做?
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
done = False
x = 30
y = 30
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
is_blue = not is_blue
pressed = pygame.key.get_pressed()
if pressed[pygame.K_UP]: y -= 5
if pressed[pygame.K_DOWN]: y += 5
if pressed[pygame.K_LEFT]: x -= 5
if pressed[pygame.K_RIGHT]: x += 5
screen.fill((0, 0, 0))
color = (0, 128, 255)
pygame.draw.rect(screen, color, pygame.Rect(x, y, 60, 60))
pygame.display.flip()
clock.tick(60)
答案 0 :(得分:3)
pygame.Rect
有一个clamp
(和clamp_ip
)方法,可用于限制移动区域。因此,创建一个具有屏幕大小的矩形(此处称为screen_rect
)和播放器的矩形(player_rect
),并在每次移动后调用clamp_ip
方法将其保持在屏幕区域。
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
BG_COLOR = pg.Color(30, 30, 50)
def main():
clock = pg.time.Clock()
image = pg.Surface((50, 30))
image.fill(pg.Color('dodgerblue'))
pg.draw.rect(image, pg.Color(40, 220, 190), (0, 0, 49, 29), 2)
player_rect = image.get_rect(topleft=(200, 200))
# This pygame.Rect has the dimensions of the screen and
# is used to clamp the player_rect to this area.
screen_rect = screen.get_rect()
speed = 5
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
return
pressed = pg.key.get_pressed()
if pressed[pg.K_UP]:
player_rect.y -= speed
if pressed[pg.K_DOWN]:
player_rect.y += speed
if pressed[pg.K_LEFT]:
player_rect.x -= speed
if pressed[pg.K_RIGHT]:
player_rect.x += speed
# Clamp the rect to the dimensions of the screen_rect.
player_rect.clamp_ip(screen_rect)
screen.fill(BG_COLOR)
screen.blit(image, player_rect)
pg.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
pg.quit()
答案 1 :(得分:0)
这应该有效
if pressed[pygame.K_UP] and y > 0: y -= 5
if pressed[pygame.K_DOWN] and y < 600 - 60: y += 5
if pressed[pygame.K_LEFT] and x > 0: x -= 5
if pressed[pygame.K_RIGHT] and x < 800 - 60: x += 5
其中600和800是屏幕尺寸,60是矩形的大小
答案 2 :(得分:-1)
类似的东西:
if pressed[pygame.K_UP]:
if not (y > maxwidth or y < 0):
y += 5
等等。 maxwidth
在您的代码中看起来像600,但我将它放在代码的顶部,这样您就不必在不同的地方更改它。
答案 3 :(得分:-1)
您要做的事情称为边缘检测,如检测您是否处于边缘,在这种情况下,您希望边缘成为屏幕的边缘。您应该做什么,检查您的x
或y
是否处于优势地位,如果是,请不要再继续。
if pressed[pygame.K_UP]:
if 0 < y-5 < 600: #0 and 600 being the edges of your screen, you can use a variable to change it dynamically later one
y -= 5
请注意,这只会检测左上角的方格是否越界,因为x
和y
是矩形的顶部和左侧坐标,这意味着正方形的右下角将是能够继续走出界限,
如果您想查看整个广场,则需要在if
声明中进行调整计算,或将x
和y
作为中心的基础(您仍然可以必须将if语句修改为如下所示。(注意我正在根据您当前的x
和y
左上角的代码进行更改。
if pressed[pygame.K_UP]:
if (0 < y-5 < 600) or (0< y+60-5 <600) #0 and 600 being the edges of your screen, you can use a variable to change it dynamically later one
y -= 5
这会检查广场的另一边。请注意x
您将检查水平限制,在这种情况下为800
。此外,我们正在检查-5
,因为我们希望了解我们的目标,而不是我们所处的位置。