Делать нечего, комп далеко, со скуки накатал с планшета на чистом Питоне прототип эмитера частиц. Эдакий сферический эмитер в вакууме... Понятно, что все сырое и к практическому применению не готовое. Однако для ознакомительных целей сгодится.
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()
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()
Комментариев нет:
Отправить комментарий