2016-07-08 7 views
0

Я пытаюсь сделать пулевое движение в Pygame. Извиняюсь, если у него есть простое исправление, я просто не могу думать в данный момент.Пытается переместить спрайт в pygame

Это то, что я запускаю, когда обнаруживаю, что нажата кнопка «1».

if pygame.event.get().type == KEYDOWN and e.key == K_1: 
    bullet = Bullet() 
    bullet.rect.x = player.rect.x 
    bullet.rect.y = player.rect.y 
    entities.add(bullet) 
    bullet_list.add(bullet) 
    bullet.update() 

... и это фактический класс пули. Интервал немного выключен.

class Bullet(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Bullet, self).__init__() 
     self.image = pygame.Surface([4, 10]) 
     self.image.fill(pygame.Color(255, 255, 255)) 
     self.isMoving = False 
     self.rect = self.image.get_rect() 

    def update(self): 
     for i in range(20): 
      self.rect.x += 3 

Я понимаю, что метод обновления происходит мгновенно, а не медленнее, чем я хочу. Как я могу заставить пулю двигаться медленнее? Все ответы, которые я видел, связаны с полной остановкой программы, а не просто остановкой одного объекта. Есть ли способ обойти это?

ответ

1

Вам необходимо обновить все пуль на каждой игре, а не только, когда игрок нажимает кнопку.

Итак, вы хотите что-то вроде этого, как ваш цикл событий:

clock = pygame.time.Clock() 
while True: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event == KEYDOWN and event.key == K_1: 
      bullet = Bullet() 
      bullet.rect.x = player.rect.x 
      bullet.rect.y = player.rect.y 
      entities.add(bullet) 
      bullet_list.add(bullet) 
    for bullet in bullet_list: 
     bullet.update() 

И изменить класс пули делать постепенные шаги, например, так:

class Bullet(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Bullet, self).__init__() 
     self.image = pygame.Surface([4, 10]) 
     self.image.fill(pygame.Color(255, 255, 255)) 
     self.isMoving = False 
     self.rect = self.image.get_rect() 

    def update(self): 
     self.rect.x += 3 
+0

Спасибо! Это исправило это. У меня уже было clock.tick() в программе, но я помещал обновление в нажатие кнопки, как вы сказали, я был. Итак, если я правильно понимаю, просто используйте часы, чтобы делать какие-либо события времени? –

+0

'clock.tick (60)' гарантирует, что цикл выполняется не чаще, чем 60 раз в секунду. Каждый прогон этого цикла называется Frame, дискретным состоянием игры. Вот откуда исходит термин «Фреймы в секунду» (FPS). Они имеют многозадачную архитектуру, так что любое действие не останавливает все остальное. Например, если вы создаете анимацию, вы не можете остановить обновление изображения только потому, что хотите захватить ввод пользователя. См. Https://en.wikipedia.org/wiki/Game_programming#Game_structure для получения дополнительной информации. –