Tarefas :: Gamedev receitas Panda3D

Bem, “Tarefas” (Tasks), é uma nomenclatura usada no Panda3D, que se refere: “A necessidade de prover a certos objetos de jogo, loops de execução.”
Por exemplo, ao se criar um personagem em um jogo, a programação desse personagem pode ter uma série de funções que devem ser checadas, e executadas, a cada frame do jogo.

Diferentes game engines, possuem diferentes nomenclaturas, e formas de se implementar esses procedimentos. Aqui veremos como funciona no Panda3D.

exemplo 1:

[code lang=”python”]
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.taskMgr.add(self.funcaoDeTarefa, “Tarefa de teste”)

def funcaoDeTarefa(self, task):
print “Essa funcao e executada uma vez a cada frame do jogo. “, task.time
return Task.cont

app = MyApp()
app.run()
[/code]

No Panda3D a construção de uma Task, é muito simples.
Na linha: self.taskMgr.add(self.funcaoDeTarefa, “Tarefa de teste”), é feito o registro de uma função que será executada a cada frame, e essa task é batizada com o nome “Tarefa de teste”.
Podemos definir as funções que queremos registrar como tarefa, e dar os nomes que acharmos mais adequados.
A função para tarefa, do exemplo, possui um parâmetro obrigatório, “task”, e um valor de retorno, igualmente obrigatório, que é uma das constantes do objeto Task, no caso, Task.cont.

exemplo 2:

[code lang=”python”]
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.taskMgr.add(self.funcaoDeTarefa, “Tarefa de teste”)
self.cubo = self.loader.loadModel(“box”);
self.cubo.reparentTo(self.render)
self.cubo.setScale(1)
self.cubo.setPos(-3,10,-2)

def funcaoDeTarefa(self, task):
print “Essa funcao e executada uma vez a cada frame do jogo. “, task.time
self.cubo.setX(self.cubo.getX()+0.01)
return Task.cont

app = MyApp()
app.run()
[/code]

Neste segundo exemplo, é possível observar que com uma tarefa, podemos, por exemplo, modificar o posicionamento de um objeto de jogo. Neste caso, na inicialização do jogo, posicionamos um cubo na coordenada x: -3, y:10, e z:-2. Na tarefa, o que fazemos é modificar a posição x do cubo, em 0.01 a cada frame, de forma que temos a ilusão do cubo andar para a direita.

No Panda3D é possível manipular as tarefas de forma a criar alguns comportamentos “customizados” de tarefas, como por exemplo, parar a tarefa, fazê-la executar depois de um certo tempo, etc.

exemplo 3:

[code lang=”python”]
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

class MyApp(ShowBase):

def __init__(self):
ShowBase.__init__(self)
self.taskMgr.add(self.funcaoDeTarefa, “Tarefa de teste”)
self.cubo = self.loader.loadModel(“box”);
self.cubo.reparentTo(self.render)
self.cubo.setScale(1)
self.cubo.setPos(-3,10,-2)

def funcaoDeTarefa(self, task):
print “Essa funcao e executada uma vez a cada frame do jogo. “, task.time
self.cubo.setX(self.cubo.getX()+0.01)
if self.cubo.getX() < 3:
return Task.cont
else:
return Task.done

app = MyApp()
app.run()
[/code]

Neste exemplo, o valor de retorno será Task.cont (“Tarefa.continuar”) enquanto a posição x do cubo seja menor que 3. Quando o cudo passar a posição 3, o valor de retorno será Task.done (“tarefa.concluída”), e a tarefa não mais será realizada.

exemplo 4:
[code lang=”python”]
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

class MyApp(ShowBase):

def __init__(self):
ShowBase.__init__(self)
self.taskMgr.doMethodLater(2, self.funcaoDeTarefa, “Tarefa de teste”)
self.cubo = self.loader.loadModel(“box”);
self.cubo.reparentTo(self.render)
self.cubo.setScale(1)
self.cubo.setPos(-3,10,-2)

def funcaoDeTarefa(self, task):
print “Delay: “, task.delayTime
print “Frame: “, task.frame
print “Essa funcao e executada uma vez a cada frame do jogo. “, task.time
task.delayTime += 1
self.cubo.setX(self.cubo.getX()+0.5)
if self.cubo.getX() < 3:
return Task.again
else:
return Task.done

app = MyApp()
app.run()
[/code]

Neste último exemplo, pode-se ver que o cubo se desloca com intervalos de dois em dois segundos. Isso por que nesse exemplo, está sendo usado o método doMethodLater, onde é definido um tempo de 2 segundos para inicializar a tarefa. E quando a tarefa é executada, define-se um tempo de atraso (task.delayTime) para a próxima execução da tarefa.

No Panda3D, as tarefas são extremamente úteis em vários momentos, e para várias finalidade dentro de um jogo.

Conclusão —————————–

Comparando-se as duas engines, vemos que ambas tratam o mesmo tópico de maneiras distintas, e com particularidades, onde para se chegar aos mesmo objetivos, tem-se que contruir lógicas de maneiras diversas.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *