![]() |
|
![]() ![]() ![]() |
|
3.13 Decoração de Colisão
Proposta: Mostrar como preparar a tela 3D para a adição dos objetos decorativos. Neste tutorial nós iremos criar um número de colunas para ser adicionadas para o landscape. Nós também mostraremos uma forma criativa de calcular a colisão nestas colunas usando uma técnica de colisão matemática. rem criar objetos decorativos load image "cottag02.bmp",300 t=300 For x = 1 to 9 For z = 1 to 9 Make object cube t,100 Scale object t,100,600,100 y = get ground height(1,x*1000,z*1000) position object t,x*1000,y+275,z*1000 texture object t,300 scale object texture t,1,-6 inc t next z next x Esta seção de código é adicionada antes do nosso loop principal e depois da matriz criada. Nós carregamos uma imagem para texturizar nossas colunas. Nós configuramos a variável "t" para um valor igual a 300. Este é o número do objeto que representa a primeira coluna. Nós usamos um loop aninhado para criar e colocar cada uma de nossos colunas. Nós não queremos uma coluna colocada nos limites da matriz, então ao invés de executar nossos loops de 0 a 10, nós o executamos de 1 a 9. Nosso loop "x" é usado para colocar nossos objetos da coluna do outro lado da matriz. O loop "z" é usado para colocar nossa colunas em cima e em baixo da matriz. Dentro do loop "z" nós criamos um objeto cubo usando a variável "t". Nós escalamos o objeto cubo com o valor de 600 na direção Y para criar uma coluna alta. Por próximo nós obtemos a altura da matriz em nossa nova posição X e Z. Note, para obter nossa posição X e Z nós multiplicamos as variáveis do nosso loop por 1000. Isto colocará as colunas nos intervalos regulares na matriz. Posteriormente nós posicionamos nosso objeto no espaço 3D. Nós adicionamos 275 para o nosso valor Y. Isto é quase a metade do caminho do objeto. Como a origem do nosso objeto está no meio do objeto, isto levanta a origem no eixo Y. Nós não o levantamos 300 unidades pois nós queríamos que o objeto olhe como se ele estivesse preso no terreno. Nós texturizamos o objeto com a nossa textura decorativa. Nós escalamos a textura para ajustar com o escalamento que nós executamos no objeto. Nós usamos um valor negativo de 6 ao invés de um valor positivo 6 para escalar a textura no objeto. Nós fizemos isto para inverter a textura. Como a textura foi colocada normalmente no objeto, ele foi no lado de baixo da parte superior. Esta é uma pequena dica que você pode usar para inverter ou girar a textura. Nós incrementamos a variável "t" para iniciar a criação do nosso objeto decorativo. Rem checar por colisão com as decorações da parede Function DecoCollide(X#,Y#,Z#) for u = 1 to 9 for v = 1 to 9 if X#>u*1000-60 if X#<u*1000+60 if Z#>v*1000-60 if Z#<v*1000+60 if Y# < Get ground height(1,u*1000,v*1000)+575 Collide=1 Exitfunction Collide endif endif endif endif endif next v next u Collide=0 Endfunction Collide Função é uma parte muito importante da programação. Elas podem ser usadas para criar muitos códigos de configuração. Você define uma função depois do loop principal usando as designações "Function" e "EndFunction". Depois da palavra chave "Function", você coloca o nome da função que você deseja criar e diretamente após isto você colocar um parênteses () com parâmetros. Dentro dos parênteses você coloca as variáveis que você deseja passar para a função para ser usada pelo código dentro da função. Você termina a função com a palavra-chave "EndFunction". Se você quiser a função para retornar um valor, então, você coloca a variável que guarda o valor junto a palavra chave "EndFunction". Se você olhar no meio da função você verá o comando "ExitFunction" com a variável "Collide" após ele. Se em algum ponto em sua função você desejar terminar a função sem completar todo o código dentro da função, você pode usar o comando "ExitFunction" para sair da função e retornar um valor da função. Function DecoCollide(X#,Y#,Z#) Note as variáveis "X#", "Y#" e "Z#" na função. Estas não são as variáveis que você usou para a posição do jogador. Apesar destas variáveis serem escritas da mesma maneira, elas só são relevantes quando a função está sendo executada. Isto é chamado de escopo da variável. Qualquer variável usada em qualquer lugar do seu programa não pode ser acessado de dentro da função. Qualquer variável criada dentro de um função é destruída quando a função existe. Os únicos valores que uma função pode usar são os valores passados para ela através dos valores designados dentro dos parênteses da declaração da função. Pense no comando "Object Angle Y(10)" como um função que está codificada dentro do DarkBASIC. O parâmetro é 10 e ele retorna o ângulo Y do objeto 10. Se você perceber que você está usando um bloco de código de forma repetida, este bloco possui grandes chances de virar uma função. Neste exemplo nós estaremos usando a função "DecoCollide()" para checar pela colisão usando a posição do jogador, do monstro e do projétil contra todas as coluna de decoração. Para fazer isto nós passamos os valores X, Y e Z dos objetos para checar pela colisão com cada uma das colunas. for u = 1 to 9 for v = 1 to 9 if X#>u*1000-60 if X#<u*1000+60 if Z#>v*1000-60 if Z#<v*1000+60 if Y# < Get ground height(1,u*1000,v*1000)+575 Collide=1 Exitfunction Collide endif endif endif endif endif next v next u Collide=0 Estes dos loops aninhados são similares aos loops que nós usamos para criar as colunas. Nossas possuem 100x100 unidades por 600 unidades de altura e 25 unidades da coluna fincadas no terreno. Como nossas colunas estão colocadas a 1000 unidades em nossa matriz, nós usamos os loops para interagir através de cada uma das posições. Nós usamos instruções If aninhadas para checar os valores X# e Z# contra cada uma das colunas. Nós somamos e subtraímos 60 unidades dos valores do loop multiplicado por 1000. Nós estamos, na verdade, checando 10 unidades a mais do que o comprimento e largura das colunas. Isto assegura que o jogador e o monstro não fiquem presos a parede de uma coluna. A primeira coluna checada está na localização 1000 se o jogador está na localização (1059,50,10059) este é o canto da colunas. Nós checamos se a posição X é maior que 940. Sim, ela é. Nós continuamos através do nossas comparações "If" aninhadas. A posição X é menor que 1060? Sim ela é. A posição Z do jogador é maior que 940? Sim ela é. A posição Z do jogador é menor que 1060? Sim ela é. A posição Y do jogador é menor que a altura do terreno da coluna mais 575? Sim ela é. Nós temos uma colisão. Configure a variável "Collide" como 1. Não é necessário checar pelo resto das colunas para que nós encontremos a resposta que nós estamos procurando. Use o comando ExitFunction para sair da função e retornar o valor de colisão. Nós sabemos que o jogador colidiu então nós podemos parar a movimentação do jogador na direção em que ele está seguindo. Se nenhuma colisão foi detectada, nós configuramos Collide como 0 e finalizamos a função com a palavra chave "EndFunction", retornando o valor 0. rem Detecção de colisão if DecoCollide(X#,Y#,Z#) = 1 X#=oldX# Y#=oldY# Z#=oldZ# Endif Esta seção de código é encontrada no loop principal na seção de entrada do código. Os valores de posição do jogador são passados para a função e se a função retornar 1 então a posição do jogador é configurada para sua posição original antes de ele ser movido. if DecoCollide(bX#,bY#,bZ#) = 1 then BulletLife = 0 if DecoCollide(MbX#,MbY#,MbZ#) = 1 then MonsterBulletLife = 0 Estas duas linhas de código são entradas nas sub-rotinas "ShootBullet" e "MonsterShootBullet" para checar se a balas colidiram com a coluna. Se existir uma colisão, as balas vivas são finalizadas. mX#=rnd(10000) mZ#=rnd(10000) mY#= get ground height(1,mX#,mZ#) If DecoCollide(mX#,mY#,mZ#) = 1 mX#=X# mY#=Y# mZ#=Z# endif X#=rnd(10000) Z#=rnd(10000) Y#= get ground height(1,X#,Z#) If DecoCollide(X#,Y#,Z#) = 1 X#=mX# Y#=mY# Z#=mZ# endif Estas duas seções de código são encontradas nas sub-rotinas "PlacePlayer" e "PlaceMonster". As funções "DecoCollide' são usadas para ver se as novas posições estão dentro da posição da coluna. Se a função retornar 1, a nova posição do jogador e do monstro é configurada para a posição do jogador ou monstro. Isto faz com que o loop continue e gere uma posição aleatória que não esteja em localização alguma das colunas. |
|
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 |
| Copyright © 2003 Dark Basic Software Limited. | ||
| Virtual Object Informática Ltda.® |
![]() |
![]() |