我正在尝试用pygame制作游戏,但我无法弄清楚如何防止我的角色离开屏幕(设置限制)。我有一个由用户输入控制的.png图像,但是角色可能正常地离开可见屏幕区域。我无法弄清楚如何做到这一点。我在窗口周围做了一个矩形,(pygame.draw.rect
)但是我不能将rect分配给变量,所以我可以创建一个碰撞。我也试过这个:
if not character.get_rect() in screen.get_rect():
print("error")
但它没有用,只是用python控制台发送了“错误”消息。
(我用这个问题检查了另一篇文章,但没有任何工作/没有得到它)
所以我的问题是,如何让我的角色不要离屏,哪种方式最好?
〜感谢
编辑:我的游戏没有滚动的游戏区/相机。 (只是整个窗口的固定视图)
答案 0 :(得分:5)
if not character.get_rect() in screen.get_rect():
print("error")
我看到你在这里尝试的是什么。如果您想检查Rect
是否在另一个内,请使用contains()
:
<强>包含()强>
测试一个矩形是否在另一个中contains(Rect) -> bool
当参数完全在Rect内部时返回true。
如果您只是想停止屏幕边缘的移动,一个简单的解决方案是使用clamp_ip()
:
<强> clamp_ip()强>
将矩形移动到另一个内部中clamp_ip(Rect) -> None
与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()
答案 1 :(得分:1)
使用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)
...
class Player:
...
def move(self, dx, dy):
newX = self.x + dx
newY = self.y + dy
self.x = max(0, min(newX, SCREEN_WIDTH)) # you handle where to store screen width
self.y = max(0, min(newY, SCREEN_HEIGHT))
请注意,获取Pygame窗口大小的有用工具是pygame.display.get_surface().get_size()
,它将为您提供宽度和高度的元组。但是,每次你需要知道玩家的界限时,最好避免调用它。也就是说,您应该存储窗口的宽度和高度以便以后检索。
答案 2 :(得分:1)
这是一个简单的控制代码,我在游戏中使用它来防止精灵离开屏幕:
# 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
WIDTH和HEIGHT是您定义的用于设置屏幕大小的常量。我希望这会有所帮助。