A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Sáb Set 23, 2017 2:56 pm

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 7 mensagens ] 
Autor Mensagem
 Título: Shiva 3D - 01 - O Começo
MensagemEnviado: Seg Jun 20, 2011 2:19 pm 
Offline
Site Admin
Avatar do usuário

Registrado em: Ter Nov 08, 2005 1:03 pm
Mensagens: 569
Localização: Santos-SP
Olá amigos desenvolvedores e curiosos, estou aqui escrevendo mais um tutorial para facilitar as vossas vidas e também aprender. Dessa vez estarei escrevendo sobre o Shiva 3D, uma engine de jogos que descobri na Campus Party e me interessou devido a sua portabilidade e facilidade de desenvolvimento. Seria um produto similar ao Unity 3D e Unreal Engine, os quais eu já tinha um pouco de experiência, porém mais acessível, pois além de existir uma versão não comercial gratuita, sua licença custa desde R$400 em sua versão básica, até R$4000 com recursos mais avançados.

Ao final desse tutorial, você estará apto a escrever um jogo no Shiva 3D, e caso siga o passo-a-passo, o resultado será esse.

Caso queira mais informações e também para baixar a versão gratuita, acesse: http://www.stonetrip.com e siga @stonetrip no twitter.

Imagem

Introdução

Para o desenvolvimento de um determinado jogo, a maioria das empresas criam programas facilitadores na integração de todas as necessidades, como gráficos, sons, física, interfaces, carregamento de texturas e modelos para tornar o desenvolvimento da inteligencia do jogo mais fácil e rápido. Estando pronto, esses programas chamados "engines", podem ser utilizados para desenvolver outros jogos sem a necessidade de programar tudo novamente.

Algumas empresas enxergaram isso como um grande mercado, e disponibilizam suas engines para uso de outras empresas ou desenvolvedores autonomos, através do pagamento da licença de uso ou uma fatia dos lucros.

O Shiva 3D é uma engine de jogos, criada pela empresa Stonetrip, que se propõe a facilitar não só o desenvolvimento, como também a portabilidade dos jogos entre vários dispositivos. Com ela é possível criar apenas um só projeto e com alteração mínima, executar em computadores (PC/MAC), consoles (Wii e futuramente PS3/PSP), web browsers e dispositívos móveis (Android/iPhone/iPad).

Imagem

Recursos

Em sua versão 1.9 (quando foi escrito esse tutorial), o Shiva 3D já implementa uma série de recursos que não o deixa atrás de seus concorrentes mais caros, podendo com ele criar desde mini jogos até uma produção de grande escala.

Facilmente integrado aos formatos de padrão de mercado, o Shiva 3D importa os arquivos de audio e video mais conhecidos (mp3, ogg, wave, avi...), texturas (png, jpeg, tga...) e cena (Collada). Além disso, possui uma série de ferramentas para integrar com alguns dos mais conhecidos modeladores 3D.

Possui editor de cena, que facilita na criação da cena e no posicionamento dos objetos, editor de terreno e vegetação, de modelo e textura, de atributos de física e de ambiente, criação de particulas, sombras e rastros, além de possuir funcionalidades de rede que possibilitam a criação de aplicações online.

Infelizmente, para a criação de um jogo é necessário uma codificação, por menor que seja, assim sendo possível representar de maneira fiel a ideia. Para isso, o Shiva 3D utiliza scripts na linguagem LUA. Criada no Brasil, a linguagem LUA tem como principais argumentos, estender aplicações, facilitar o desenvolvimento com uma escrita mais simples e legível comparada a C++, e de extrema performance. Pesquisas dizem que é a linguagem mais utilizada, atingindo 20% dos jogos.

Bom, chega de muito texto e mão na massa.

Imagem

Resumo de LUA

LUA tem sua sintaxe semelhante ao Pascal, porém com recursos mais atuais. E caso tenha familiaridade com a linguagem, pode pular para o próximo passo.

Frequentemente você verá comentários nos códigos, que são feitos através dos --.

Variáveis e Tipos

As variáveis em LUA não possuem definição de tipo, podendo assim uma mesma variável possuir um valor inteiro e posteriormente uma sequência de caracteres.

