@val_gr
Студент, программирую на Python и C# (Xamarin)

Как выполнить действие при столкновении игрока с объектом только один раз?

Написал функцию обработки столкновения игрока с объектом, используя модуль pygame:

def collide(self, xvel, yvel, plantlist): #Проверяет столкновение игрока с растениями
		
		for sprite in plantlist:
			if collide_rect(self, sprite):
				if isinstance(sprite, sunPlants):						
						print("sun")

				if isinstance(sprite, shadowPlants):
						print("shadow")

				if isinstance(sprite, waterPlants):
						print("water")


Но есть проблема. Функция выполняет нужное условие бесконечно, пока игрок не отойдёт от объекта. А мне нужно, чтобы оно (условие) выполнилась только один раз и в следующий раз, только после того как игрок вновь "столкнётся" с объектом. Пробовал много вариантов, например с логическими переменными, но так и нашёл решения. Заранее спасибо за помощь всем откликнувшимся.

Полный исходный код игры можно найти на GitHub.
  • Вопрос задан
  • 672 просмотра
Пригласить эксперта
Ответы на вопрос 3
tregor
@tregor
Middle PHP Backend developer
Без варианта - используй переменную флажок!
Грубый алгоритм:
ЕСЛИ коллизия_есть ТО
    ЕСЛИ переменная == false ТО
        переменная = true
        и тут какие то действия
ИНАЧЕ
    переменная = false
Ответ написан
@alihang
Используй переменную ключ со значениями true/false
Ответ написан
Если игрок имеет возможность пересекаться с несколькими объектами имеет смысл сохранить объекты в списке и тогда можно будет точно определить когда игрок начал взаимодействие с каким либо обьектом

class Player(object):
    def __init__(self):
        self.colliders = list()

    def collide(self, xvel, yvel,  plantlist):
        for plant in plantlist:
            collide = collide_rect(self, plant)
            if collide and plant in self.colliders:
                # Выполняется каждый раз пока игрок пересечен с растением
                pass
            if collide and not plant in self.colliders:
                self.colliders.append(plant)
                # Выполняется только один раз при пересечении с растением
            if not collide and plant in self.colliders:
                self.colliders.remove(plant)
                # Выполняется только один раз когда игрок перестает пересекаться с растением
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы