Главная » Статьи » Учебник: теория

Менеджер задач Panda3D
Что такое менеджер задач и для чего он нужен? Предположим,что в Вашу игру нужно добавить какую-нибудь функцию,которая будет выполняться постоянно,например искусственный интеллект врагов или проверку столкновений.Менеджер задач Panda3D позволяет добавлять эти функции для постоянного выполнения или же удалять их.Функция,которая добавляется в менеджер задач называется задачей или заданием(Task).Она должна обязательно иметь в описании параметр task и возвращать одно из ниже перечисленных значений:
Task.done - функция выполнилась и удаляется из списка задач.
Task.cont - функция выполнилась и она передаёт управление скриптом следующей по списку функции,но при этом сама она из списка НЕ УДАЛЯЕТСЯ
Task.again - повторяет функцию с той же самой задержкой,что и при вызове.
None - тоже самое,что и Task.done

Для добавления или удаления функции в список задач используется глобальный объект taskMgr и его методы add и remove.
Параметр task,который функция для выполнения требует по умолчанию,имеет следующие свойства:
task.time Дробное число,характеризующее прошедшее время с первого запуска этой функции(в секундах);
task.frame Целое число,характеризующее количество кадров,прошедших с момента добавления функции.Может иметь значение 0 или 1;
task.id Целое число,обозначающее уникальный идентификатор задания,присвоенным ему менеджером задач;
task.name Имя задания,присвоенное этой функции.

Для импорта модуля менеджера задач необходима строка
from direct.task import Task

Простейший способ добавления функции:

def MyFunc(task):
   mysphere.setH(task.time) #Вращаем сферу в зависимости от прошедшего времени
   return Task.cont #продолжаем выполнение скрипта

taskMgr.add(MyFunc,'My function')


При желании мы можем её удалить так:
taskMgr.remove('My function')

При добавлении функции также можно указывать кортеж extraArgs[a,b,c,..], в котором указываются дополнительные параметры,передаваемые функции и предусмотренные пользователем.Например:

def AI(task,obj):
   if obj.lifes<=0: #Если у обрабатываемого объекта закончились жизни,
     obj.death() #то он умирает
     return Task.done #и обработка его состояния убирается из списка задач
   return Task.cont #продолжаем выполнение скрипта(если до этого функция не возвращала никакого значения)

taskMgr.add(AI,'AI',extraArgs=[player])

Также Panda3D позволяет добавлять задания,которые выполняются с задержкой после рендера кадра, но об этом позже...



Источник: http://panda3d.org/wiki/index.php/Tasks
Категория: Учебник: теория | Добавил: dpsstudio (28.01.2009) | Автор: Дмитрий Панченко
Просмотров: 4914 | Комментарии: 5 | Рейтинг: 5.0/1
Всего комментариев: 5
-1
1 MasterOfInsanity   [Материал]
очень полезная штука, буду учится её применять cool

0
2 drigromanlol   [Материал]
https://paste2.org/txfP1xxC

выводит такое сообщение: 
Traceback (most recent call last):                                                                 
  File "task.py", line 9, in <module>                                                              
    func = taskMgr.add(exampleTask, 'MyTaskName')                                                  
NameError: name 'taskMgr' is not defined           

Почему так происходит? Почему выдает ошибку над именем taskMgr?

1
3 serg-kkz   [Материал]
Вообще то есть форум для обсуждения. Смысла ссылками кидаться в комментариях не вижу. Проблема в том что здесь код основан на старом способе инициализации движка. То есть через DirectStart который автоматически создает нужные и не нужные smile  ссылки.

Старый способ, можно забыть:

Код
import direct.directbase.DirectStart
from direct.task import Task

def exampleTask(task):
        if task.time < 2.0:
            return task.cont
        print('Done')
        return task.done
            
func = taskMgr.add(exampleTask, 'MyTaskName')

base.run()


Новый способ, рекомендованный.

Код
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

class MyApp(ShowBase):

        def __init__(self):
            ShowBase.__init__(self)

            func = taskMgr.add(self.exampleTask, 'MyTaskName')

        def exampleTask(self, task):
            if task.time < 2.0:
                return task.cont
            print('Done')
            return task.done

app = MyApp()
app.run()

0
4 drigromanlol   [Материал]
Извиняюсь, а где можно именно обсудить эту тему? Сделать новую тему или есть старая? За новый способ спасибо. Понял что не видит глобальную переменную. =)

1
5 serg-kkz   [Материал]
Если подробней по проблеме, http://panda3d.org.ru/publ/showbase_directstart/1-1-0-54
Создавать вы можете здесь: Общие вопросы или Для начинающих, воскрешать старые темы даже если они есть нету смысла. Все устарело.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0