class Bullet: def __init__(self, (from_x, from_y), (to_x, to_y)): self.pos = Vector2(from_x, from_y) self.destination = Vector2(to_x, to_y) self.heading = Vector2.from_points(self.pos, self.destination) self.heading.normalize() self.speed = 500 #pixels per second self.total_distance = 0 self.sprite = pygame.image.load( '../images/bullet_lvl_2.png').convert_alpha() w, h = self.sprite.get_size() if w > 10: ratio = 10. / w h = int(h * ratio) self.sprite = pygame.transform.scale(self.sprite, (10, h)) self.rotation = 0 to_x = to_x - from_x to_y = (to_y - from_y) * -1 if to_x != 0: angle = atan(to_y / to_x) / (pi / 180.) else: angle = -90 if to_x < 0: angle += 180. if to_x >= 0 and to_y < 0: angle += 360. self.rotation = angle - 90 self.pos += self.heading * 100 #dodaje dlugos lugy self.rotated_sprite = pygame.transform.rotate(self.sprite, self.rotation) w, h = self.rotated_sprite.get_size() self.draw_pos = Vector2(self.pos.x - w / 2, self.pos.y - h / 2)
def move(self, time_passed_seconds, speed): dv = Vector2(self.destination) lv = Vector2(self.rect.x, self.rect.y) heading = Vector2.from_points(lv, dv) heading.normalize() d = heading * time_passed_seconds * speed self.rect.move_ip(round(d.x), round(d.y))
def start(self) -> None: y_direction = randint(0, self.screen_rect.bottom) x_direction = randint(0, self.screen_rect.right) destination = Vector2(x_direction, y_direction) - (Vector2(5, 5) / 2) heading = Vector2.from_points(self.screen_rect.center, destination) heading.normalize() self.ball.direction = heading self.game_state = GameState.RUNNING self.started_at = datetime.now()
def update(self, delta): if self.last_location: self.last_vector = Vector2.from_points(self.last_location, (self.rect.x, self.rect.y)) self.rect.move_ip((self.randirx, self.randiry)) center = self.rect.center self.image = pygame.transform.rotate(self.original, self.rotation) self.rect = self.image.get_rect(center=center) self.bounding = self.rect.inflate(-self.rect.width/2.25, -self.rect.height/2.25) self.last_location = (self.rect.x, self.rect.y)
def _calculate_destination(self, mouse_pos): """ Figure out the destination coords for the bullet, starting from the center of the screen through the point the player click, to the edge of the screen. """ dx,dy = mouse_pos step = Vector2.from_points((WINDOWWIDTH/2,WINDOWHEIGHT/2), (dx,dy)) * 0.1 while True: if dx > WINDOWWIDTH or dy > WINDOWHEIGHT or dx < 0 or dy < 0: break dx += step.x dy += step.y return (dx, dy)
def _calculate_destination(self, mouse_pos): """ Figure out the destination coords for the bullet, starting from the center of the screen through the point the player click, to the edge of the screen. """ dx, dy = mouse_pos step = Vector2.from_points((WINDOWWIDTH / 2, WINDOWHEIGHT / 2), (dx, dy)) * 0.1 while True: if dx > WINDOWWIDTH or dy > WINDOWHEIGHT or dx < 0 or dy < 0: break dx += step.x dy += step.y return (dx, dy)
background = pygame.image.load(background_image_filename).convert() sprite = pygame.image.load(sprite_image_filename).convert_alpha() clock = pygame.time.Clock() position = Vector2(100.0, 100.0) heading = Vector2() destination = Vector2() speed = 200 while True: for event in pygame.event.get(): if event.type == QUIT: exit() pressed_mouse = pygame.mouse.get_pressed() if pressed_mouse[2]: destination = Vector2( *pygame.mouse.get_pos() ) - Vector2( *sprite.get_size() )/2 vector_to_mouse = Vector2.from_points(position, destination) vector_to_mouse.normalize() heading = (vector_to_mouse * speed) if destination.eq(position): heading = Vector2() screen.blit(background, (0,0)) screen.blit(sprite, position) time_passed = clock.tick(60) time_passed_seconds = time_passed / 1000.0 position += heading * time_passed_seconds pygame.display.update()
from vector2 import Vector2 from pygame.locals import * pygame.init() screen = pygame.display.set_mode((640, 480), 0, 32) sprite = pygame.image.load("images/play.png").convert_alpha() clock = pygame.time.Clock() position = Vector2(100.0, 100.0) speed = 250 heading = Vector2() while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() exit() destination = Vector2( *pygame.mouse.get_pos()) - (Vector2(*sprite.get_size()) / 2) heading = Vector2.from_points(position, destination) heading.normalize() screen.blit(sprite, (int(position.x), int(position.y))) time_passed = clock.tick() time_passed_seconds = time_passed / 1000.0 distance_moved = time_passed_seconds * speed position += heading * distance_moved pygame.display.update() time.sleep(0.01)
def go_to(self, x, y): actual = (self.x, self.y) to = (x, y) self.direction = Vector.from_points(actual, to) self.direction.normalise() print self.direction.x
def get_dir(self,leaf,pos): self.direction=Vector2.from_points(pos,leaf) self.magnitude=self.direction.get_magnitude() self.direction.normalize()
position = Vector2(100.0, 100.0) heading = Vector2() while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.blit(background, (0,0)) screen.blit(sprite, position) time_passed = clock.tick(100) time_passed_seconds = time_passed / 1000.0 # 参数前面加*意味着把列表或元组展开 destination = Vector2( *pygame.mouse.get_pos() ) - Vector2( *sprite.get_size() ) # 计算鱼儿当前位置到鼠标位置的向量 vector_to_mouse = Vector2.from_points(position, destination) # 向量规格化 vector_to_mouse.normalize() # 这个heading可以看做是鱼的速度,但是由于这样的运算,鱼的速度就不断改变了 # 在没有到达鼠标时,加速运动,超过以后则减速。因而鱼会在鼠标附近晃动。 heading = heading + (vector_to_mouse * .6) # position=heading + (vector_to_mouse * time_passed_seconds) position += heading * time_passed_seconds # position +=vector_to_mouse*0.5 pygame.display.update()