Вы можете просто создать новый Bullet
при каждом щелчке мыши. Затем добавьте его в свою группу. Может быть, вы просто исключили эту часть из кода вопроса, но спрайты, которые перемещаются, должны определить функцию update()
для перемещения самих себя (или что бы то ни было, что они делают).
bullet_img = pygame.image.load('bullet.png')
class Bullet( pygame.sprite.Sprite ):
def __init__( self, from_x, from_y, to_x, to_y, speed=1.5 ):
pygame.sprite.Sprite.__init__( self )
global bullet_img
self.image = bullet_img
self.rect = self.image.get_rect()
self.rect.center = ( from_x, from_y )
self.speed = speed
# Calculate how far we should move in X and Y each update.
# Basically this is just a pair of numbers that get added
# to the co-ordinate each update to move the bullet towards
# its destination.
from_point = pygame.math.Vector2( ( from_x, from_y ) )
to_point = pygame.math.Vector2( ( to_x, to_y ) )
distance = from_point.distance_to( to_point ) # 2D line length
self.dir_x = ( to_x - from_x ) / distance # normalised direction in x
self.dir_y = ( to_y - from_y ) / distance # normalised direction in y
# Store the position as a float for slow-speed and small angles
# Otherwise sub-pixel updates can be lost
self.position = ( float( from_x ), float( from_y ) )
def update( self ):
# How far do we move this update?
# TODO: maybe change to use millisecond timings instead of frame-speed
x_movement = self.speed * self.dir_x
y_movement = self.speed * self.dir_y
self.position[0] += x_movement
self.position[1] += y_movement
# convert back to integer co-ordinates for the rect
self.rect.center = ( int( self.position[0] ), int( self.position[1] ) )
### TODO: when ( offscreen ): self.kill()
В вашем основном l oop всякий раз, когда игрок запускает новую пулю, создает объект и добавляет его в группу спрайтов.
# ...
bullet_sprites = pygame.sprite.Group()
# ...
### MAIN Loop
done = False
while not done:
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
done = True
elif ( event.type == pygame.MOUSEBUTTONUP ):
# Bullet from TURRET in the direction of the click
start_x = WINDOW_WIDTH//2
start_y = int( WINDOW_HEIGHT * 0.9 ) # where is this?
end_pos = pygame.mouse.get_pos()
to_x = end_pos[0]
to_y = end_pos[1]
# Create a new Bullet every mouse click!
bullet_sprites.add( Bullet( start_x, start_y, to_x, to_y ) )
Также в вашем основном l oop, не забудьте позвонить
bullet_sprites.update()
Который вызывает функцию update()
каждого спрайта в группе. Это будет перемещать пули вдоль их траектории.