【问题标题】:Setting up an invisible boundary for my sprite为我的精灵设置一个不可见的边界
【发布时间】:2021-09-15 04:36:18
【问题描述】:

我目前正在开发一个平台游戏,它依赖于对象(以平台的形式)作为它们的碰撞,以防止玩家退出窗口。 这是我与平台/块碰撞的代码:

#check for collision
self.in_air = True
for tile in world.tile_list:
    #collison x
    if tile[1].colliderect(self.rect.x + dx,self.rect.y , self.width, self.height):
        dx = 0
    # collision y
    if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height):
        # below ground?
        if self.vel_y < 0:
            dy = tile[1].bottom - self.rect.top
            self.vel_y = 0
        # above ground?
        elif self.vel_y >= 0:
            dy = tile[1].top - self.rect.bottom
            self.vel_y = 0
            self.in_air = False

但是,这看起来不专业,我想添加代码,它引入了一个不可见的屏障,阻止玩家离开屏幕。 我尝试了不同的方法,但目前不确定,任何建议都将不胜感激。

【问题讨论】:

  • 为什么要标记tkinter?是什么让您认为代码看起来不专业?唯一突出的是大缩进,您应该尝试限制缩进,以便于阅读,而不是产生语法错误或与之相关的问题(例如在 if 语句之外有代码,因为你有许多缩进很难跟踪)(我个人会在这种情况下对矩形进行投影,然后将该矩形用作.colliderect 的参数,而不是像这样的四个数字)

标签: python pygame sprite boundaries


【解决方案1】:

如果你只想将播放器限制在一个边界矩形内,我推荐使用pygame.Rect.clamp_ip

将矩形移动到另一个位置

分别定义边界矩形。如果播放器被限制在屏幕上,您可以使用pygame.display.get_surface()pygame.Surface.get_rect 从显示器Surface 获得一个定义边框的矩形:

border_rect = pygame.display.get_surface().get_rect()

border_rect夹住播放器pygame.Rect

self.rect.clamp_ip(border_rect)

你可以用 1 行代码做到这一点:

self.rect.clamp_ip(pygame.display.get_surface().get_rect())

小例子

import pygame

pygame.init()
window = pygame.display.set_mode((200, 200))
clock = pygame.time.Clock()

rect = pygame.Rect(0, 0, 40, 40)
rect.center = window.get_rect().center
speed = 10

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False    

    keys = pygame.key.get_pressed()
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed  
    rect.clamp_ip(pygame.display.get_surface().get_rect())    

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
exit()

【讨论】:

  • 效果很好,非常感谢!此外,该解释非常深入,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
相关资源
最近更新 更多