2016-04-29 255 views
0

所以我需要每次按下 - (减号)键时从组中删除一个sprite。但是,我很困惑如何去做。我遇到的另一个问题是当我按+键时,它一次添加多个精灵。我猜我还需要检查KEYUP?我也有一个bug,其中一些精灵将会在每个精灵的顶部创建,并且会一直停留在彼此之间。我如何检查现有的精灵将在哪里生成?这里是我的代码sprite碰撞检测并从pygame中的组中删除一个sprite

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