首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyGame-角色退出屏幕

PyGame-角色退出屏幕
EN

Stack Overflow用户
提问于 2013-09-11 06:06:23
回答 3查看 10.2K关注 0票数 4

我正在试着用pygame做一个游戏,但是我不知道如何让我的角色不离开屏幕(设置一个限制)。我有一个由用户输入控制的.png图像,但正常情况下,字符可能会离开可见屏幕区域。我想不出该怎么做。我在窗口周围做了一个矩形(pygame.draw.rect),但是我不能将矩形赋值给一个变量,这样我就可以创建一个碰撞。我还尝试了这个:

代码语言:javascript
运行
复制
if not character.get_rect() in screen.get_rect():
    print("error")

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

(我用这个问题查看了另一个帖子,但什么都不起作用/没有得到它)

所以我的问题是,我如何防止我的角色离开屏幕,哪种方法是最好的?

~谢谢

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-11 17:09:32

代码语言:javascript
运行
复制
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中居中,但其大小不会改变。方法,但在适当的位置操作。

下面是一个不能将黑色矩形移出屏幕的简单示例:

代码语言:javascript
运行
复制
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()
票数 6
EN

Stack Overflow用户

发布于 2013-09-11 06:36:46

当您使用pygame.draw.rect时,您实际上并没有创建一个“物理”边界-您只是将屏幕上像素的颜色设置为一个矩形。

如果您知道屏幕的大小,以及屏幕上所有对象的位移(仅当您的游戏有滚动游戏区或摄像头时才适用),则可以执行以下操作:

代码语言:javascript
运行
复制
# 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)

..。

代码语言:javascript
运行
复制
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(),它将为您提供一个宽度和高度的元组。然而,避免每次你需要知道玩家的边界时都调用它还是更好的。也就是说,您应该存储窗口的宽度和高度,以便以后检索。

票数 1
EN

Stack Overflow用户

发布于 2018-02-13 04:38:41

这是一个简单的控制代码,我在我的游戏中使用,以防止精灵从屏幕上消失:

代码语言:javascript
运行
复制
# 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

宽度和高度是用来设置屏幕大小的常量。我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18729538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档