Código:
teste = 1.50 -- numero decimal
teste = "Texto" -- texto
teste = nil -- valor nulo
teste = 5 -- numero inteiro
teste = true -- valor booleano, verdadeiro ou falso
teste = {} -- tabela de valores (explicadas posteriormente)

Todas as variáveis são por padrão, globais, isso é, podem ser acessadas fora do escopo onde são criadas, por exemplo, fora de uma função. Porém, caso haja a necessidade de criar uma variável apenas visível para aquele escopo, basta adicionar a palavra "local" antes de sua criação.

Código:
local teste = "Variável Local!"

Operadores

Os operadores aritméticos são os usuais: + (adição), - (subtração), * (multiplicação), / (divisão), ^ (exponenciação) e - unário (negação).
Os operadores relacionais resultam em um valor booleano e incluem: < (menor que), > (maior que), <= (menor ou igual que), >= (maior ou igual que), == (igualdade), ~= (diferença).
Os operadores lógicos servem para combinar valores booleanos e são dados por: and (e), or (ou), not (negação). Existe ainda o operador .. para concatenação de strings.

Controladores de Fluxo

O LUA oferece os controladores de fluxo básicos de uma linguagem procedural.São eles: IF, WHILE, REPEAT e FOR.

Código:
if (expr) then
-- executará aqui, caso o valor de expr seja um booleano verdadeiro
end

if (expr) then
-- executará aqui, caso o valor de expr seja verdadeiro
else
-- executará aqui, caso o valor de expr seja falso
end

if (expr1) then
-- executará aqui, caso o valor de expr1 seja verdadeiro
elseif (expr2) then
-- executará aqui, caso o valor de expr2 seja verdadeiro
else
-- executará aqui, caso nenhuma das expressões anteriores forem verdadeiras
end

while (expr) do
-- repetirá essa execução enquanto expr seja verdadeiro
end

repeat
-- repetirá essa execução até que expr seja verdadeiro
until (expr)

for variavel = valor_inicial, valor_final, valor_de_incremento do
-- fará essa execução desde o valor inicial, até o final (inclusive) com o determinado valor de incremento (que se omitida, assume valor 1)
end

for variavel in tabela
-- repetirá essa execução para todos os itens da tabela, assumindo para cada um, o valor em variavel
end

Qualquer um dos controladores de fluxo podem ser interrompidos com o comando "break".

Funções

Funções em LUA são valores em variáveis, podendo ser locais ou globais, e que são chamadas através dos parenteses. Assim, podemos definir uma função da forma convencional, com seus parametros declarados:

Código:
function soma(a, b)
return a + b
end

Como também:

soma = function(a, b)
return a + b
end

Devido a todos os parâmetros em LUA serem passados por valor, foi implementado uma forma não convencional de atribuição e retorno de múltiplos parâmetros, que facilita o desenvolvimento. Assim x, y = a, b se torna válido, assim como x, y = soma(a, b) e return a, b.

Tabelas e Objetos

Tabela é a única forma de estruturação de dados em LUA e todas estruturas de dados comumente encontradas em outras linguagens pode ser representada por ela.

Código:
t = {} -- cria uma tabela vazia
t[1] = 5 -- armazena o valor 5 no índice 1
t["luiz"] = "pestana" -- armazena o valor "pestana" no índice "luiz"
t.luiz = "pestana" -- idem a chamada acima

Iterando sobre tabelas com índices numéricos (1,2,3...):

Código:
for i, v in ipairs(t) do
-- repetir a execução até o fim da lista, sendo i o indice e v o valor
end

Iterando sobre tabelas com quaisquer indices:

for k, v in pairs(t) do
-- repetir a execução até o fim da lista, sendo k o indice e v o valor
end

Podemos também utilizar um construtor para tabelas, utilizando uma função:

Código:
area = Zoom{a=3,b=6,c=7}

Assim, quando for criada essa tabela, a função Zoom será executada passando por parametro a nova tabela:

Código:
function Zoom(self)
self.a = self.a * 10
self.b = self.b * 10
self.c = self.c * 10
return self
end

O último e não menos importante recurso em tabelas, é o "metatable", que faz o LUA representar um ambiente muito parecido com o orientado a objetos. Com esse recurso, podemos adicionar funções a determinados eventos com nossos "objetos" tabelas:

