Могу ли я создать систему маркеров с помощью автоматически сгенерированных экземпляров класса? (Pygame) - PullRequest
1 голос
/ 26 марта 2020

Я создаю целевую игру-шутер, в которой игрок щелкает мышью, и пуля летит к нему. Я начал использовать pygame.sprite, чтобы упростить процесс. В настоящее время мне удалось загрузить цели и фон, и заставить цели двигаться. Теперь я хочу сделать функцию пули. В идеале я хочу снова использовать команды «pygame.sprite», чтобы использовать готовую систему обнаружения столкновений. Проблема в том, что я, очевидно, не могу сидеть здесь и создавать сотни пуль, которые появятся при щелчке. Я читал темы об автоинсталляции, но ни одна из них не похожа на мою проблему, где мне нужно, чтобы она была включена в Pygame. Все маркеры будут иметь одни и те же свойства, кроме «self.rect.x / y», но я справлюсь с этим позже. В принципе, есть ли способ сделать так, чтобы экземпляр мог автоматически создаваться во время выполнения? Обратите внимание, что функция refresh_window () должна содержать все команды рисования.

#Using pygame.sprite to make a class for the bullet sprites.
bullet_img = pygame.image.load('bullet.png')

class Bullet(pygame.sprite.Sprite):
  def __init__(self, width, height):
    pygame.sprite.Sprite.__init__(self, bullet_sprites)
    self.image = pygame.Surface([width, height])
    self.image = bullet_img
    self.rect = self.image.get_rect()
    self.rect.center = (400,400)

bullet_sprites = pygame.sprite.Group()

#Creating a function which will deal with redrawing all sprites and updating the screen.
def refresh_window():
  window.blit(bgr, (0,0))
  player_sprites.draw(window)
  target_sprites.draw(window)
  bullet_sprites.draw(window)
  pygame.display.update()

1 Ответ

0 голосов
/ 26 марта 2020

Вы можете просто создать новый 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() каждого спрайта в группе. Это будет перемещать пули вдоль их траектории.

...