ProdutosNewsComprarDownloadsDownloadsDownloadsTutoriaisSuporteNão disponívelGaleriaForumContato  

DarkBASIC Pro
Versão de Avaliação
Patch 5.4
USB Dongle
Forum
Indique
Lista de Email
  Diário Antigo
Outros Produtos
Cartography Shop
DarkMatter
Curso 3D Studio
Combinados
Local DBPro Sites
Italy
UK

Proposta: Mostrar como implementar um simples efeito de partícula.

Neste tutorial nós iremos explicar como criar um efeito de fumaça usando um simples sistema de partícula. Um sistema de partícula é definido como uma coleção de pontos volumétricos que seguem um conjunto de regras para se movimentarem. As regras podem afetar na posição, velocidade, direção, cor, rotação, duração, formato, tamanho, transparência, e muitos outros atributos que são usados para simular efeitos tais como: fumaça, fogo, água de chuva, etc. O uso do sistema de partículas é infinito e através dele você é capaz de criar efeitos muito realísticos. Para os nossos pontos volumétricos nós iremos usar um plano de objeto com uma textura de fogo e fumaça. Os atributos que nós iremos usar para gerar o efeito de fumaça são: posição, tamanho, transparência e rotação.

Rem carrega partículas
Load Image "fire.bmp",2
For x = 0 to 10
Make object plain x+10,5,5
Texture object x+10,2
Set object x+10,1,0,0
Ghost object on x+10
Next x

Rem inicia contador de partícula
Pn=10

Esta seção de código é colocada próximo ao topo do programa onde nós iniciamos todos os nossos objetos e sons. Nós estamos carregando a textura para as partículas e gerando dez planos de objetos para simular o efeito de fumaça. O comando "Set Object" é usado para configurar os atributos especiais de um objeto. Os setes atributos especiais que pode ser configurados ou não para um objeto são: wireframe, transparência, cull, filtro, iluminação, fog e ambiente. Em nosso exemplo nós usaremos somente os atributos wireframe, transparência e cull. O primeiro parâmetro após o comando o número do objeto que nós desejamos afetar. O segundo parâmetro é o atributo wireframe. Nós configuramos este flag para 1 e então o objeto é exibido com polígonos cheios ao invés de ser wireframe. Esta é a configuração padrão para a maioria dos objetos 3D. o terceiro parâmetro trata-se do flag de transparência. Nós configuramos este atributo para 0 para permitir que a transparência seja exibida. Transparência neste contexto significa que as partes com cor preta do bitmap (que nós usamos para texturizar o objeto) não serão exibidas. O quarto parâmetro é o flag cull. Este parâmetro é configurado para 0 para permitir que ambos os lados do polígono sejam renderizados em seu espaço 3D. Normalmente somente um lado do polígono é renderizado no espaço 3D. Na maioria dos casos não existe razão alguma para renderizar ambos os lados, pois nós estaremos usando um plano de objeto que não possui volume algum. Nós devemos fazer isto para permitir que o observador veja o polígono a partir de todas as direções. O próximo comando novo é o comando "Ghost Object". Este comando é usado para fazer com que o objeto transparente seja exibido da mesma maneira que você imagina que um fantasma seja (exemplos de filmes como Casper - O fantasminha camarada). Com este comando você pode fazer com que este efeito fique habilitado ou desabilitado. Por padrão todos os objetos ficam com o fator "ghosting" desabilitado. Este comando utiliza somente um parâmetro que é o número do objeto que você deseja aplicar o efeito "ghost". Nós também iniciamos a variável "Pn" para que ela seja igual ao número da primeira partícula criada. A variável "Pn" será usada para guardar o índice de qual partícula precisa ser afetada por próximo.

If BulletLife > 0
Dec BulletLife
Move object 2,10
bX#=Object position X(2)
bY#=Object position Y(2)
bZ#=Object position Z(2)