Código:
Zoom_metatable = {
__add = function (z1,z2)
  return Zoom{z1.a+z2.a, z1.b+z2.b, z1.c+z2.c}
end
}

Essa metatable define a função de adição para objetos do tipo Zoom, para isso, é necessário informar a metatable no construtor:

Código:
function Zoom(self)
self.a = self.a * 10
self.b = self.b * 10
self.c = self.c * 10
setmetatable(self, Zoom_metatable)
return self
end

Dessa forma, teremos a função de soma personalizada:

Código:
z1 = Zoom{a=3, b=1, c=3}
z2 = Zoom{a=4, b=1, c=7}
z3 = z1+z2 -- que resultará em 7, 2, 10

As palavras reservadas para definição de eventos são: __add (soma), __sub (subtração), __mul (multiplicação), __div (divisão), __pow (exponeciação),
__unm (negação), __concat (concatenação), __eq (igualdade), __lt (menor que), __le (menor ou igual que). Existem também as definições __index, que define uma função para quando tentamos acessar um índice não existente na tabela, e __newindex, que define uma função para quando atribuimos um valor a um índice não existente na tabela.

Caso não tenha entendido algo sobre o lua até aqui, não tem problema. Conforme o tempo de uso, você entenderá.

Começando no Shiva

Para começar, faça download do arquivo de recursos que iremos utilizar nesse tutorial, clique aqui.

Imagem

Criar novo projeto, indo em Main > Projects > Add;

Imagem

Ir em Game no Game Editor e Create, digitar o nome do seu jogo; (lembrando que um projeto pode conter vários jogos, que fazem uso dos mesmos objetos, facilitando uma possivel versão diferente)

Imagem

Aberto o jogo, você deve criar sua primeira cena, indo em Create > Scene no Data Explorer, coloque o nome de CenaJogo. Após criar, clique duas vezes na CenaJogo no Data Explorer para abrir no Scene Viewer; (Quando perguntar se você deseja referenciar ao seu jogo, diga que sim, pois toda cena que sera utilizada, deve ser referenciada através do Game Editor)

Imagem

Ainda não é possível ver alguma coisa através do botão Play, você pode ate testar e ver que ficara tudo escuro.Aperte Stop e carregue a Cena novamente no Scene Viewer;

Imagem

Para carregar nossa cena, e necessário informar ao jogo através do script principal, pois e ele que determina o caminho a ser seguido. Para isso, crie um AIModel (arquivo de script) em Create > Resource > AIModel no Data Explorer. Coloque o nome de ScriptJogo, clique duas vezes para abrir e mude para a visão Code.

Imagem

Imagem

Clique no "Add Handler" para adicionar um novo evento para o "onInit".

Imagem

Digite o código para inicializar a cena principal.

Imagem

Agora volte para a visão General.Nela, vamos arrastar o ScriptJogo para o campo User Main AIs no Game Editor. Isso vai fazer com que o trecho do código onInit seja a primeira coisa a ser executada.

Imagem

Volte a carregar a CenaJogo, procurando por ela na pasta Scenes no Data Explorer.
Crie um quadrado, indo em Create > Model > Shape > Box no Data Explorer, de o nome de BoxPlayer e deixe as medidas como estão.

Imagem

Imagem

Nunca esqueça de referenciar um modelo ou recurso no seu jogo na tela Game Editor, nesse caso, arraste o BoxPlayer para o campo Models.

Imagem

Arraste o seu novo modelo para a Cena. Feito isso, você estará criando uma instância do objeto BoxPlayer, que estará sujeito a sofrer alterações de forma e estado. Esse será o nosso jogador.
Posicione-o na posição (Traslation) 0,0,0, para isso, utilize o editor de atributos, que pode ser encontrado clicando no quadrado duplo que fica no topo de cada espaço para menu. O nome é Attributes Editor.

Imagem

Adicione uma TAG a essa instância, pode ser o nome tagBoxPlayer, para isso, clique com o botão direito no BoxPlayer na Cena e Edit Selection Tag. A TAG é útil para conseguirmos a referência para um objeto criado em modo de design, como é o caso do nosso BoxPlayer.
Crie uma variável chamada oBoxPlayer para guardar o objeto player e nMoveTo no ScriptJogo, ela vai guardar a direção para qual será movida o nosso Box. Inclua também o evento onKeyboardKeyDown.

