Lanzar dados con el motor de física Jiglib y Away3D

En este tutorial construiremos una caja en la que podemos lanzar dados. Para hacer esto usaremos Away3D como el motor 3D y Jiglib como el motor de física. Vamos a quedarnos atrapados en ...




Paso 1: Nuevo archivo ActionScript 3.0

Como sugiere el título, primero crearemos un nuevo archivo ActionScript 3.0.

Paso 2: Editar perfil

En el panel Propiedades presione el botón Editar..

Paso 3: Elija la versión de Flash Player

Elija el perfil de Flash Player 9 y haga clic en Aceptar.

Paso 4: Consigue el motor Away3D!

Guarde su archivo como "3D Dice.fla" en una nueva carpeta llamada "3D Dice". Ahora descargue el motor Away3D de Descargas Away3D. Usaremos la versión 2.3.3 para Flash Player 9. Descomprima un archivo y copie todas las carpetas en la carpeta "Dados 3D".

Paso 5: Consigue el motor de física Jiglib para Flash!

Debe instalar un programa SVN para obtener estos archivos de origen. Aquí está la dirección de SVN. Si no quiere lidiar con todo lo que también puede obtener de los archivos de origen para este tut. Después de mover las clases de Away3D y Jiglib a su carpeta de dados 3D, sus documentos deberían tener este aspecto:

Paso 6: Importar texturas

He dibujado algunas texturas para nuestros dados. Por supuesto, puedes cambiarlos pero no son malos :) Puedes encontrar otras texturas en el archivo fuente..

Texturas de los dados:

Ahora debemos darles nombres de enlaces para adjuntarlos en tiempo de ejecución (haga esto para cada imagen en su biblioteca una por una):

Seleccione Imagen, luego haga clic derecho> Propiedades

Exportar para ActionScript> Eliminar parte ".png"

Paso 7: Iniciar la codificación

OK, estamos listos para empezar a programar. Primero importamos nuestras clases:

importar away3d.cameras. *; importar away3d.containers. *; importar away3d.materials. *; importar away3d.primitives. * importar away3d.lights.DirectionalLight3D
import jiglib.physics.RigidBody; importar jiglib.plugin.away3d.Away3DPhysics; importar jiglib.plugin.away3d.Away3dMesh; importar jiglib.math.JNumber3D

Paso 8: Configurar variables

Después de importar nuestras clases, necesitamos definir nuestras variables para usarlas en los siguientes pasos.

var escena: Scene3D; cámara var: HoverCamera3D; vista de var: View3D; var light: DirectionalLight3D; física de var: Away3DPhysics;
var boxWidth: Number = 250 var boxHeight: Number = 30 var boxDepth: Number = 250 var boxDickness: Number = 5
var diceTextures: Array = [nuevo WhiteShadingBitmapMaterial (nuevo diceTexture1 (0,0)), nuevo WhiteShadingBitmapMaterial (nuevo diceTexture2 (0,0)), nuevo WhiteShadingBitmapMaterial (new diceTexture3 (0,0)), nuevo WhiteShadingBitmapMaterial (nuevo dadosTexture4 0)), nuevo WhiteShadingBitmapMaterial (nueva diceTexture5 (0,0)), nuevo WhiteShadingBitmapMaterial (nueva diceTexture6 (0,0))]
var wallTexture: WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial (new walltexture (0,0)) var groundTexture: WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial (new groundtexture (0,0))
var diceScale: Number = 30 var dices: Array = new Array () var diceRandomForce: Number = 50

Como habrás adivinado, los primeros son para Away3D. Los nombres de las variables son simples, así que puedes adivinar para qué sirven..

diceTextures mantiene las texturas de cara de dados. Tomamos imágenes de texturas de dados de la biblioteca y las colocamos en WhiteShadingBitmapMaterial. Elegimos este material porque mantendrá las cosas ligeras y para mejorar aún más el rendimiento, también será plano. WhiteShadingBitmapMaterial es el mejor para nuestras necesidades.

wallTexture y groundTexture utilizan diferentes imágenes. El uso de cualquiera de estos en nuestro caso sería terrible.

Paso 9: Configurar Away3D

A continuación necesitamos construir Away3D..

function initAway3D (): void scene = new Scene3D ();
 camera = new HoverCamera3D (); camera.distance = 300
 light = new DirectionalLight3D (color: 0xFFFFFF, ambient: 0.25, diffuse: 0.75, specular: 0.9) scene.addChild (light) view = new View3D (scene: scene, camera: camera); view.x = stage.stageWidth / 2; view.y = stage.stageHeight / 2; addChild (ver); física = nueva Away3DPhysics (ver, 4)

La primera línea en esta función crea nuestra escena 3D, en la que agregamos objetos 3D. Para la cámara elegimos HoverCamera3D. HoverCamera es la mejor manera de girar la cámara alrededor de los objetos. En realidad, no es necesario utilizar la luz para este proyecto, pero hace que el experimento sea genial :) Creamos la Vista y la colocamos en el centro de la escena..

Por último, creamos nuevos Away3DPhysics. El primer parámetro es "View3D" y el segundo es "gravity" (yo uso 4, pero si quieres puedes probar con otro número).

Paso 10: Creando Muros

