2017-03-23 8 views
0

私はここで別の質問をする前に、私はすでにそれをチェックしました。それは悲しいことに私を助けませんでした。 Soz私はパイゲームでゲームを始めました。ゆるやかに動画とフォローして、弾丸と暴徒の衝突をチェックするのにgroupcollideを使用しようとしましたが、何らかの理由で暴動が消えたり検出されなかったりします。助けて?グループの衝突がPythonでうまくいかない

あなたが持っている弾丸出現する場合:

bullets.add(bullets)を私はあなたのイメージを持っていないので、私は本当に、あなたのコードをテストすることはできませんが、私は問題を参照してくださいだと思う

import pygame, random, os 

width = 400 
height = 600 
fps = 60 

# usefule images 
rocket_img = pygame.image.load("rocket_ship.png") 
astroid_img = pygame.image.load("astroid.png") 
nebulous = pygame.image.load("nebulous.jpg") 

# usefull colors RGB 
black = (0, 0, 0) 
white = (255, 255, 255) 
green = (0, 255, 0) 
red = (255, 0, 0) 
yellow = (255, 255, 0) 

class Player(pygame.sprite.Sprite): 
    # player 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = rocket_img 
     self.image.set_colorkey(black) 
     self.rect = self.image.get_rect() 
     self.rect.center = (width/2, height - 80) 
     self.speedx = 0 
    def update(self): 
     self.speedx = 0 
     keystate = pygame.key.get_pressed() 
     if keystate[pygame.K_LEFT]: 
      self.speedx = -5 
     if keystate[pygame.K_RIGHT]: 
      self.speedx = 5 
     self.rect.x += self.speedx 
     if self.rect.right > width: 
      self.rect.right = width 
     elif self.rect.left < 0: 
      self.rect.left = 0 
    def shoot(self): 
     bullet = Bullets(self.rect.centerx, self.rect.top) 
     all_sprites.add(bullet) 
     bullets.add(bullets) 

class Mob(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((30, 50)) 
     self.image.fill(red) 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randrange(width - self.rect.width) 
     self.rect.y = random.randrange(-100, -40) 
     self.speedy = random.randrange(1, 8) 
     self.speedx = random.randrange(-3, 3) 
    def update(self): 
     self.rect.x += self.speedx 
     self.rect.y += self.speedy 
     if self.rect.top > height +10 or self.rect.left < -25 or self.rect.right > width + 20: 
      self.rect.x = random.randrange(width -self.rect.width) 
      self.rect.y = random.randrange(-100, -40) 
      self.speedy = random.randrange(1, 8) 

class Bullets(pygame.sprite.Sprite): 
    def __init__(self, x , y): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((10, 20)) 
     self.image.fill(yellow) 
     self.rect = self.image.get_rect() 
     self.rect.bottom = y 
     self.rect.centerx = x 
     self.speedy = -10 
    def update(self): 
     self.rect.y += self.speedy 
     if self.rect.bottom < 0: 
      self.kill() 

# starts our pygame 
pygame.init() 
pygame.mixer.init() 
screen = pygame.display.set_mode((width, height)) # things to run the game 
pygame.display.set_caption("PyGame Shmup!") 
clock = pygame.time.Clock() 


all_sprites = pygame.sprite.Group() 
bullets = pygame.sprite.Group() 
mobs = pygame.sprite.Group() 
player = Player() 
all_sprites.add(player) 
for i in range(8): 
    m = Mob() 
    all_sprites.add(m) 
    mobs.add(m) 


running = True 
while running: 

    clock.tick(fps) 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_SPACE: 
       player.shoot() 

    # update 
    all_sprites.update() 

    # check or collisions 
    hits = pygame.sprite.groupcollide(mobs, bullets, True, True) 
    if hits: 
     pygame.quit() 

    for hits in hits: 
     m = Mob() 
     all_sprites.add(m) 
     mobs.add(m) 
    hits = pygame.sprite.spritecollide(player, mobs, False) 
    if hits: 
     running = False 
     pygame.quit() 

    # render 
    screen.blit(nebulous, (0, 0)) 
    all_sprites.draw(screen) 
    pygame.display.flip() 

pygame.quit() 

答えて

1

bulletsは、グループbulletは、今作成したばかりのショットです。私はあなたが意味を考える:

bullets.add(bullet)

私もここでは2つの問題を参照してください。

hits = pygame.sprite.groupcollide(mobs, bullets, True, True) 
if hits: 
    pygame.quit() 

for hits in hits: 
    m = Mob() 
    all_sprites.add(m) 
    mobs.add(m) 

hitsは衝突のあなたのリストになります。まず、hitsが空でない場合、ゲームを終了すると言っています。弾丸が暴徒に当たったら、ゲームをやめてもらいたいですか?

次に、for hits in hitsは意味がありません。私はfor hit in hitsを意味していて、ヒットリストをループして、それぞれをhitと呼んでいると思います。

+0

あなたの助けていただきありがとうございます、私はパイゲームに新しいと本当にそれを学びたい。私はテストのためだけにそれをやめて、それを削除することを忘れました。はい、私はいつも事故の末尾に常に「s」をつけています。「ヒットしたらヒットする」と言います。あなたの素晴らしい助けをありがとう! –