PyGame-角色离开屏幕

Posted

技术标签:

【中文标题】PyGame-角色离开屏幕【英文标题】:PyGame-Character Goes Off Screen 【发布时间】:2013-09-10 22:06:22 【问题描述】:

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

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

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

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

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

~谢谢

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

【问题讨论】:

你的意思是像vanellope? 【参考方案1】:
if not character.get_rect() in screen.get_rect():
    print("error")

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

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()

【讨论】:

哇,太好了。但是有没有办法用精灵做到这一点?像 .png 图像? 如果你将一个图像blit到屏幕上,你会将该图像的位置存储在某个地方。只需使用Rect 来存储该位置,然后在该矩形上调用clamp_ip,然后再将其传送到屏幕上。另外,也许看看Sprite 类,它基本上是SurfaceRect 的容器。【参考方案2】:

当您使用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(),它将为您提供宽度和高度的元组。然而,最好避免每次你需要知道玩家的边界时调用它。也就是说,您应该存储窗口的宽度和高度以供以后检索。

【讨论】:

我的游戏没有可滚动的游戏区域或摄像头,这种情况我该怎么办? 如果您的游戏没有可滚动的游戏区域,那么您可以使用窗口本身的尺寸作为玩家移动的限制。【参考方案3】:

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

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

【讨论】:

以上是关于PyGame-角色离开屏幕的主要内容,如果未能解决你的问题,请参考以下文章

具有多种状态的 Pygame 动画

如何在pygame中进行平滑运动

Pygame,角色移动速度

学习 Python 之 Pygame 开发魂斗罗

❤️ 如何在 Pygame 中移动你的游戏角色 ❤️

❤️ 如何在 Pygame 中移动你的游戏角色 ❤️