function createWalls (): void var left: RigidBody = physics.createCube (width: boxThickness, height: boxHeight, depth: boxDepth); left.movable = false; left.x = - (boxWidth + boxThickness) / 2 Away3dMesh (left.skin) .mesh.material = wallTexture var right: RigidBody = physics.createCube (width: boxTickness, height: boxHeight, depth: boxDepth); derecho. movible = falso; right.x = (boxWidth + boxThickness) / 2 Away3dMesh (right.skin) .mesh.material = wallTexture var front: RigidBody = physics.createCube (width: boxWidth, height: boxHeight, depth: boxTickness); frontal. movible = falso; front.z = (boxDepth + boxThickness) / 2 Away3dMesh (front.skin) .mesh.material = wallTexture var back: RigidBody = physics.createCube (width: boxWidth, height: boxHeight, depth: boxTickness); back.movable = falso; back.z = - (boxDepth + boxThickness) / 2 Away3dMesh (back.skin) .mesh.material = wallTexture var ground: RigidBody = physics.createCube (width: boxWidth, height: boxTickickness, depth: boxDepth, segmentW: 2, segmentosH: 2); suelo. movible = falso; ground.y = - (boxHeight + boxThickness) / 2 Away3dMesh (ground.skin) .mesh.material = groundTexture Away3dMesh (ground.skin) .mesh.pushback = true

Parece un buen lío :) En realidad no. Haga clic en las paredes del cuadro en la siguiente demostración para saber cómo establecemos su posición:


Usamos los cubos como paredes, pero para eso usamos physics.createCube, no puedes configurar el material directamente en los parámetros. El plugin Jiglib Away3D no lo permite (aunque puede cambiar el archivo Away3DPhysics.as para permitirlo si lo desea). Para cambiar el material necesitamos obtener el objeto original de Away3D:

Away3dMesh (rigidObject.skin) .mesh

Al usar esto, unimos nuestras texturas a las caras de nuestras paredes. Ponemos movible en falso porque no queremos que se muevan, ¿verdad? :) Cuando creamos terreno, también establecemos su propiedad pushback en true, por lo que el suelo no podrá saltar por encima de las paredes.

Paso 11: Creando un dado

function createDice (): void var dice: RigidBody = physics.createCube (width: diceScale, height: diceScale, depth: diceScale); dice.y = 500 dice.movable = verdadero Cubo (Away3dMesh (dice.skin) .mesh) .cubeMaterials.left = diceTextures [0] Cubo (Away3dMesh (dice.skin) .mesh) .cubeMaterials.right = diceTextures [1] Cubo (Away3dMesh (dice.skin) .mesh) .cubeMaterials.front = diceTextures [2] Cubo (Away3dMesh (dice.skin) .mesh) .cubeMaterials.back = diceTextures [3] Cube (Away3dMesh (dice.skin) .mesh ) .cubeMaterials.top = diceTextures [4] Cubo (Away3dMesh (dice.skin) .mesh) .cubeMaterials.bottom = diceTextures [5] dices.push (dados)

Como puedes ver es muy simple. Básicamente creamos un cubo y adjuntamos texturas a sus caras. Para adjuntar diferentes texturas a diferentes caras usamos materiales cúbicos. Los materiales cúbicos tienen 6 propiedades que usamos. Estos son:

  • frente
  • atrás
  • parte superior
  • fondo
  • izquierda
  • Correcto

Puede configurar cualquier material para ellos, pero usamos elementos de las texturas de dados que creamos en el paso 8.

Paso 12: Restablecer dados

 función resetOnlyPositions (): void for (var i: int = 0; i 

En estas funciones reajustamos sus posiciones. La primera es para empezar. El segundo se ejecuta cuando el usuario hace clic en el escenario. La segunda función también agrega fuerzas aleatorias a los dados. Esto hace que nuestros dados comiencen a caer..

Paso 13: Agregar fuerzas aleatorias a los dados

función addRandomForce (rígida: RigidBody) var forceX: Number = + Math.random () * (diceRandomForce) var forceY: Number = + Math.random () * (diceRandomForce) var forceZ: Number = + Math.random () * (diceRandomForce) rigid.addBodyForce (nuevo JNumber3D (forceX, forceY, forceZ), nuevo JNumber3D (rigid.x + diceScale, rigid.y, rigid.z)) rigid.addBodyForce (nuevo JNumber3D (-forceX, -forceY, -forceZ ), nuevo JNumber3D (rigid.x - diceScale, rigid.y, rigid.z))

Primero obtenemos valores aleatorios para nuestras fuerzas. Con estos valores, aplicamos fuerzas en direcciones opuestas a los lados opuestos de cada dado. Esto obliga a los dados a girar..

Paso 14: Oyentes

function initListeners (): void stage.addEventListener (Event.ENTER_FRAME, render); stage.addEventListener (MouseEvent.MOUSE_DOWN, resetAllDices)

En esta función, agregamos oyentes MOUSE_DOWN y ENTER_FRAME al escenario..

Paso 15: Rendering

función render (e: Evento): void view.render (); camera.targetpanangle = stage.mouseX / stage.stageWidth * 360 camera.targettiltangle = stage.mouseY / stage.stageHeight * 30 camera.hover (); physics.step (); light.x = camera.x light.y = camera.y light.z = camera.z

La primera línea de esta función representa el 3D. Luego usamos la proporción verdadera en matemáticas para rotar la cámara usando las posiciones del mouse. Luego igualamos la dirección de la luz a las posiciones de nuestra cámara. Esto hace que nuestra luz sea dinámica y nuestro experimento se vea muy bien.

Paso 16: último paso

initAway3D (); createWalls (); createDice (); createDice (); resetOnlyPositions () initListeners ();

Llamamos a nuestras funciones una por una. Llamé a la función createDice () dos veces, así que hay 2 dados en la demostración. Puedes agregar lo que quieras.

De acuerdo. Estamos listos. Pon a prueba tu trabajo y haz clic en el escenario :)

Conclusión

En este tutorial aprendimos cómo usar Jiglib con Away3D y construir un experimento simple.

Espero que les haya gustado, gracias por leer.!