Início > Dicas, Funções Python, Tutoriais > Acessando objetos via python (hierarquia no game engine)

Acessando objetos via python (hierarquia no game engine)

Requisitos: Conhecimento mínimo em programação python para Game Engine.

Uma dúvida que deixa de cabelos brancos a todos os iniciantes no python para o Game Engine, é como acessar objetos via programação. Neste artigo, vou ensinar o conceito básico sobre a hierarquia usada nos jogos do Blender.

Observe a figura abaixo:

Na verdade este diagrama está bem simplificado, pois existem outros itens que podemos incluir na hierarquia, mas vamos tomá-lo como um padrão.
Para que se consiga atingir o destino desejado, será necessário percorrer a hierarquia. Você pode fazer esse percurso tanto do nível mais alto para o mais baixo como também o inverso. Então podemos dividir a programação python em dois tipos: Crescente e Decrescente.

Programação Crescente

Esta é o tipo de programação mais usado. Ele vai subindo o diagrama até chegar no ponto mais alto possível.
A primeira coisa que precisa saber e que todo script python do game engine está ligado a um Controlador. O script python é a parte mais baixa da hierarquia.

Vejamos este LogicBrick:

Neste exemplo existe um controlador do tipo python, dois sensores(CaixaEntrada e Teclado) e dois atuadores(AdicionarJogador e Mensageiro). Todos estão nomeados devidamente. Lembrando que é muito importante nomear os seus logicbricks para que fique mais fácil de localizar via programação.

Vamos imaginar que queremos buscar o Atuador AdicionarJogador para trabalhar com ele. Pelo nosso diagrama, o caminho seria este: Script Python -> Controlador – > Atuador.

Vamos implantar isso em Python Script:

#importando o módulo GameLogic. Este é o módulo mais importante
#do game engine. Em nosso diagrama principal ele não está
#ligado a nada, mas todos os componentes de jogo de alguma forma
#estão ligados a ele.

import GameLogic
#Como todo script começa na fonte mais baixa (Script Python)
#e como também já estamos nesta fonte. Teremos que buscar
#o próximo degrau da hierarquia: o Controlador
#A função getCurrentController() busca o controlador que
#executou o script

controlador = GameLogic.getCurrentController()
#Agora que já temos nosso controlador, temos que buscar
#nosso atuador através da função getActuator(“nome_do_atuador”)

atuador = controlador.getActuator("AdicionarJogador")

Prontinho, já temos nosso atuador armazenado em uma variável de igual nome (atuador). Agora você já pode trabalhar ela usando suas funções e procedimentos (temas para um próximo artigo).

Mas agora, se desse mesmo logicbricks, quisermos buscar o sensor teclado? Como ficaria nosso código? Pelo nosso diagrama, o caminho seria este: Python -> Controlador – > Sensor.

Então o código ficaria assim:

import GameLogic
controlador = GameLogic.getCurrentController()
#Agora que já temos nosso controlador, temos que buscar
#nosso sensor através da função getSensor(“nome_do_sensor”)

sensor = controlador.getSensor("Teclado")

Já vimos com acessar os sensores e atuadores, agora vamos acessar o objeto que executou o script: Script Python -> Controlador – > Objeto.

import GameLogic
controlador = GameLogic.getCurrentController()
#vamos buscar o objeto ao qual pertence o controlador
#que executou
#o script pela função getOwner()

proprietario = controlador.getOwner()

Prontinho, temos o objeto armazenado na variável proprietário. No game engine, costumamos chamar o objeto que executou o script de proprietário, porque ele é dono de todos os controladores, sensores e atuadores que estão ligados a ele.

Como podemos ver, conseguimos alcançar todas as instancias “possíveis” usando o método de programação Crescente.


Programação Decrescente

A programação decrescente, embora menos comum, é usada em projetos em que objetos têm que interagir entre eles. Ela permite que script que esteja sendo executado em um objeto A possa acessar um objeto B.
Como exemplo, vamos imaginar que se tenha três objetos em cena, nos quais você devidamente os re-nomeou como: bola, quadrado e triangulo. Existe um script no objeto bola que você deseja que acesse o objeto quadrado. Para isso teremos que começar de cima para baixo, de acordo com o nosso diagrama: Cena – > Objeto.
O script Python para acessar o objeto quadrado ficaria assim:

