2013-04-29 4 views
0

Я невероятно застрял, я использую Python и Pygame для создания игрового проекта. (экран 770 x 485) Он включает перемещение круга влево или вправо по 5 вертикальным дорожкам, когда выпадающие случайно сгенерированные прямоугольники. У меня есть класс Wall для генерации их случайным образом, но я не знаю, как обнаружить столкновение между EACH экземпляром прямоугольника и моего круга.Python, Pygame List Conundrum

Прямо в бит с z и списком c, где я пытаюсь заставить их сталкиваться, но он сталкивается только с первым прямоугольником и не обнаруживает никаких других падающих прямоугольников (которые генерируются после периода 100 тики между собой) Может ли кто-нибудь указать мне в правильном направлении? Я действительно не уверен в переменной z, c списке и переменной v: \

Заранее спасибо!

class Wall: 
    def __init__(self,colour,x,y,life): 
     self.colour = colour 
     self.x = x 
     self.y = y 
     self.life = life 
    def drop(self): 
     pygame.draw.rect(screen, self.colour, (self.x, self.y, 154, 30)) 
     self.y += 1.25 
     self.life -= 1 
     if self.life < 0: 
      wall.remove(self) 

def playMode(): #assume everything is indented properly 
global wall, points 
check = True 
left = False 
right = False 
circlex = 385 
degrees = 0 
health = 3 
wall = [] 
x = 2 
points = 0 
n = 0 
c = [] 
starttime = time.time() 
while True: 
    runningtime = time.clock() 
    screen.fill((255,255,255)) 
    x -= 1 
    if x == 1: 
     wall.append(Wall((random.randint(1,255),random.randint(1,255),random.randint(1,255)), 
random.choice([0, 154, 308, 462, 616]), -30 , 450)) 
     x = 100 
    for i in wall: 
     i.drop() 
    z = wall[-1] 
    c.append(z) 
    v = c[(n)] 
    if 445 >= v.y >= 340 and v.x == (circlex - 77):   
     health -= 1 
     points -= 5 
     v.y = 485 #moves this instance offscreen so it doesn't make the hp go to 0 immediately 
     n += 1 
     print v.y 

    circle = pygame.draw.circle(screen, colour,(circlex, 409), 50) 

    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       showPauseScreen() 
      elif event.key == K_p: 
       showPauseScreen() 
      elif event.key == K_LEFT: 
       if circlex > 77: 
        circlex = circlex - 154 
      elif event.key == K_RIGHT: 
       if circlex < 616: 
        circlex = circlex + 154 
     elif event.type == QUIT: 
      terminate() 

    if health == 0: 
     check = False 
     return #goes to gameover screen basically 
    pygame.display.update() 
    clock.tick(100) 
+1

Пожалуйста, форматировать код в соответствии с конвенциями вещий, прежде чем мы можем вам помочь. – 2013-04-29 07:20:04

+1

, мы не можем вам помочь, если вы не отступали правильно, с первого взгляда, но вы проверяете столкновение на одном объекте на одном объекте - z [-1]. –

+1

Pygame построил в обнаружении столкновения (для прямоугольников). Взгляните на этот вопрос, чтобы понять, как его использовать: http://stackoverflow.com/questions/16227616/how-to-use-sprite-collide-in-pygame –

ответ

1

Вы можете просто посмотреть на Pygame документации, но в основном вы хотите использовать эту функцию, которая будет возвращать логическое значение, действительно ли один спрайта сталкиваясь с другим:

pygame.sprite.spritecollide(<sprite>,<group>,False)  #in almost all circumstances the third argument should be False. This will check for collision between a sprite and group. 

Для получения более подробной информации проверьте Pygame документы:

http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollide