2013-01-16 23 views
0

看的方法,(她可能有点长):在此代码中使用约pygame.sprite.groupcollide

#Begin 
import pygame 
from pygame.locals import * 

global x, y, picPath 
x, y, picPath = 100, 100, 'C:\\Pic\\' 

class Ball(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(picPath + 'boll.png') 
     self.image.set_colorkey(0xffffff, 0) 
     self.rect = self.image.get_rect() 
    def update(self, pos): 
     screen.blit(self.image, pos) 

class Stone(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(picPath + 'stone.jpg') 
     self.rect = self.image.get_rect() 
     self.num = 0 
     self.up = 5 
    def update(self): 
     if(self.up != 370)and(self.num == 0): 
      self.up += 5 
     elif(self.up == 0)and(self.num == 1): 
      self.up += 5 
      self.num = 0 
     else: 
      self.up -= 5 
      self.num = 1 
     screen.blit(self.image, (305, self.up)) 

class GameStart: 
    def __init__(self): 
     self.life = 405 
     self.bg = pygame.image.load(picPath + 'bg.jpg') 
     self.lf = pygame.image.load(picPath + 'life.jpg') 
     player1 = pygame.sprite.Group() 
     player2 = pygame.sprite.Group() 
     self.cB = Ball() 
     self.cS = Stone() 
     player1.add(self.cB) 
     player2.add(self.cS) 
     self.collide = pygame.sprite.groupcollide(player1, player2, 1, 0) 
    def update(self):  
     if self.collide: 
      print 'Yoshi!' 
     screen.blit(self.bg, (0, 0)) 
     self.cB.update((x, y)) 
     self.cS.update() 
     screen.blit(self.lf, (150, self.life)) 

    def start(self): 
     # This is Start! 
     print 'Hello' 

pygame.init() 
screen = pygame.display.set_mode([700,460]) 
clock = pygame.time.Clock() 

game = GameStart() 
game.start() 

while True: 
    clock.tick(50) 

    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 

    pygame.display.update() 
    game.update() 

    kname = pygame.key.get_pressed() 
    if kname[pygame.K_LEFT]: 
     if x > 0: x = x - 5 
    elif kname[pygame.K_RIGHT]: 
     if x < 700: x = x + 5 
    elif kname[pygame.K_UP]: 
     if y > 0: y = y - 5 
    elif kname[pygame.K_DOWN]: 
     if y < 460: y = y + 5 
#End 

为什么她保持打印“耀西”?我只想打印一次,Ball和Stone的碰撞。 (我的英文很差)

+1

您没有检入'update'。 'colide'的价值是什么? 'groupcollide'返回一个字典,它仍然评估为true。 – ninMonkey

回答

0

groupcollide只运行一次。尝试移动groupcollideupdate

class GameStart: 
    def __init__(self): 
     self.life = 405 
     self.bg = pygame.image.load(picPath + 'bg.jpg') 
     self.lf = pygame.image.load(picPath + 'life.jpg') 
     self.player1 = pygame.sprite.Group() 
     self.player2 = pygame.sprite.Group() 
     self.cB = Ball() 
     self.cS = Stone() 
     self.player1.add(self.cB) 
     self.player2.add(self.cS) 
    def update(self):  
     if pygame.sprite.groupcollide(self.player1, self.player2, 1, 0): 
      print 'Yoshi!' 
     screen.blit(self.bg, (0, 0)) 
     self.cB.update((x, y)) 
     self.cS.update() 
     screen.blit(self.lf, (150, self.life)) 

此外,游戏逻辑被更新后的显示已经绘制。除非您因为某种原因需要这种行为,否则可以在主循环中最后一次调用pygame.display.update

game.update() 

kname = pygame.key.get_pressed() 
if kname[pygame.K_LEFT]: 
    if x > 0: x = x - 5 
elif kname[pygame.K_RIGHT]: 
    if x < 700: x = x + 5 
elif kname[pygame.K_UP]: 
    if y > 0: y = y - 5 
elif kname[pygame.K_DOWN]: 
    if y < 460: y = y + 5 

pygame.display.update() 
+0

谢谢!但为什么'球'和'石头'碰撞没有反应? – huyuanqi

+0

我不确定。它打印过“Yoshi!”吗?尝试'groupcollide'没有杀死精灵参数:'pygame.sprite.groupcollide(self.player1,self.player2)'。 – Devourant

+0

已解决,谢谢 – huyuanqi