FORCE E CALLBACK
Force
Como a NxOgre símula toda a física de um ambiente 3D, para que um corpo se movemente, assim como ocorre no mundo real, é necessário que uma força(force) seja aplicada ao corpo.
case OIS::KC_C:
cuboActor->addForce(Vector3(-250,100,0)*100);
break;
Adicione o código acima no método keyReleased(). Uma força é aplicada através da função addForce(), onde deve ser passado como parâmetro um vetor que indicará a direção e a intensidade da força aplicada. No código acima ela será aplicada com uma intensidade de 250 na direção negativa do eixo X e 100 na direção positiva do Y. Observe que esses valores são multiplicados por 100, para que a força aplicada movimente o cubo, apenas 250 e 100 não o movimentaria.
Execute o projeto e pressione a tecla C para que seja aplicada a força ao cubo e ele colida com o robô.

O Callback é utilizado para que passamos ter algum retorno, caso algum evento, como uma colisão ocorra com os elementos da NxOgre. Por exemplo, caso uma bala acerte um personagem do jogo, normalmente os pontos de vida e alguma animação do mesmo é chamada em um método.
class AplicationListener : public FrameListener, public OIS::KeyListener,
public OIS::MouseListener, public OIS::JoyStickListener, public CThread,
public GroupCallback::InheritedCallback
Para que a nossa classe AplicationListener possa ter os métodos que irão ser invocados quando algum evento ocorrer, ela deverá herdar da classe GroupCallback::InheritedCallback, que é a última herdada no trecho acima.
void AplicationListener::onStartTouch(Actor*, Actor*, ContactStream*) {
}
void AplicationListener::onEndTouch(Actor*, Actor*, ContactStream*) {
}
void AplicationListener::onTouch(Actor*, Actor*, ContactStream*) {
}
Acima estão os métodos que serão chamados caso alguma colisão entre os elementos da NxOgre ocorrer. O método onStartTouch() será invocado no início do toque, onEndTouch() no fim do toque e onTouch() durante o toque dos elementos.
void onStartTouch(Actor*, Actor*, ContactStream*); void onEndTouch(Actor*, Actor*, ContactStream*); void onTouch(Actor*, Actor*, ContactStream*);
Não esqueça de adiconar as assinaturas do métodos no arquivo AplicationListener.h.
Agora vamos exemplificar o uso de um recurso interessante da NxOgre, que é grupo de atores, que é a organização dos atores e corpos em grupos.
primGrupo = scene->createActorGroup("prim");
segGrupo = scene->createActorGroup("seg");
Criamos dois grupos o primeiro com o nome prim passado para a variável primGrupo que é do tipo ActorGroup e o segundo de nome sec atribuido para a variável secGrupo. Em um game, os jogadores poderiam estar divididos em dois grupos de colisão de acordo com os seus times. O time A no primeiro grupo e o time B no segundo grupo.
cuboActor = scene->createBody(vp.mIdentifier, new Cube(100), Vector3(200,150,50),
vp, ActorParams("mass: 10, Group: prim"));
roboBody = scene->createBody(vp.mIdentifier, new Cube(25, 25, 25), Vector3(50,200,50),
vp, ActorParams("mass: 10, Group: seg"));
Definimos o grupo em que o ator estará através dos parâmetros do ator(ActorParams), como está no código acima. O cubo foi colocado no grupo prim e o robô no grupo seg.
primGrupo->setCallback(this); primGrupo->setCollisionCallback(segGrupo, NX_NOTIFY_ALL, true);
Em seguida definimos apartir de um dos grupos, qual a classe onde estará os métodos a serem chamados quando ocorrer alguma colisão. Como eles estão na classe AplicationListener passamos como parâmetros apenas this, para indicar que a classe é a mesma onde está o código.
Apartir do primeiro grupo definimos qual grupo queremos que seja verificada a colisão com esse, apartir do método setCollisionCallback. Onde o primeiro parâmetro é o grupo com quem será verificada as colisões, o segundo é um flag (bandeira), um indicativo de que tipos de colisões queremos que sejam verificadas, no nosso código serão todas.
void AplicationListener::onStartTouch(Actor*, Actor*, ContactStream*) {
scene_mgr->getSceneNode("roboNode")->setScale(Vector3(3,3,3));
}
Para exemplificar o uso de Callback, vamos definir a escala do robô 3 vezes maior que o normal quando ele colidir com o cubo, usando o código acima.

Italo Mendes
italo.ribeiro@gmail.com
