Спрайт рисуется из верхнего левого угла, что означает, что спрайт может быть нарисован полностью из sprite.rect.x >= 0
и sprite.rect.x < WINDOW_WIDTH - sprite.rect.width
. (И аналогично для y
).
Это дает вам два подхода:
- Перед перемещением подсчитайте, сколько из
player.vel
можно использовать, и ограничьте его.
- После перемещения убедитесь, что игрок
x,y
все еще на экране.
Обычно второй вариант проще:
class PlayerSprite( pygame.sprite.Sprite ):
def __init__( self, bitmap, x, y ):
pygame.sprite.Sprite.__init__( self )
self.image = bitmap
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def move( self, x_dir, y_dir ):
self.rect.x += x_dir
self.rect.y += y_dir
# stay on screen
if ( self.rect.x < 0 ):
self.rect.x = 0
elif ( self.rect.x > WINDOW_WIDTH - self.rect.width ):
self.rect.x = WINDOW_WIDTH - self.rect.width - 1
if ( self.rect.y < = 0 ):
self.rect.y = 0
elif ( self.rect.y > WINDOW_HEIGHT - self.rect.height ):
self.rect.y = WINDOW_HEIGHT - self.rect.height - 1
def update( self ):
pass # TODO
Что означает, что вызывающему коду не нужно беспокоиться о vel
или о позиции:
if key[pygame.K_a]:
player.move( -player.vel, 0 ) # left
if key[pygame.K_d]:
player.move( player.vel, 0 ) # right
if key[pygame.K_w]:
player.move( 0, -player.vel ) # up
if key[pygame.K_x]:
player.move( 0, player.vel ) # waaay down