Python PyGame角色离开屏幕

Python PyGame角色离开屏幕,python,pygame,Python,Pygame,我试图用pygame制作一个游戏,但我不知道如何防止我的角色离开屏幕(设置一个限制)。我有一个由用户输入控制的.png图像,但是角色可以正常离开可见屏幕区域。我不知道该怎么做。我在窗口周围做了一个矩形(pygame.draw.rect),但我不能将该矩形指定给变量,以便创建冲突。我也试过: if not character.get_rect() in screen.get_rect(): print("error") 但它不起作用,只是向python控制台发送了“错误”消息 (我用这个

我试图用pygame制作一个游戏,但我不知道如何防止我的角色离开屏幕(设置一个限制)。我有一个由用户输入控制的.png图像,但是角色可以正常离开可见屏幕区域。我不知道该怎么做。我在窗口周围做了一个矩形(
pygame.draw.rect
),但我不能将该矩形指定给变量,以便创建冲突。我也试过:

if not character.get_rect() in screen.get_rect():
    print("error")
但它不起作用,只是向python控制台发送了“错误”消息

(我用这个问题检查了另一篇帖子,但没有任何效果/没有得到答案)

所以我的问题是,我怎样才能让我的角色远离银幕,哪种方法是最好的

~z~谢谢


编辑:我的游戏没有滚动的游戏场/摄像机。(只是整个窗口上的固定视图)

当您使用pygame.draw.rect时,实际上并没有创建“物理”边界-您只是将屏幕上像素的颜色设置为矩形

如果您知道屏幕的大小,以及屏幕上所有对象的位移(仅当您的游戏有滚动的游戏场或摄像头时适用),则可以执行以下操作:

# In the lines of code where you have the player move around
# I assume you might be doing something like this
if keys[pygame.K_RIGHT]:
    player.move(player.getSpeed(),0) # giving the x and y displacements
if keys[pygame.K_LEFT]:
    player.move(-player.getSpeed(),0)

请注意,获取Pygame窗口大小的有用工具是
Pygame.display.get_surface().get_size()
,它将为您提供宽度和高度的元组。不过,最好不要每次需要知道玩家的边界时都打这个电话。也就是说,您应该存储窗口的宽度和高度,以便以后检索

if not character.get_rect() in screen.get_rect():
    print("error")
我明白你在尝试什么了。如果要检查一个
Rect
是否在另一个内,请使用:

包含()
测试一个矩形是否位于另一个矩形内
包含(Rect)->bool

当参数完全位于Rect内时返回true

如果您只是想停止屏幕边缘的移动,一个简单的解决方案是使用:

夹紧ip()
将矩形在另一个矩形内移动到位
climp\u ip(Rect)->无

与Rect.clamp()相同。[返回一个新矩形,该矩形被移动到完全位于参数Rect内。如果该矩形太大而无法容纳在内,则该矩形位于参数Rect内的中心,但其大小未更改。]方法,但在适当位置操作

下面是一个简单的示例,您无法将黑色矩形移到屏幕外:

import pygame
pygame.init()
screen=pygame.display.set_mode((400, 400))
screen_rect=screen.get_rect()
player=pygame.Rect(180, 180, 20, 20)
run=True
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT: run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]: player.move_ip(0, -1)
    if keys[pygame.K_a]: player.move_ip(-1, 0)
    if keys[pygame.K_s]: player.move_ip(0, 1)
    if keys[pygame.K_d]: player.move_ip(1, 0)
    player.clamp_ip(screen_rect) # ensure player is inside screen
    screen.fill((255,255,255))
    pygame.draw.rect(screen, (0,0,0), player)
    pygame.display.flip()
# Control so Player doesn't go off screen
    if self.rect.right > WIDTH:
        self.rect.right = WIDTH
    if self.rect.left < 0:
        self.rect.left = 0
    if self.rect.bottom > HEIGHT:
        self.rect.bottom = HEIGHT
    if self.rect.top < 0:
        self.rect.top = 0

下面是一个简单的控制代码,我在游戏中使用它来防止精灵离开屏幕:

import pygame
pygame.init()
screen=pygame.display.set_mode((400, 400))
screen_rect=screen.get_rect()
player=pygame.Rect(180, 180, 20, 20)
run=True
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT: run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]: player.move_ip(0, -1)
    if keys[pygame.K_a]: player.move_ip(-1, 0)
    if keys[pygame.K_s]: player.move_ip(0, 1)
    if keys[pygame.K_d]: player.move_ip(1, 0)
    player.clamp_ip(screen_rect) # ensure player is inside screen
    screen.fill((255,255,255))
    pygame.draw.rect(screen, (0,0,0), player)
    pygame.display.flip()
# Control so Player doesn't go off screen
    if self.rect.right > WIDTH:
        self.rect.right = WIDTH
    if self.rect.left < 0:
        self.rect.left = 0
    if self.rect.bottom > HEIGHT:
        self.rect.bottom = HEIGHT
    if self.rect.top < 0:
        self.rect.top = 0
#控制播放器,使其不会离开屏幕
如果self.rect.right>宽度:
self.rect.right=宽度
如果self.rect.left<0:
self.rect.left=0
如果self.rect.bottom>高度:
self.rect.bottom=高度
如果self.rect.top<0:
self.rect.top=0

宽度和高度是用来设置屏幕大小的常量。我希望这有帮助。

你是说像vanellope一样?我的游戏没有滚动的游戏场或摄像头,在这种情况下我能做什么?如果你的游戏没有滚动的游戏场,那么你可以使用窗口本身的尺寸作为玩家移动的限制。哇,太好了。但是有没有办法用雪碧来做这个?像一个.png图像吗?如果你将一个图像blit到屏幕上,你会将这个图像的位置存储在某个地方。只需使用
Rect
存储该位置,并在该Rect上调用
climp\u ip
,然后将其显示在屏幕上。另外,可以看看
Sprite
类,它基本上是一个
Surface
Rect
的容器。