4

我正在尝试使用 pygame 制作游戏,但我不知道如何让我的角色不离开屏幕(设置限制)。我有一个由用户输入控制的 .png 图像,但角色可能会正常离开可见屏幕区域。我不知道该怎么做。我在窗口周围做了一个矩形,(pygame.draw.rect),但我不能将矩形分配给变量,所以我可以创建一个碰撞。我也试过这个:

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

但它没有用,只是用“错误”消息向 python 控制台发送垃圾邮件。

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

所以我的问题是,我怎样才能让我的角色不离开屏幕,这是最好的方法?

~谢谢

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

4

3 回答 3

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

我看到你在这里尝试什么。如果要检查 aRect是否在另一个内部,请使用contains()

contains()
测试一个矩形是否在另一个矩形内
contains(Rect) -> bool
当参数完全在矩形内时返回 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()
于 2013-09-11T09:09:32.113 回答
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()提供宽度和高度的元组。然而,最好避免每次你需要知道玩家的边界时调用它。也就是说,您应该存储窗口的宽度和高度以供以后检索。

于 2013-09-10T22:36:45.733 回答
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 是您定义的用于设置屏幕大小的常量。我希望这有帮助。

于 2018-02-12T20:38:40.833 回答