Oi pessoal meu nome é Jean estou publicando um tutorial para criar um design físico para os personagens de jogo, melhor interagindo com o cenário em sua volta. Nesse tutorial vou usar o Havok e Director mais quem usa o 3D Game Studio poderá utilizar a técnica também usando o motor de física "Newton”.
Para fazer esse tutorial melhor dizendo eu fiz bastantes testes no motor de jogo do Half Life usado no jogo Conter Strike, e vou usar desse método para aplicar nos futuros jogos porque é muito bom. E muito leve para o programador.
Uma coisa que assemelha com os outros jogos são, que quando você estiver em colisão com o piso a gravidade cera 0, então a gravidade so ativa quando você não estiver mais sobre o chão, caindo ou pulando por exemplo.
Iniciando o tutorial
É altamente recomendável quem não leu ler o tutorial 1 sobre criação de game com Director e Havok
http://www.tresd1.com.br/viewtopic.php?t=23040
O tutorial é rápido e esta bem resumido, boa sorte!!!.
Abra o 3Ds Max, aqui estou com a versão 8 mais pode ser a 9 com o plug-in que exporta em W3D.
Você vai precisar de:
1 Sphere - Sera o objeto onde sera colidido com o cenario.
1 Box - Esse sera o personagem, ficara preso na Sphere.
1 Pode ser mais um Box para simular o Piso.
Criando piso.
Crie uma Box e posisione no meio da cena.
Coloque o nome de piso
Paramentros
L:250
W:250
H:10
Ls:7
Ws:7
Hs:1
Converta para Poly e crie algums relevos usando o "Soft Selection" de edit Poly.
Agora crie uma Sphere
Coloque o nome de bola
Parameters
R:14
S:8
A Sphere não presiza ter muito segmentos pois vamos identificar ao Havok tratar o objeto com uma Sphera, dai então o caulo é feito emcima disto.
Agora por ultimo criaremos uma box, e sera o personagem.
Coloque o nome de character
Paramenters
L:5
W:30
H:60
Ls:1
Ws:1
Hs:1
Posicione + ou - como a figura na proxima pagina, so não esquece de deixa a So1 acima do piso, e o character junto com bola, unsando o Alinhamento do Max.
Exporte para para W3D Shocwave 3D, coloque o nome de cena1.
Tutorial Parte 2
Abra o seu Adobe Director, clique em File - Import e importe o arquivo "cena1".
deixe o nome de cena1 para ele.
Agora clique em Insert - Media Element - Havok Physic Engine e coloque o nome de havok.
Arraste a cena1 para o Stage, Clique sobre ele, e va em Behavior, clique sobre o + e va em New Behavior...
Abrindo a tela Script vamos começar a programar.
Criando a variavaies.
Ohhh estamos na parte mais importante da programação as variaveis.
Para quem não foi apresentado vou apresar a vocês.
Leitor esse é o commando "global", quando você criar uma variavel global ele vai invoca ela em todo lugar do seu jogo. cena1, cena2, cena3
Leitor esse é o commando "property", invoca apenas quando a cena1 é executada.
Não fico muito claro mais é + ou - isso.
vamos criar a variaveis global.
Na tela de script digite:
global cena, piso, character, bola, havok, gravidade
property rb_piso, rb_character, rb_bola, onGround, myTimer, _gravity
property vv, xx, yy, zz
Pessoal agora no longo no tutorial vou explicando o porque da variaveis.
Vamos iniciar.
Digite ou copie né hehehe:
--Ele irar executar tudo o que extiver dentro o beginSprite antes de qualquer coisa. Apenas uma vez.
on beginSprite me
--Gravidade = -974, gosto desse valor, você tambem pode mudar se quiser
gravidade = -974
--cena = member("cena1") ou cena = member(1)
cena = member(1)
--reseta a cena1 como se você tivese acabo de importala
cena.resetWorld()
--importa o Havok Engine para a cena1
havok = member(2)
--Importara os objetos da cena1, piso, character e bola
piso = cena.model("piso")
character = cena.model("character")
bola = cena.model("bola")
--Instala o Havok na cena1
havok.initialize(cena, 4, 0.0254)
--Adiciona gravidade
havok.gravity = vector( 0,0, gravidade )
--Adiciona os modificadores, essencial para o objeto se movimentar com o Havok
piso.addModifier(#meshDeform)
bola.addModifier(#meshDeform)
--Adiciona o corpoRigido piso como fixo
rb_piso = havok.makeFixedRigidBody(piso.name, false)
rb_piso.friction = 0
rb_piso.restitution = 0
--Adiciona o corpoRigido bola como movel (bola.name, peso, convexo, tipo)
rb_bola = havok.makeMovableRigidBody(bola.name, 100, true, #sphere)
rb_bola.friction = 0
rb_bola.restitution = 0
--Detecta colisão entre a bola e o piso, e executa o commando hitDecor que sera publicado logo abaixo
havok.registerInterest(bola.name, piso.name, 0, 0, #hitDecor, me)
end
Tutorial Parte 2
Agora entraremos na função on enterFrame
on enterFrame me
--Faz o pesoangen não esta interagindo com o chão pois ele so fica true quando a bola estiver sobre piso então onGround fica true
--Esse teste é feito em havok.step
onGround = false
--Atualiza o Havok Engine em 60FPS exempo 1/60 = 0.01666
--Definimos 5 para substepes por exemplo em cada frame ele faz 5 calculos
--Fica muito mais presizo
havok.step( 0.01666, 5 )
--Quando a tecla "123" Left e "124" Right executa os comandos para girar o personagem
--Para uma direção e a outra reversa
if keyPressed(123) then
character.rotate(vector(0,0,2))
else if keyPressed(124) then
character.rotate(vector(0,0,-2))
end if
--Quando presionar a tecla "125" Up e "126" Down ele da o valor -100 ou 100 de velocidade linear assim o personagem entrara em movimentno
if keyPressed(125) then
vv = -100
else if keyPressed(126) then
vv = 100
else
--vv = vv*.98 Esse escript vai dividindo a variavel vv então quando você largar do botão para cima ou para baixo a velocidade do personagem vai se dimuindo lentamente
vv = vv*.93
end if
--Aqui vereficamos o angulo que o character esta para ele sigui na direção exata onde ele foi rotacionado
xx = character.transform.yAxis.x
yy = character.transform.yAxis.y
--Quando ele estiver sobre o piso ele irar executar a os commandos
if (onGround) then
--Amacia o fim da gravidade até a gravidade for 0
_gravity = _gravity*.98
--Atualiza a gravidade
havok.gravity = vector( 0, 0, _gravity )
else
--Retorna o valor da gravidade normal -974
_gravity = gravidade
--Atualiza a gravidade
havok.gravity = vector( 0, 0, _gravity )
end if
--Atualiza o valor zz que é o valor em que o objeto esta em movimento no eixo z
--Porque quando agente usar o commando linerVelocity ele irar remover qualquer outro valor, então criaamos a variavel para preservala
zz = rb_bola.linearVelocity.z
--Aqui é a função para a bola se moviemtar de acordo com a rotão do character
--Usaremos tambem o zz que acabemos de criar
rb_bola.linearVelocity=vector(vv*xx,vv*yy,zz)
--Aqui faremos o character seguir a mesmo posição da bola
character.transform.position = bola.transform.position
--Agora por ultimo evitaremos que a bola rotacione como faria na vida real
rb_bola.angularVelocity=vector(0,0,0)
end
--Criaremos a função para o comando dado logo atras ainda em beginSprite me
on hitDecor me, info
--Quando hitDecor foi ativado ele declarara a variavel onGround como true pois o piso e bola estarão em colisão.
onGround = true
end
Ta ai fiz correndo o tutorial, e perdoeme pelas falhas de portugues.
O link com todo o projeto esta aqui.
http://sunag.discovirtual.uol.com.br/disco_virtual/xirak/characteregine.rar
A senha é: 12345
Espero que gostem.
Abraço
Jean Carlo Deconto / Sunag Entertainment
http://www.sunag.com.br/