Imagem

Observação: para utilizarmos uma variável membro de um objeto, temos necessariamente que colocar o trecho this.variavel(valor) para mudar seu valor, e this.variavel() para resgatar.

Imagem

Também um evento onKeyboardKeyUp.

Imagem

Esses trechos identificam o teclado, modificando a variável nMoveTo para identificar a direção que o jogador quer que o Box se movimente.
Agora no onInit, modifique para armazenarmos o objeto Box na variável membro.

Imagem

Imagem

Por fim, criaremos a movimentação no onEnterFrame, modifique a velocidade alterando o multiplicador.

Imagem

Clique em Play e verifique se a movimentação ocorre ao apertar para os lados no teclado. (Não esqueça de salvar tudo com Control+S antes de executar)

Imagem

Criaremos um novo modelo, Sphere, chamado DotPoint com o Radius de 0.50.

Imagem

Também um novo AIModel, chamado ScriptPoint. Agora abriremos o DotPoint, clicando duas vezes através do Data Explorer, na pasta Models. Aberto, basta arrastar o ScriptPoint também do Data Explorer para o modelo:

Imagem

Assim o Script pertencerá ao modelo, e não mais ao usuário.
Na visão de código, abriremos o ScriptPoint para edição para adicionar o evento onInit com o código para posicionar nosso novo objeto.

Imagem

O trecho de código this.getObject() resgata a referência para a instância do objeto que executa esse AIModel. Essa linha posicionará randomicamente a esfera no topo da cena.
Agora criaremos uma variável chamada nSpeed, com valor inicial em 0.1.
Por fim no editor de código, criaremos o evento onEnterFrame para definir a movimentação.

Imagem

Uma pequena modificação, para caso a esfera tenha atingido o valor máximo de Y, ela se destruir.
Para a criação das esferas, modificaremos o evento onEnterFrame do ScriptJogo, lembre-se, do ScriptJogo, e não do ScriptPoint. Criaremos uma variável nLastPointTime do tipo numérico, e o conteúdo do script.

Imagem

Agora de o Play (não se esqueça de referenciar antes o DotPoint em seu jogo).Se deu tudo certo, o seu jogo já deve estar funcional, e caso precise, faça a movimentação da camera no editor de cena, da maneira que mais te agrade.

Imagem

Para começar a dar cara de jogo, precisamos colocar algumas colisões, e para isso, basta abrir o modelo do BoxPlayer, e adicionar o atributo sensor, faça o mesmo no modelo DotPoint.

Imagem

Imagem

Não se esqueça de atualizar a instância do BoxPlayer da cena, pois isso não é feito automaticamente após uma alteração no modelo.

Imagem

Após isso, todas as colisões serão gerenciadas pelo método onSensorCollision do ScriptPoint que iremos criar agora.

Imagem

Assim o jogo já está pronto, falta somente os acabamentos.Está disponível dois sons que fiz para download, um de explosão e um que sinaliza pontuação. Vá no Data Explorer e Import > Sound, selecione ambos e clique em import.

Imagem

Crie um SoundBank em Create > Resourse > SoundBank, de o nome de SonsJogo.

Imagem

Clique duas vezes em seu novo SoundBank para deixa-lo em negrito (sinaliza um recurso aberto), e no menu lateral clique no quadrado duplo e escolha SoundBank Editor.

Imagem

Clique em Edit > Add a Sound, e primeiro em score, depois em explosion. (note que o indice 0 e 1 serão utilizados no código para referenciar os sons)

Imagem

Vincule o novo SoundBank ao modelo BoxPlayer, assim como fez com o AIModel. (não se esqueça de atualizar a instância)

Imagem

Agora modifique o evento onEnterFrame e onSensorCollision conforme a figura para colocar os sons.

Imagem

Imagem

Vamos adicionar algumas texturas, para isso, é necessário importar um arquivo de imagem.Está disponível para download, uma textura de caixa e outra de bola de futebol. Após importar os arquivos, deve-se criar um material para cada, um com o nome BoxMaterial e o outro DotMaterial.

Imagem

