Как остановить движение спрайта после его смерти? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь сделать игру в pygame для проекта com sci. Макет очень похож на Galaga или любую другую аркадную игру типа шутер сверху вниз. Проблема, с которой я столкнулся сейчас, заключается в том, что после уничтожения спрайта спрайт все еще перемещается. Я хочу, чтобы спрайты не двигались, чтобы можно было рассчитать время падения пули.

Другими словами, я основываю атаки противника с их позиций х, и как только спрайт мертв, они продолжают двигаться, поэтому Враг атакует в любом случае. Есть ли способ остановить движение спрайта после его смерти или обнаружить мертвый, чтобы я мог остановить его сам? Спасибо!

Извините, если пропустил необходимый код, я не хотел добавлять слишком много наполнителя.

     #Enemy class #1
        class Kevin(pygame.sprite.Sprite):

            # Constructor. Pass in the color of the block,
            # and its x and y position
            def __init__(self, width, height):
                # Call the parent class (Sprite) constructor
                pygame.sprite.Sprite.__init__(self) #Python 2.7 version

                self.image = (pygame.image.load(r"IMAGE"))

                self.rect = self.image.get_rect()
            def change(self,speedx,speedy):
                self.rect.x += speedx
                self.rect.y += speedy

    #Enemy attack
        class Bullet(pygame.sprite.Sprite):

            # Constructor. Pass in the color of the block,
            # and its x and y position
            def __init__(self, width, height):
                # Call the parent class (Sprite) constructor
                pygame.sprite.Sprite.__init__(self) #Python 2.7 version       
                 self.image = (pygame.image.load(r"IMAGE"))

                self.rect = self.image.get_rect()
            def change(self,speedx,speedy):
                self.rect.x += speedx
                self.rect.y += speedy

     ...
     def minions(enemyx,enemyy,changex,a,b):
            global list1
            for i in range(a,b):
                enemyx += changex
                list1.append(i)
                list1[i] = Kevin(100,100)
                list1[i].rect.x = enemyx
                list1[i].rect.y = enemyy
                list2.append(i)
                list2[i] = Kevin(100,100)
                list2[i].rect.x = enemyx
                list2[i].rect.y = enemyy
                enemy_list.add(list1[i])
                all_sprite_list.add(list1[i])
      ...
       def lazerdrop(x,y,a,b):
            for i in range(a,b):
                list3.append(i)
                list3[i] = Bullet(100,100)
                list3[i].rect.x = x
                list3[i].rect.y = y
                lazer_list.add(list3[i])
                all_sprite_list.add(list3[i])
        for d in range(7):
            lazerdrop(-400,105,0,d)
        minions(-500,100,80,0,5)
     ...
             all_sprite_list.update()

            screen.fill(BLACK)



            all_sprite_list.draw(screen)
     ...




     #If enemy is hit by lazer
            blocks_hit_list = pygame.sprite.groupcollide(enemy_list,block_list,True,True)
            if len(blocks_hit_list) == 1:                  
                score += 200
...
  #If the enemy reaches a certan x point, drop a lazer 
        if list1[10].rect.x > 168 and list1[10].rect.x < 175:
            list3[1].rect.x = list1[10].rect.x
            list3[1].rect.y = list1[10].rect.y
            list3[2].rect.x = list1[11].rect.x
            list3[2].rect.y = list1[11].rect.y

1 Ответ

0 голосов
/ 06 января 2020

Поскольку мне нужно, чтобы значения x и y соответствовали заданному параметру c, я откидываю объекты за экран, чтобы увидеть, не попали ли они, я знаю, что есть лучшие способы сделать это, но это хорошо для теперь

По сути, blocks_hit_list - это список мертвых спрайтов, который обновляется каждый раз, когда враг убит. Я могу вызвать функцию «убит» (убирает объект с экрана) для каждого «мертвого» спрайта в списке. Спрайт все еще существует в идее, что его значения x и y все еще могут быть обнаружены, и мой способ окончательно убить его - изменить его значения x и y, чтобы они не соответствовали моим параметрам.

#If enemy is hit by lazer
        blocks_hit_list = pygame.sprite.groupcollide(enemy_list,block_list,True,True)
        if len(blocks_hit_list) == 1:                  
            score += 200
            list4 = sorted(blocks_hit_list)
            list4[0].killed(900,900)
            
...
 #If the enemy reaches a certan x point, drop a lazer 
        if list1[10].rect.x > 168 and list1[10].rect.x < 175:
            list3[1].rect.x = list1[10].rect.x
...