假设当前位置是
pos,点点击播放器
target_pos,然后采取之间的矢量
pos和
target_pos。
现在您知道了如何从
pos到达
target_pos,但是要以恒定速度(而不是一次移动整个距离)移动,必须对向量进行归一化,并通过标量乘法应用速度常数。
而已。
完整示例:( 相关代码在Ship.update
方法中)
import pygameclass Ship(pygame.sprite.Sprite): def __init__(self, speed, color): super().__init__() self.image = pygame.Surface((10, 10)) self.image.set_colorkey((12,34,56)) self.image.fill((12,34,56)) pygame.draw.circle(self.image, color, (5, 5), 3) self.rect = self.image.get_rect() self.pos = pygame.Vector2(0, 0) self.set_target((0, 0)) self.speed = speed def set_target(self, pos): self.target = pygame.Vector2(pos) def update(self): move = self.target - self.pos move_length = move.length() if move_length < self.speed: self.pos = self.target elif move_length != 0: move.normalize_ip() move = move * self.speed self.pos += move self.rect.topleft = list(int(v) for v in self.pos)def main(): pygame.init() quit = False screen = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() group = pygame.sprite.Group( Ship(1.5, pygame.Color('white')), Ship(3.0, pygame.Color('orange')), Ship(4.5, pygame.Color('dodgerblue'))) while not quit: for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.MOUSEBUTTONDOWN: for ship in group.sprites(): ship.set_target(pygame.mouse.get_pos()) group.update() screen.fill((20, 20, 20)) group.draw(screen) pygame.display.flip() clock.tick(60)if __name__ == '__main__': main()