Rem O sistema de partícula
inc Pn
if Pn=20 then Pn=10
Scale object Pn,100,100,100
Position object Pn,bX#,bY#,bZ#
point object Pn,X#,Y#,Z#
Zrotate object Pn,rnd(180)

for x = 1 to 10
scale object int((Wrapvalue((Pn-9+x)*36))/36)+10,100+x*25,100+x*25,100+x*25
set cursor 10,10
print int((Wrapvalue((Pn+x)*36))/36)+10
next x

Position sound 2,bX#,bY#,bZ#
set cursor 10,10
if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20
print "hit hit hit hit hit hit hit hit"
BulletLife = 0
Endif

if BulletLife = 0
Hide object 2
stop sound 2
Endif

Endif

Aqui nós adicionamos um simples sistema de partícula para a seção de tempo de vida da nossa bala do código do jogo.

inc Pn

if Pn=210 then Pn=10
Scale object Pn,100,100,100
Position object Pn,bX#,bY#,bZ#
point object Pn,X#,Y#,Z#
Zrotate object Pn,rnd(180)

for x = 1 to 10
scale object int((Wrapvalue((Pn-9+x)*36))/36)+10,100+x*25,100+x*25,100+x*25
next x

Quando a primeira bala inicia seu tempo de vida, nós incrementamos a variável "Pn" para movermos para o próximo objeto de partícula na configuração. Nós então testamos a variável "Pn" para ver se ela passou dos limites do número de partícula que nós criamos. Caso isto ocorra nós configuramos a variável "Pn" a ser igual a 10. Nós então resetamos a escala do objeto de partícula para o seu tamanho original e o colocamos exatamente onde a bala está localizada. Posteriormente nós apontamos para o objeto de partícula da câmera e rotacionamos o objeto em um número aleatório em graus. No loop for-next nós estamos usando um pouco de criatividade matemática para escalar cada partícula para fazer com que ela se expanda como se a fumaça estivesse se dissipando. O problema a revolver é entender qual partícula está a frente da fumaça e qual partícula está atrás da fumaça. Para fazer isto nós fazemos um pequeno truque com o comando. Este comando é normalmente usado para manter os ângulos dentro do limite de 360 graus. Pelo fato de nós estarmos usando 10 objetos, nós subtraímos nove da variável "Pn". O valor de "Pn" sempre estará na faixa de 10 a 19 que conta com 10 objetos. Nós então adicionamos o valor da variável "x" e multiplicamos este valor por 36. Se o valor de "Pn" for 5 e nós estivermos na sexta repetição do loop então o valor no parâmetro "WrapValue" é igual a 11 vezes 36 ou 396. Este valor é adequado aos limites dos 360 graus estabelecidos o que resulta em 36. Nós então dividimos 36 por 36 e obtemos o valor 1 que é número do objeto da próxima partícula após o décimo objeto que seria a primeira partícula. Essencialmente, neste truque de repetição do 1 ao 10 e voltar ao 1 não importa qual é o valor inicial. Parte da programação está em encontrar soluções criativas para problemas difíceis. Existem muitas maneiras para resolver um problema e a maneira mais simples é normalmente a melhor. Isto também demonstra que você não precisa usar os comandos de uma única maneira e em uma única situação no DarkBASIC. Pense bem antes de tomar qualquer decisão e procure visualizar todas as opções possíveis. Cada objeto é escalado por um fator de acordo com sua posição na fumaça como representado pela variável usada no loop for-next. Isto nos dá uma expansão do efeito de fumaça.

Promoção de Lançamento

Clique aqui para comprar o 
DBPro R$220,00

Clique aqui para comprar o 
DBPro para Universitários R$150,00


clique aqui para comprar o Upgrade a partir da versão clássica por R$150,00

Nova pagina 1

Esta é a barra de navegação para explorar todos os tutoriais da série "A Caça Aos Monstros" 

1.1   1.2   1.3   1.4   1.5   2.1   2.2   2.3   2.4   2.5   3.1   3.2   3.3   3.4   3.5   3.6   3.7   3.8   3.9   3.10   3.11   3.12   3.13   3.14