вторник, 14 апреля 2015 г.

Скучно...

Делать нечего, комп далеко, со скуки накатал  с планшета на чистом Питоне прототип эмитера частиц. Эдакий сферический эмитер в вакууме... Понятно, что все сырое и к практическому применению не готовое. Однако для ознакомительных целей сгодится.







import copy

class partycle(object):
    """
    определение объекта- частицы
    """
    def __init__(self, position, vector, partLife):
        """
        position - [x, y, z] a list of three numbers of type float
        partLife - int
        """
        self.position = position # координата частицы
        self.vector = vector # вектор движения частицы
        self.partLife = partLife # максимальное время жизни частицы
        self.timeLife = 0 # текущее время жизни частицы
     
    def endLife(self):
        """
        функция возвращает True если текущее время жизни частицы больше максимального
        """
        if self.timeLife > self.partLife:
            return True
         
    def move(self):
        """
        функция изменяет позицию частицы согласно вектору движения и увеличивает
        текущее время жизни на 1
        """
        self.timeLife = self.timeLife + 1
        # а это я так поленился расписывать прибавление направления к позиции по осям
        for i in range(0, 3):
            self.position[i] = (self.position[i] + self.vector[i])
 

class emiter():
    """
    собственно определение объекта - эмитера частиц
    """
    def __init__(self, position, vector, time, partLife, partNumber):
        """
        position - [x, y, z], a list of tree numbers of type float
        vector - [x, y, z], a list of tree numbers of type float
        time - int
        partLife - int
        partNumber - int
        """
        self.__position__ = position  # координата
        self.vector = vector  # вектор движения частиц
        self.time = time  # максимальное время эмиссии частиц
        self.partLife = partLife  # максимальное время жизни частиц
        self.partNumber = partNumber  # число частиц, добавляемых в единицу времени
        self.partList = []  # список созданных частиц
        self.emitTime = 0  # текущее время эмиссии частиц
     
    def emit(self):
        """
        функция создает и добавляет частицы в список частиц эмитера
        """
        # если текущее время эмиссии не превышает максимальное время эмиссии
        if self.emitTime < self.time:
            # то добавляем в список частиц эмитера новые частицы
            for i in range(0, self.partNumber):
                # списки копируем с помощью copy.copy(), иначе мы просто передадим
                # частице ссылку на свойство родителя, что приведет к нехорошим
                # последствиям
                pos = copy.copy(self.__position__)
                vect = copy.copy(self.vector)
                partLife = self.partLife
                # собственно создание экземпляра частицы          
                part = partycle(pos, vect, partLife)
                # добавляем свежесозданную частицу в список частиц эмитера
                self.partList.append(part)
            # добавляем к текущему времени эмиссии 1
            self.emitTime = self.emitTime + 1
 
    def clean(self):
        """
        функция пересобирает список частиц эмитера из частиц, которые
        еще не всё
        """
     
        tempList = [part for part in self.partList if not part.endLife()]
        # попытка избежать геморроя с копированием списка
        self.partList = list(tempList)
     
             
    def movePart(self):
        """
        функция вызывает движение частиц
        """
        for part in self.partList:
            part.move()
         
               
    def update(self):
        """
        функция обновляет состояние эмитера и его частиц
        """
             
        self.emit()  # выпускаем частицы
     
        self.movePart()  # задаем движение частицам
         
        self.clean()  # чистим список частиц от всякого старья
     
        self.pr()   # выводим в консоль результаты, полюбоваться
   
         
    def pr(self):
        """
        обычно нафиг не нужная функция, выводит отладочную информацию
        """
        print('emiter    ', self.__position__, self.vector, self.emitTime)
        for part in self.partList:
            print('partycle  ', part.position, part.timeLife)



if __name__ == '__main__':
    pos = [0.0, 0.0, 0.0]
    vect = [0.0, 1.0, 0.0]
    time = 8
    partLife = 4
    partNumber = 3
    # создаем экземпляр эмитера
    x = emiter(pos, vect, time, partLife, partNumber)
    # это я так имитировал работу bge, типа запуск каждый тик
    for ind in range(0, time + (partLife * 2)):
        x.update()

Комментариев нет:

Отправить комментарий