quinta-feira, 30 de dezembro de 2010

Desenvolvimento de IA com BGE

Esse material é parte da Palestra que ministrei na IV Conferência Nacional - Blender Pro, fala sobre lógica de programação, Pathfinder (encontrar o caminho) para jogos e um arquivo .blend demonstrativo.
















 link RTS.blend

quinta-feira, 16 de dezembro de 2010

Movimento de Câmera vista de cima




Em jogos de RPG ou de RTS se utiliza muito a visão de cima, a navegação pelo cenario com a câmera pode ser uma dificuldade há mais. A proposta aqui é a movimentação da câmera pelas bordas da área de visão, como no video abaixo:




Você pode reparar que ao movimentar o cursor do mouse para perto das bordas da janela, "o cenário se desloca", isto é a câmera se desloca em relação ao cenário.

Como funciona o template?
Precisamos criar um script python que saiba da localização do cursor mouse e as dimensões da janela, em seguida comparar a posição atual do cursor em relação aos limites da tela, então criamos aréas de ação do cursor.


Assim que o cursor atingir umas das área de ação a câmera se desloca na direção da área ativa e quando sai da área para o deslocamento.


Os elementos do template:
Ativos - Câmera ligada(parenteada) ao Empty, no qual vai no Painel de Lógica um sensor do tipo Always e outro de Mouse/Moviment, ligados ao Controlador Python.

O Script Python:



import Rasterizer
Rasterizer.showMouse(1)
w = Rasterizer.getWindowWidth()
h = Rasterizer.getWindowHeight()
import GameLogic as g
from GameLogic import *

cont = getCurrentController()
ow = cont.owner

mousesensor = cont.sensors['move']
campos = ow.position

x = mousesensor.position[0]
y = mousesensor.position[1]

screenposx = 1.0*(x - w/2) / w
screenposy = 1.0*( ( h - y ) - h/2 ) / h

#deltax = campos[2]/1
#deltay = campos[2]/1
deltax = campos[2]/1.265
deltay = campos[2]/1.84

newposx = campos[0] + screenposx * deltax
newposy = campos[1] + screenposy * deltay
newposz = 0

newpos = [newposx,newposy,newposz]

print y
#print L,l
#print screenposx, screenposy
#print newposx,newposy

#DETECTA OS LIMITES DE AÇAO DA TELA
if y < 50:
up="on"
else:
up="off"
if y > h-50:
down="on"
else:
down="off"
if x < 50:
left="on"
else:
left="off"
if x > w-50:
right="on"
else:
right="off"

vel = 0.1

if up=="on":
ow.applyMovement([0,vel,0],1)
print "up"
# down 

elif down=="on":
ow.applyMovement([0,-vel,0],1)
#print "down"

# left
elif left=="on":
ow.applyMovement([-vel,0,0],1)
print "left"

# right
elif right=="on":
ow.applyMovement([vel,0,0],1)
print "right"


 Conclusão:
Esse template demonstra os princípios do funcionamento de Movimento de câmera, com ele você pode usar de base para seus projetos e incrementar mais funções.

Download do template: aqui

quinta-feira, 9 de dezembro de 2010

Drag and Drop - Arrastar e Largar

Drag and Drop 3D - Arrastar e Largar



Conceito
Nas interfaces gráficas de computadores, drag-and-drop (arrastar e largar) é a ação de clicar em um objeto virtual e "arrastá-lo" a uma posição diferente ou sobre um outro objeto virtual. De maneira geral, ele pode ser usado para invocar diversos tipos de ações, ou criar vários tipos de associações entre dois objetos abstratos.

A seqüência básica de ações relacionadas ao drag-and-drop é:
  • Clicar, e manter o botão do mouse ou outro dispositivo semelhante apertado, para "agarrar" o objeto,
  • "Arrastar" (drag) o objeto/cursor à posição ou localização desejada,
  • "Largar" (drop) o objeto, soltando o botão pressionado.
Neste Tutorial iremos abordar um Drag and Drop um pouco diferente, por se tratar de um  Drag and Drop 3D, isso quer dizer que diferentemente de um porcedimento 2D onde só um angulo de visão é permitido podemos posicionar nossa camera em qualquer ângulo para deslocar o objeto.


Vamos para a lógica do template.
Consiste basicamente em o ponteiro do mouse estar sobre o objeto que se deseja deslocar.
Ao clicar com o botão esquerdo do mouse, uma função pega as propriedades do objeto e verifica se este possui tal propriedade para permitir o deslocamento.
Se este apresentar esta propriedade sua posição será a aposição do mouse, enquanto o botão do mouse permanecer precionado, assim que solto o botão do mouse o objeto fica na posição atual.

Construindo o Template.

1º Passo - Adicionar o objeto ou objetos, adicione uma propriedade no objeto no painel Game Logic (F4) em Add Property com o nome de ativo.


2º Passo - Criar um script Python como descrito abaixo e liga-lo a câmera.

import Rasterizer
Rasterizer.showMouse(1)

import GameLogic as g
from GameLogic import *

cont = getCurrentController()
own = cont.owner
mouseover = cont.sensors['MOverAny']
lmb = cont.sensors['LMB']

hitLoc = mouseover.hitPosition #COORDENADAS DA POS DO MOUSE
hitObj = mouseover.hitObject #OBJ Q ESTA SOB O MOUSE

hitLoc=hitLoc
posx=hitLoc[0]
posy=hitLoc[1]
posz=hitLoc[2]

cena=g.getCurrentScene().objects


if hitObj.has_key('ativo') and lmb.positive:
    #print hitObj  #Use o print para visualizar o obj na linha de comando
    obj=hitObj
    obj.position = [posx,posy,1]

3º Passo  - Adcionando sensores a câmera:
Adicione um sensor Mouse do tipo Mouse over any.
Um sensor Mouse do tipo Movement.
Um sensor Mouse do tipo Left button.
Ligue-os ao controlador Python como descrito na figura abaixo.


Agora é só testar teclando P e clicar e manter precionado sobre o objeto, mova o mouse e solte o clique, se tudo estiver certo vocề terá deslocado o objeto de lugar.
Esse template poderá ser a base para algum jogo ou parte dele em seus projetos.
Bom proveito!

Download template: aqui