为我的精灵设置一个不可见的边界
Setting up an invisible boundary for my sprite
我目前正在开发一款平台游戏,该游戏依靠对象(以平台的形式)进行碰撞,以防止玩家退出 window。
这是我与 platforms/blocks:
冲突的代码
#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
但是,这看起来不专业,我想添加代码,引入一个不可见的屏障,阻止玩家离开屏幕。
我尝试了不同的方法,但目前不确定,如有任何建议,我们将不胜感激。
如果你只想将播放器限制在一个边界矩形内,我建议使用 pygame.Rect.clamp_ip
moves the rectangle inside another, in place
分别定义边界矩形。如果播放器受限于屏幕,您可以从显示器 Surface 和 pygame.display.get_surface()
and pygame.Surface.get_rect
:
中获取定义边框的矩形
border_rect = pygame.display.get_surface().get_rect()
通过border_rect
夹住播放器pygame.Rect
:
self.rect.clamp_ip(border_rect)
只需一行代码即可完成:
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()
我目前正在开发一款平台游戏,该游戏依靠对象(以平台的形式)进行碰撞,以防止玩家退出 window。 这是我与 platforms/blocks:
冲突的代码#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
但是,这看起来不专业,我想添加代码,引入一个不可见的屏障,阻止玩家离开屏幕。 我尝试了不同的方法,但目前不确定,如有任何建议,我们将不胜感激。
如果你只想将播放器限制在一个边界矩形内,我建议使用 pygame.Rect.clamp_ip
moves the rectangle inside another, in place
分别定义边界矩形。如果播放器受限于屏幕,您可以从显示器 Surface 和 pygame.display.get_surface()
and pygame.Surface.get_rect
:
border_rect = pygame.display.get_surface().get_rect()
通过border_rect
夹住播放器pygame.Rect
:
self.rect.clamp_ip(border_rect)
只需一行代码即可完成:
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()