python - Pygame,将精灵保持在边框中,clamp_ip() 将无法正常工作
问题描述
代码:
def main():
running = True
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
player.update()
enemy.update(player)
#player.rect.clamp_ip(border_rect)
screen.fill(BACKGROUND_COLOR)
screen.blit(player.image, player.rect)
screen.blit(enemy.image, enemy.rect)
pygame.display.update()
class Mob(pygame.sprite.Sprite):
def __init__(self, position):
super(Mob, self).__init__()
self.image = pygame.Surface((32, 32))
self.image.fill(pygame.Color('red'))
self.rect = self.image.get_rect(center=position)
self.position = pygame.math.Vector2(position)
self.speed = 3
def hunt_player(self, player):
player_position = player.rect.center
direction = player_position - self.position
velocity = direction.normalize() * self.speed
self.position += velocity
self.rect.center = self.position
def update(self, player):
self.hunt_player(player)
class Player(pygame.sprite.Sprite):
def __init__(self, position):
super(Player, self).__init__()
self.image = pygame.Surface((40, 40))
self.image.fill(pygame.Color('blue'))
self.rect = self.image.get_rect(center=position)
self.position = pygame.math.Vector2(position)
self.velocity = pygame.math.Vector2(0, 0)
self.speed = 6
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
self.velocity.x = -self.speed
elif keys[pygame.K_d]:
self.velocity.x = self.speed
else:
self.velocity.x = 0
if keys[pygame.K_w]:
self.velocity.y = -self.speed
elif keys[pygame.K_s]:
self.velocity.y = self.speed
else:
self.velocity.y = 0
self.position += self.velocity
self.rect.center = self.position
player = Player(position=(350, 220))
enemy = Mob(position=(680, 400))
startscreen()
main()
这是我过去几个月一直在涉足的“追逐”风格的游戏。
谁能帮我为我的精灵创建一个边框?我已经设法使用了clamp_ip() 方法,但它只会阻止图像离开屏幕而不是实际的精灵,所以我把它拿出来了。任何帮助将非常感激。
解决方案
精灵的实际位置player
存储在self.position
属性中,但调用player.rect.clamp_ip(border_rect)
只影响self.rect
属性,并且position
每帧都会改变。
我会使用该pygame.Rect.contains
方法检查播放器是否在屏幕区域之外,如果是,则调用clamp_ip
并将其设置player.position
为新的player.rect.center
.
if not border_rect.contains(player.rect):
player.rect.clamp_ip(border_rect)
player.position = pygame.math.Vector2(player.rect.center)
推荐阅读
- ruby-on-rails - 当存在需要数据库操作的服务器发送事件 (SSE) 时,Rails 应用程序挂起
- apache-flink - 如何加入流和数据集?
- erlang - Erlang脚本分配变量
- python - 如何使用 MongoEngine 从参考字段中检索 pdf/图像?
- c# - 如何在 NSwag 生成的文档中启用“text/plain”内容类型?
- php - PHP 溢出 arduino 缓冲区
- javascript - Vue 是什么让开发人员能够在 DOM 元素上使用 class 属性?
- javascript - 如何在 Mapbox GL JS 中使用标准 OpenStreetMap 瓦片服务器?
- java - 如何模拟存在但无法读取的路径
- c - 使用函数查找数组元素的总和,我得到垃圾值