#python-3.x #collision-detection
#python-3.x #обнаружение столкновений
Вопрос:
Я работаю над игрой типа space invaders, и она работает таким образом, что для убийства захватчика требуется одно попадание пули. Что я пытаюсь сделать сейчас, так это изменить его так, чтобы для уничтожения захватчика требовалось три попадания пули.
Мой текущий код находится здесь: https://github.com/clipovich/alien_invasion.git
Если вы запустите код, как указано, игра отлично работает, чтобы убить инопланетянина одним попаданием пули.
Начиная с рабочей одиночной пули для уничтожения игры, вот что я изменил: (примечание: вы можете воспроизвести мои изменения, просто раскомментировав строки 66 и 67 в alien_invasion.py досье.
# if self.aliens.settings.alien_hit_limit >= 0:
# self.aliens.remove()
В settings.py файл, который я создал
self.alien_hit_limit = 3
В alien_invasion.py файл, который я добавил:
if self.aliens.settings.alien_hit_limit >= 0:
self.aliens.remove()
Для
def _check_bullet_alien_collisions(self):
и теперь я получаю следующее сообщение об ошибке:
~/py/alien_invasion $ python3.8 alien_invasion.py pygame 1.9.6 Привет от сообщества pygame. https://www.pygame.org/contribute.html Трассировка (последний последний вызов): Файл «alien_invasion.py «, строка 210, в файле ai.run_game() «alien_invasion.py «, строка 42, в файле run_game self._update_bullets() «alien_invasion.py «, строка 57, в файле _update_bullets self._check_bullet_alien_collisions() «alien_invasion.py «, строка 66в _check_bullet_alien_collisions, если self.aliens.settings.alien_hit_limit> = 0: AttributeError: объект ‘Group’ не имеет атрибута ‘settings’
Я думаю, что моя проблема может заключаться в том, что я пытаюсь выполнять действия с отдельными инопланетянами, но использую групповой метод. Хотя я не уверен.
Когда исправлено, конечным результатом будет то, что инопланетянин исчезнет после трех ударов, а не один раз.
Что мне нужно сделать, чтобы исправить код?
Ответ №1:
Вы получаете доступ к настройкам из подмодуля «Group» из модуля pygame. Но вы пытаетесь получить доступ к атрибуту из класса «Настройки» из settings.py досье. Поэтому, если вы хотите получить доступ к атрибуту «alien_hit_limit» из объекта «настройки», вы должны использовать «если self.settings.alien_hit_limit> = 0:» вместо «если self.aliens.settings.alien_hit_limit> = 0:» в строке 66, чтобы устранить указанную вами ошибку.
Комментарии:
1. Вы запустили код? Если да, сработало ли это для вас? Когда я внес изменения, которые вы рекомендовали, инопланетян все еще убивали одним ударом. Затем я изменил второе значение True на False, чтобы предотвратить убийства одним ударом, но теперь мои инопланетяне бессмертны.
2. Я также думаю, что мне нужно улучшить код, который отслеживает, сколько раз был поражен инопланетянин.
3. Я изменился на следующее, но мои инопланетяне по-прежнему непобедимы: я изменился на следующее, но мои инопланетяне по-прежнему непобедимы.
collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, False) if collisions: for alien in collisions.values(): self.settings.alien_hit_limit -= 1 for alien in collisions.values(): if self.settings.alien_hit_limit <= 0: self.aliens.remove()
4. @chadrick Я справился с тем, чего вы пытались достичь. Я опишу это в разделе ответов ниже.
5. Большое вам спасибо! Вы потратили много времени на это, чтобы заставить его работать. Готовая проблема очень ценится!
Ответ №2:
Прежде всего, это бесполезно для того, чтобы иметь alien_hit_limit в качестве глобального атрибута. Скорее вы должны назначить hit_point для каждого чужого в alien.py файл:
Затем вы должны изменить _check_bullet_alien_collisions()
метод:
pygame.sprite.groupcollide
Метод возвращает список столкнувшихся объектов из группы, которую вы указали первой в функции. (self.aliens). Таким образом, он вернет список инопланетян, в которых попала пуля (в этом случае возвращается только один инопланетянин, пораженный пулей). Таким образом, вы уменьшаете его хитпоинт, когда это происходит, и проверяете, уменьшились ли хитпоинты до нуля; в этом случае удалите этого чужого из списка чужих. Кстати, третий параметр pygame.sprite.groupcollide
метода указывает, должен ли объект из первой группы (в данном случае self.aliens) быть уничтожен, а четвертый параметр указывает, должен ли объект из второй группы (в данном случае self.bullets) быть уничтожен. Таким образом, мы не уничтожаем чужой правильный путь, поэтому устанавливаем третий параметр false, но мы хотим, чтобы пуля была уничтожена; поэтому мы устанавливаем четвертому параметру значение true.