2016-04-29 20 views
0

- (マイナス)キーを押すたびに1つのスプライトをグループから削除する必要があります。しかし、私はそれを行う方法について混乱しています。私が実行した別の問題は、+キーを押して複数のスプライトを同時に追加しているときです。 KEYUPもチェックする必要があると思いますか?私はまた、スプライトのいくつかがそれぞれの上に作成され、お互いにバウンスし続けるバグがあります。新しいものが生成される既存のスプライトを確認するにはどうすればよいですか?ここに私のコードがあるスプライト衝突検出とパイゲームのグループから1つのスプライトを削除する

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

どのドラゴンを削除しますか?最初の1つ?最後の一つ?ランダム? – 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ループ内の描画で十分です。

キーを押すと、イベントリストには押さえているキーが保持されます。このキーが押されている限り、ドラゴンが作成されます。ループがかなり速く動くので、キーボードから指を離す前にいくつかのドラゴンが作成されます。

も良いので、あなたが次の実行beofreイベントリストをクリアすること for event in pygame.event.get():

pygame.event.pump() 

を行います。それはONCEキーを押して読み込みますよう

ではなくevent.getの使用key = pygame.key.get_pressed()about the pygame event pump here.

をお読みください。

このエラーが原因でコードを実行できません。

ImportError: No module named flying_dragon.dragon