Selecione o primeiro clicando duas vezes, e no menu lateral, escolha a tela Material Editor no quadrado duplo. Na opção "Texturing" no item "Effect Map 0", selecione a sua textura. E na opção "Lightning" no item "Ambient", deixe branco. Faça isso para ambos.

Imagem

Após configurar os materiais, deve-se selecionar o modelo e arrastar o material correspondente para aplicar, não esquecendo de atualizar a instância caso tenha sido criada uma na cena. (no nosso caso, o BoxPlayer)

Imagem

No quadrado duplo do menu lateral, selecione a opção "Ambience Editor". Com a cena selecionada, mude a cor do background, coloque um pouco verde.

Imagem

Crie um HUD, na opção Create > Resource > HUD em Data Explorer e de o nome de HudScore.

Imagem

Selecione o mesmo clicando duas vezes e no quadrado duplo, selecione HUD Editor. Em components, adicione um componente do tipo Label, chamado TxtScore.

Imagem

Salve o hud e altere o evento onInit do ScriptJogo para instanciar a HUD que criamos. (não se esqueça de referenciar o HudScore em seu jogo)

Imagem

Adicione uma variável ao ScriptJogo chamada nScore. Crie um Handler "customized" chamado onScore para atualizar a HUD.

Imagem

Imagem

E modifique os eventos onEnterFrame e onSensorCollision para alterar os pontos do jogador.

Imagem

Imagem

Agora você já pode compilar e exportar o seu jogo, até mesmo para web. Coloquei o resultado do jogo aqui. Como utilizamos controle de velocidade por frame, é necessário limitar a velocidade de frames por segundo, então coloque essa linha no onInit do ScriptJogo:

Código:
application.setMinFrameTime ( 0.02 )

No fonte da versão final para download aqui, fiz algumas modificações para colocar tempo no jogo e melhor record.Analise as alterações e modifique conforme a necessidade, assim acrescentando mais desafio.

Espero que tenham aproveitado... Comentem e corrijam, para que o próximo seja melhor! =)

_________________
Luiz Pestana
facebook | blog

Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Jun 20, 2011 9:55 pm 
Offline
Membro veterano
Avatar do usuário

Registrado em: Dom Mai 20, 2007 8:42 am
Mensagens: 1114
Localização: Belo Horizonte
Grande Luiz Pestana.
Exelente Material. ShiVa é certamente uma engine com um exelente potencial. Deve ser explorada mais.
Abraço.

_________________
Imagem


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Ter Jun 21, 2011 12:02 am 
Offline
Membro júnior
Avatar do usuário

Registrado em: Ter Nov 29, 2005 12:00 pm
Mensagens: 40
Excelente fonte de aprendizado!! Muito bem explicado, com imagens ilustrativas que não deixam dúvidas, guiando o leitor desde o início até a finalização de um jogo simples.
Mostrou bem a simplicidade e poder do Shiva 3D!
Obrigado Luiz!! E parabéns aos desenvolvedores da engine!

Já fiz a divulgação do tutorial no http://www.cerebro3d.com.br


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Ter Jun 21, 2011 5:00 pm 
Offline
Membro intermediário
Avatar do usuário

Registrado em: Sáb Abr 18, 2009 2:11 pm
Mensagens: 150
Excelente!! Apresentando novas possibilidades de ótimas engines para fugir da mesmice de sempre!!! Parabéns, Luiz!! E obrigado!

_________________
"Uma pequena pedra...Pode provocar uma avalanche..."

Para quem quiser baixar meu jogo:
http://www.megaupload.com/?d=EHPAYBVQ

Se quiser discutir e votar sobre o jogo:
http://www.unidev.com.br/phpbb3/viewtopic.php?f=5&t=53423


Voltar ao topo
 Perfil  
 
 Título: Re: Shiva 3D - 01 - O Começo
MensagemEnviado: Qua Out 05, 2011 11:57 am 
Offline
Membro novo
Avatar do usuário

Registrado em: Ter Out 04, 2011 5:30 pm
Mensagens: 1
Localização: São Paulo
Aew galera, alguem sabe como importar os arquivos PNACOLLADA sem de boa?
Eu importo um modelo com animação mas ele vai sem o mirror.
=S


Vlwww


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 7 mensagens ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB