是否可以即时获取精灵的位置?
Is it possible to get the location of a sprite at an INSTANT?
所以我正在开发一款 PacMan 游戏,我设置了我的代码,如果你按下左键,它会 'remember' 然后等待玩家到达有没有墙,允许它向左移动。这样,玩家就不必根据墙壁开口的位置精确地确定击键时间。我的问题是,例如,当我向左打时,它会播放向左移动的动画,即使玩家在墙上有一个开口之前不会朝那个方向移动。
在我的代码中,我试图让它只在玩家向左移动时播放左边的动画。我尝试这样做的方式是立即获取玩家的位置,然后测试玩家现在是否在左边,这意味着它已经成功转弯并且现在应该播放左边的动画.这是我在代码中的基本思路:
class Player (pygame.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites
pygame.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = sprite_sheet('pacman-spritesheet.png').get_image(0, 0, 24, 24)
self.x = x * TILESIZE
self.y = y * TILESIZE
self.rect = self.image.get_rect()
self.vx, self.vy = 0, 0
self.spritesheet_index = 0
self.first_time = pygame.time.get_ticks()
self.delay = 43
self.input_list = ['--']
self.direction = ''
self.POINTS = 0
def get_keys(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.input_list.append('left')
if keys[pygame.K_RIGHT]:
self.input_list.append('right')
if keys[pygame.K_UP]:
self.input_list.append('up')
if keys[pygame.K_DOWN]:
self.input_list.append('down')
def last_direction(self):
return self.input_list[len(self.input_list) - 1]
def animate(self):
self.spritesheet_index += 1
if self.last_direction() == 'left':
self.second_time = pygame.time.get_ticks()
if self.second_time-self.first_time > self.delay and self.first_x < self.second_x:
self.image = PAC_LEFT[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'right':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time < self.delay:
self.image = PAC_RIGHT[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'up':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time > self.delay:
self.image = PAC_UP[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'down':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time > self.delay:
self.image = PAC_DOWN[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
def set_velocity(self):
if self.last_direction() == 'left':
self.vx = -PLAYER_SPEED
if self.last_direction() == 'right':
self.vx = PLAYER_SPEED
if self.last_direction() == 'up':
self.vy = -PLAYER_SPEED
if self.last_direction() == 'down':
self.vy = PLAYER_SPEED
def move(self):
self.x += self.vx
self.y += self.vy
def update(self):
self.first_x = self.x
self.get_keys()
self.set_velocity()
self.move()
self.second_x = self.x
self.animate()
self.rect.x = self.x
self.collide_with_wall('x')
self.rect.y = self.y
self.collide_with_wall('y')
self.collide_with_point()
您只需拥有一个属性 self.last_rect
即可完成此操作,您可以在更新方法结束时将其保存到该属性中。但是,我认为有更好的方法。既然你设法做到了,吃豆人只在墙上有一个开口时才开始向左移动,你应该能够在代码中使用相同的地方来改变精灵。但如果您仍想按您要求的方式进行操作,这大致就是您需要做的。
PACMAN_SIZE = 32, 32
LEFT_SPRITES = load_left_sprites()
RIGHT_SPRITES = load_right_sprites()
class Pacman(pygame.sprite.Sprite):
def __init__(self)
# ... List all your attributes in the __init__ method ...
def get_direction(self):
return self.input_list[len(self.input_list)-1]
def set_velocity(self):
if self.get_direction() == 'left':
self.vx = -PLAYER_SPEED
elif self.get_direction() == 'right':
self.vx = PLAYER_SPEED
def move(self):
# Your move logic
# ... code ...
self.rect.x += self.vx
def animate(self):
if self.new_x > self.previous_x:
self.image = PAC_RIGHT[self.spritesheet_index % 4]
elif self.new_x < self.previous_x:
self.image = PAC_LEFT[self.spritesheet_index % 4]
def update(self, dt):
self.previous_x = self.rect.x
set_velocity()
move()
self.new_x = self.rect.x
animate()
所以我正在开发一款 PacMan 游戏,我设置了我的代码,如果你按下左键,它会 'remember' 然后等待玩家到达有没有墙,允许它向左移动。这样,玩家就不必根据墙壁开口的位置精确地确定击键时间。我的问题是,例如,当我向左打时,它会播放向左移动的动画,即使玩家在墙上有一个开口之前不会朝那个方向移动。
在我的代码中,我试图让它只在玩家向左移动时播放左边的动画。我尝试这样做的方式是立即获取玩家的位置,然后测试玩家现在是否在左边,这意味着它已经成功转弯并且现在应该播放左边的动画.这是我在代码中的基本思路:
class Player (pygame.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites
pygame.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = sprite_sheet('pacman-spritesheet.png').get_image(0, 0, 24, 24)
self.x = x * TILESIZE
self.y = y * TILESIZE
self.rect = self.image.get_rect()
self.vx, self.vy = 0, 0
self.spritesheet_index = 0
self.first_time = pygame.time.get_ticks()
self.delay = 43
self.input_list = ['--']
self.direction = ''
self.POINTS = 0
def get_keys(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.input_list.append('left')
if keys[pygame.K_RIGHT]:
self.input_list.append('right')
if keys[pygame.K_UP]:
self.input_list.append('up')
if keys[pygame.K_DOWN]:
self.input_list.append('down')
def last_direction(self):
return self.input_list[len(self.input_list) - 1]
def animate(self):
self.spritesheet_index += 1
if self.last_direction() == 'left':
self.second_time = pygame.time.get_ticks()
if self.second_time-self.first_time > self.delay and self.first_x < self.second_x:
self.image = PAC_LEFT[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'right':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time < self.delay:
self.image = PAC_RIGHT[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'up':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time > self.delay:
self.image = PAC_UP[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
if self.last_direction() == 'down':
self.second_time = pygame.time.get_ticks()
if self.second_time - self.first_time > self.delay:
self.image = PAC_DOWN[self.spritesheet_index % 4]
self.first_time = pygame.time.get_ticks()
def set_velocity(self):
if self.last_direction() == 'left':
self.vx = -PLAYER_SPEED
if self.last_direction() == 'right':
self.vx = PLAYER_SPEED
if self.last_direction() == 'up':
self.vy = -PLAYER_SPEED
if self.last_direction() == 'down':
self.vy = PLAYER_SPEED
def move(self):
self.x += self.vx
self.y += self.vy
def update(self):
self.first_x = self.x
self.get_keys()
self.set_velocity()
self.move()
self.second_x = self.x
self.animate()
self.rect.x = self.x
self.collide_with_wall('x')
self.rect.y = self.y
self.collide_with_wall('y')
self.collide_with_point()
您只需拥有一个属性 self.last_rect
即可完成此操作,您可以在更新方法结束时将其保存到该属性中。但是,我认为有更好的方法。既然你设法做到了,吃豆人只在墙上有一个开口时才开始向左移动,你应该能够在代码中使用相同的地方来改变精灵。但如果您仍想按您要求的方式进行操作,这大致就是您需要做的。
PACMAN_SIZE = 32, 32
LEFT_SPRITES = load_left_sprites()
RIGHT_SPRITES = load_right_sprites()
class Pacman(pygame.sprite.Sprite):
def __init__(self)
# ... List all your attributes in the __init__ method ...
def get_direction(self):
return self.input_list[len(self.input_list)-1]
def set_velocity(self):
if self.get_direction() == 'left':
self.vx = -PLAYER_SPEED
elif self.get_direction() == 'right':
self.vx = PLAYER_SPEED
def move(self):
# Your move logic
# ... code ...
self.rect.x += self.vx
def animate(self):
if self.new_x > self.previous_x:
self.image = PAC_RIGHT[self.spritesheet_index % 4]
elif self.new_x < self.previous_x:
self.image = PAC_LEFT[self.spritesheet_index % 4]
def update(self, dt):
self.previous_x = self.rect.x
set_velocity()
move()
self.new_x = self.rect.x
animate()