2016-04-29 2 views
0

поэтому мне нужно удалить один спрайт из группы каждый раз, когда я нажимаю клавишу - (минус). Однако я смущен тем, как это сделать. Другая проблема, с которой я столкнулся, - это когда я нажимаю клавишу +, она добавляет одновременно несколько спрайтов. Я предполагаю, что мне нужно также проверить наличие KEYUP? У меня также есть ошибка, когда некоторые из спрайтов будут созданы поверх каждого и будут оставаться застрявшими, отскакивая друг от друга. Как я могу проверить существующие спрайты, где будет создано новое? Вот мой кодобнаружение столкновения спрайтов и удаление одного спрайта из группы в pygame

dragon.py

import pygame 
from pygame.locals import * 

class Dragon(pygame.sprite.Sprite): 
    def __init__(self, x,y, vx, vy): 
     super().__init__(); 
     self.image = pygame.image.load("images/dragon.png").convert() 
     self.image.set_colorkey(pygame.Color(255,0,255)) 
     self.rect = self.image.get_rect() 

     self.rect.x = x 
     self.rect.y = y 
     self.vx = vx 
     self.vy = vy 

    def draw(self, SCREEN): 
     SCREEN.blit(self.image, (self.rect.x, self.rect.y)) 

    def move(self, SCREEN): 
     r_collide = self.rect.x + self.image.get_width() + self.vx >= SCREEN.get_width() 
     l_collide = self.rect.x + self.vx <= 0 
     t_collide = self.rect.y + self.vy <= 0 
     b_collide = self.rect.y + self.image.get_height() + self.vy >= SCREEN.get_height() 

     # Check collision on right and left sides of screen 
     if l_collide or r_collide: 
      self.vx *= -1 

     # Check collision on top and bottom sides of screen 
     if t_collide or b_collide: 
      self.vy *= -1 

     self.rect.x += self.vx 
     self.rect.y += self.vy 

    def bounce(self, SCREEN): 
     self.vy *= -1 
     self.vx *= -1 

dragon_animation.py

import pygame 
import sys 
from random import * 
from pygame.locals import * 
from flying_dragon.dragon import Dragon 


def main(): 
    pygame.init() 

    FPS = 30 
    FPS_CLOCK = pygame.time.Clock() 

    ''' COLOR LIST ''' 
    WHITE = pygame.Color(255,255,255) 

    ''' create initial window ''' 
    window_size = (500, 500) 
    SCREEN = pygame.display.set_mode(window_size) 

    ''' set the title ''' 
    pygame.display.set_caption("Flying Dragons") 

    ''' fill background color in white ''' 
    SCREEN.fill(WHITE) 

    ''' group to store dragons ''' 
    dragons = pygame.sprite.Group() 

    d1 = Dragon(0,0,3,2) 
    d1.draw(SCREEN) 

    dragons.add(d1) 

    ''' main game loop ''' 
    while True: 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 

     SCREEN.fill(WHITE) 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_PLUS or pygame.K_KP_PLUS: 
       d = Dragon(randint(1, SCREEN.get_width() - dragon.rect.x), randint(1, SCREEN.get_height()- dragon.rect.y), randint(1, 5), randint(1, 5)) 
       dragons.add(d) 

     for dragon in dragons: 
      dragons.remove(dragon) 
      collisions = pygame.sprite.spritecollide(dragon, dragons, False) 
      dragons.add(dragon) 

      for dragon in collisions: 
       dragon.bounce(SCREEN) 

     for dragon in dragons: 
      dragon.move(SCREEN) 

     dragons.update(SCREEN) 
     dragons.draw(SCREEN) 

     pygame.display.update() 
     FPS_CLOCK.tick(FPS) 

if __name__ == "__main__": 
    main() 
+0

Какой дракон вы хотите удалить? Первый? Последний? Случайные? – xthestreams

+0

предпочтительно последний, который был добавлен, но это не имеет особого значения для этой конкретной проблемы –

ответ

1
if event.key == pygame.K_MINUS or pygame.K_KP_MINUS: 
    dragons.remove(dragons[0]) 

Должен работать для удаления спрайта. Спрайты не упорядочены в группе, поэтому просто удалите случайный.

Как другой указатель, вы должны посмотреть на переопределение функции Dragon.move() как dragon.update(), тогда вызов Group.update() переместит всех ваших драконов.

1

Вам не нужно нарисовать дракона сразу после его создания до цикла while. Достаточно провести ничью внутри цикла while.

Когда вы нажимаете клавишу, в списке событий будет удерживаться клавиша, которую вы удерживаете, и пока она не установлена, будет создан дракон. Поскольку цикл работает довольно быстро, несколько драконов будут созданы, прежде чем вы удалите палец с клавиатуры.

также хорошо делать

pygame.event.pump() 

перед for event in pygame.event.get(): так, что вы очистить список событий beofre при следующем запуске.

чтения about the pygame event pump here.

Используйте key = pygame.key.get_pressed() вместо event.get, как он будет читать нажатие клавиши РАЗ.

не может запустить ваш код из-за этой ошибки.

ImportError: No module named flying_dragon.dragon 

 Смежные вопросы

  • Нет связанных вопросов^_^