2013-09-18 5 views
1

Для загрузки кода следуйте link:Создание спрайтов отскакивают друг от друга

фон:

Так я шел через Pygame учебники, так как я новичок в этом, и я нашел Известный Эли Бендерски tutorial. Я проходил первую часть и пытался добавить к нему свой собственный талант, сделав его «Социальные кошки». Кошки бродят вокруг, и если они коснутся друг друга, они будут пастись друг с другом и идти своими разными путями. Другими словами, то же самое, что и у Эли, но с обнаружением столкновений и новыми спрайтами. Я полагаю, что это будет хорошей практикой. Я провел последние несколько дней, исследуя обнаружение столкновений и то, как это делают разные люди, но я еще не видел тот, который будет работать с моим сценарием или чем-то подобным. Я начинаю видеть, как небольшой общины я в

Цель:.

В конечном счете, я пытаюсь сделать так, когда кошка бежит в другой, тот, который столкнулся воли уйти в случайном направлении, равном 45 градусам меньше или больше, чем его текущее направление.

Проблема:

Я импортирования vec2d и у меня есть класс Cat и мой главный. Я хотел бы сделать обнаружение столкновений в основном, потому что позже я создам класс GameManager, который следит за тем, что происходит. Согласно ООП, кошки не должны знать друг о друге в любом случае. У меня возникли проблемы с обнаружением столкновения. Я пробовал пару разных способов. В обоих случаях ничего не происходит, когда они касаются друг друга. У меня создается впечатление, что я хочу сделать, это сложнее, чем то, как я это воспринимаю. Как я это завязываю? Мне кажется, что я потратил достаточно времени на этот аспект. Конечно, это процесс обучения. Мысли?

Способ 1:

mainWindow.fill(_white_) 
    for cat in cats: 
     cat.update(timePassed) 
     cat.blitme() 
     catsCollided = pg.sprite.spritecollide(cat, catGroup, True) 
     print pg.sprite.spritecollide(cat, catGroup, False) 

    for cat in catsCollided: 
     cat.currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45)) 

Способ 2:

mainWindow.fill(_white_) 
    for cat in cats: 
     cat.update(timePassed) 
     cat.blitme() 
     print pg.sprite.spritecollide(cat, catGroup, False) 


    tempCatList = list(cats) 
    for catA in cats: 
     tempCatList.remove(catA) 
     for catB in cats: 
      if catA.rect.colliderect(catB.rect): 
       cats[cats.index(catA)].currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45)) 
+0

Вы можете использовать 'Цвет (белый), если' _white_' является константой. Я думаю, проблема в том, что вы изменяете список тем. Вместо этого выполните 'для catA в котах [:]:' и измените 'catA' – ninMonkey

+0

Но почему это происходит, когда быстрее набирать« _white_' »? А как насчет первого пути? – Sighter

+0

Но если я это сделаю, мне придется снова проверить catA на столкновение, потратив время процессора. – Sighter

ответ

1

Ваш первый путь является правильным, но есть всего лишь несколько ошибок. Sprite collide - лучший способ сделать это. Прежде всего, существует очень мало обстоятельств, когда вы хотите, чтобы третий аргумент в sprite collide был истинным, и если я полностью не понимаю, как ваш код это делает, вы не хотите использовать True. Когда вы укажете True, он автоматически удалит оба спрайта при столкновении. Другое дело, что вы хотите, чтобы отфильтровывать собственные коллизии. В принципе, если спрайт управляет спрайтом, он сам регистрирует столкновение с самим собой. Одна из последних замечаний в отношении вашего кода заключается в том, что, хотя ваш выбор randint может работать (возможно, вы захотите проверить, что он возвращает), random.choice() будет лучше подходит для того, что вы ищете. Когда эти изменения реализованы, это выглядит примерно так:

mainWindow.fill(_white_) 
for cat in cats: 
    cat.update(timePassed) 
    cat.blitme() 
    catsCollided = pg.sprite.spritecollide(cat, catGroup, False) #False makes it so colliding sprites are not deleted 
    print pg.sprite.spritecollide(cat, catGroup, False) 

for cat in catsCollided:           #by the way although this is perfectly fine code, the repetition of the cat variable could be confusing 
    if cat != self:            #checks that this is not a self collision 
     cat.currentDirection.angle = random.choice([int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45]) 
Смежные вопросы