import GameLogic
#Buscando a cena que esta sendo executada no jogo
cena = GameLogic.getCurrentScene()
#Buscando o objeto “quadrado” através da função getObjectList()
objeto = cena.getObjectList()["OBquadrado"]

Observações:
A função getObjectList() retorna uma lista de todos os objetos que estão em cena. Quando você a usa definindo o nome (getObjectList()[“OBquadrado”]), ela busca somente o objeto em questão.
No Game Engine, mesmo que você re-nomeie seu objeto, o blender sempre vai acrescentar o prefixo “OB” no inicio.

Considerações finais:

Como se pode perceber, em ambos os métodos, nenhum alcança os extremos. Os dois só chega até o nível objeto, mas é bom saber que a união deles pode se tornar uma arma poderosa no game engine.

  1. março 5, 2008 às 4:39 pm

    Grande artigo!!!!
    realmente essa foi a parte mais dificil que encontrei enquanto estudava a integração Python+blender Game Engine…

    Elisio Leonardo

  2. março 11, 2008 às 7:44 pm

    Salve Diego,

    Excelente post. Bem claro e explicativo.

    Meu nome é Leo Germani.. entre outras coisas faço parte do coletivo estudiolivre.org que pesquisa e produz coisas com softwares livres multimidia..

    Já fiz umas coisas interessantes com pythion + blender. Mas aprendendo tudo na orelhada.. bem dificil..

    Uma vez fizemos um PONG que era controlado por pessoas em pé, na sala, q eram mapeadas via webcam e ia tudo pra dentro do blender. link: http://pirex.com.br/?s=pong

    Tb fizemos uma mesa multitouch usando o blender. Dá uma sacada nisso!
    http://www.estudiolivre.org/el-gallery_view.php?arquivoId=4330
    (clica na setinha verde pra baixar o video).

    Aí é o seguinte: To aqui na luta pra montar uma interface de navegação de discos no blender (tipo aquela da itunes, com as capas de discos passando em 3d) e to aqu batendo cabeça numas coisas.. seria muito bom se pudesse contar um pouco com sua ajuda… uma consultoria de 1 hora via skype já me daria um adianto…

    Se for possível.. dá um toque..

    senão.. deixo uma perguntinha aqui…

    não to conseguindo usar direito o metodo setPosition em uma programação decrescente. Quando chamo a partir do getowner.. funciona perfeitamente. Mas qd pego a lista de objetos na cena e dou um setPosition, acontecem coisas estranhas (apesar de o resultado mostrado pela getPosition indicar que ele deveria ter se movido corretamente…)

    abs

    Leo,,

  3. diegorangel
    março 11, 2008 às 8:50 pm

    Ola Leo, tudo joia. Muito legal o seus projetos, parabéns!

    Eu realmente não utilizo o Skype (vou ficar te devendo). Mas costumo entrar no msn (diegorangel_inf@yahoo.com.br) se vc quiser, me add….

    A respeito do setPosition(), isso normalmente não era para acontecer, já que usando essa função tanto pela programação crescente como pela decrescente, ela tem o mesmo efeito. Talvez algum erro pequeno de programação, ou o centro do objeto está fora do lugar desejado. Mas estou a sua disposição.

    Se vc quiser me add no msn eu tento te ajudar sim, mas caso vc naum use esse messenger, e, se vc quiser, pode me mandar o código por email que eu dou uma olhada..

    Ok?! Inté

  4. felipe
    julho 31, 2008 às 12:03 pm

    Muito bom este artigo… dificil encontrar bons artigos brasileiros.
    Irá me ajudar bastante..
    Parabéns!

  5. Guto
    fevereiro 24, 2009 às 10:07 pm

    Quando a gente roda o script python apartir do Ctrl P é normal dar erro em “import GameLogic”, pq sempre q eu rodo é nessa linha q ocorre o erro…

  6. paulo henrique
    setembro 2, 2009 às 4:33 pm

    po exelente gostei muito desses tutorias parabens

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: