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.

Inputs e eventos :: GameDev receitas Panda3D

Inputs e eventos, são elementos comuns em desenvolvimento de software como um todo. Afinal todo, ou quase todo, software recebe uma ordem de execução, através de um clique, ou de um comando de teclado, e essa ordem vinda de um usuário, chamamos, popularmente, de Input de usuário.
Eventos são, em geral, comandos trocados entre elementos de um software. No caso de um jogo, podemos imaginar a seguinte situação: Um personagem está andando por um castelo, onde há um “gatilho” de uma armadilha. Quando o personagem, passa pelo gatilho, o gatilho avisa a armadilha para disparar as flechas que matarão o personagem.
Nessa pequena descrição, podemos dizer que o gatilho, enviou uma mensagem para a armadilha disparar. Essa mesagem é o que chamamos de eventos.

Ambos, Inputs de usuário, e eventos entre objetos, possuem um papel primordial para a construção de um jogo.

Inputs ———————

Vejamos como capturar um comando de usuário, no caso a tecla ‘W’ sendo pressionada:

exemplo 1:

Inputs, no Panda3D, são capturados como eventos. Sempre que uma tecla é pressionada, uma mensagem de evento é enviado pelo sistema, e basta que se diga ao sistema, que aquele evento em especial, te interessa.

Esse processo é feito em duas etapas:
1- Configurar o evento que te interessa: self.accept( ‘nome do evento’, nome da função)
2- Definir uma função para tratar o evento. Ou seja, o que esse evento deve fazer.

No exemplo acima, o evento gerado pela tecla ‘w’, deve ser capturado, e esse evento executa a função capturaTecla.

exemplo 2:

Neste segundo exemplo, observa-se duas novas possibilidades: Uso de parâmentros, e evento “up”.
O envio de parâmetros junto ao evento de tecla é útil em várias situações. Neste caso enviamos uma string (‘caminhar’), e um valor boleano.
Outra novidade, o evento “-up”, utiliza-se quando se deseja detetar quando uma tecla foi solta.
No exemplo, temos um esboço para quando o usuário pressionar a tecla ‘w’, o personagem começa andar, e quando a tecla ‘w’ é solta, o personagem deve parar o “andar”.

EVENTOS ————————-

Eventos como dito antes, são uma possibilidade de fazer com que objetos do software se comuniquem entre si, trocando mensagens.
Em geral, há dois passos para fazer com que objetos de um software possam se comunicar, é necessário: 1- Definir qual evento o objeto deve “ouvir”, e; 2- Programar o envio das mensagens. Esse processo e mais simples do que parece.

3.b.1 – Panda3D ——————-

No Panda3D, como visto anteriormente, Inputs de usuário geram eventos, que podemos detectar. Essa deteção, acontesse porque definimos os eventos aos quais o objeto deve “ouvir”.
Agora vejamos como enviar um evento personalizado (mensagem) através do sistema, e como detectá-lo.

exemplo 1:

Neste simples exemplo, ao pressionar a tecla ‘w’, inicia-se a execução da tarefa que fará o cubo se deslocar pela tela (movendo-se da esquerda para a direita). Quando o cubo ultrapassar o ponto 3, no eixo X, um evento é enviado pelo sistema (messenger.send( ” stopCubo “) ). Esse evento é capturado pelo programa, que executa a função stopCubo, onde a tarefa de deslocamento do cubo é interrompida.

mini-curso Inteligência Artificial :: Processing

Olá,

Esse post contém o conteúdo de aulas que ministrei no SESC Carmo/SP sobre código criativo e inteligência artificial, baseado nos texto de Daniel Shiffman.

Os vídeos estão em listas de reprodução do Youtube, que vc pode assistir aqui mesmo no blog.

Aula 1:

Aula 2:

Aula 3:

Aula 4:

Aula 5: