PyGame-Character离开屏幕

时间:2013-09-10 22:06:23

标签: python pygame

我正在尝试用pygame制作游戏,但我无法弄清楚如何防止我的角色离开屏幕(设置限制)。我有一个由用户输入控制的.png图像,但是角色可能正常地离开可见屏幕区域。我无法弄清楚如何做到这一点。我在窗口周围做了一个矩形,(pygame.draw.rect)但是我不能将rect分配给变量,所以我可以创建一个碰撞。我也试过这个:

if not character.get_rect() in screen.get_rect():
    print("error")

但它没有用,只是用python控制台发送了“错误”消息。

(我用这个问题检查了另一篇文章,但没有任何工作/没有得到它)​​

所以我的问题是,如何让我的角色不要离屏,哪种方式最好?

〜感谢

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

3 个答案:

答案 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是您定义的用于设置屏幕大小的常量。我希望这会有所帮助。