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
类,它基本上是Surface
和Rect
的容器。【参考方案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-角色离开屏幕的主要内容,如果未能解决你的问题,请参考以下文章