Throwing Dice Med JigLib Physics Engine og Away3D
to
Del
Del
Del
Denne Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen vil vi bygge en boks som vi kan kaste terninger inn. For å gjøre dette vil vi bruke Away3D som 3D-motor og JigLib som fysikkmotor. La oss sette seg fast i ..
Trinn 1: New Actionscript 3.0 File
Som tittelen antyder, først skal vi skape en ny Actionscript 3.0 fil
Trinn 2:.. Rediger profil
I panelet Egenskaper trykker på knappen Rediger
Trinn 3: Velg Flash Player versjon
Velg Flash Player 9 profilen, og klikk OK
Trinn 4:.! Få Away3D Engine
Lagre filen som "3D Dice.fla" i en ny mappe som heter "3D Dice". Nå laste ned Away3D motoren Away3D nedlastinger. Vi vil bruke versjon 2.3.3 for Flash Player 9. Pakk et arkiv og kopiere alle mapper i "3D Dice" -mappen
Trinn 5:.! Få JigLib Physics Engine for Flash
Du må installere en SVN program for å få disse kildefilene. Her er SVN adresse. Hvis du ikke ønsker å forholde seg til alt som kan du også få dem fra kildefilene for denne tut. Når du flytter Away3D og JigLib klasser til din 3D Dice Dokumenter-mappen skal se slik ut:
Trinn 6: Import Tekstur
Jeg har tegnet noen teksturer for vår terning. Selvfølgelig kan du endre disse, men de er ikke dårlig :) Du kan finne andre teksturer i kildefilen.
Dice Tekstur:
Nå må vi gi dem koblingsnavnene for å feste dem i runtime (gjør dette for hvert bilde i biblioteket én etter én):
Velg bilde, høyreklikk > Egenskaper
Eksporter for Action > Fjern ".png" del
Trinn 7: Begynn Coding
OK, vi er klare til å starte koding. Først importerer vi våre klasser:....
Import away3d.cameras *; import away3d.containers *, import away3d.materials *, import away3d.primitives * import away3d.lights.DirectionalLight3Dimport jiglib.physics.RigidBody; import JigLib .plugin.away3d.Away3DPhysics, importere jiglib.plugin.away3d.Away3dMesh, importere jiglib.math.JNumber3D
Trinn 8: Oppsett Variabler
Etter import våre klasser må vi definere våre variabler for å bruke dem i de kommende trinnene
Var scene: Scene3D; Var kamera:. HoverCamera3D; Var Vis: View3D, Div lys: DirectionalLight3D; Var fysikk: Away3DPhysics; Var boxWidth: Number = 250var boxHeight: Number = 30var boxDepth: Number = 250var boxThickness: Antall = 5var diceTextures: Array = [ny WhiteShadingBitmapMaterial (ny diceTexture1 (0,0)), ny WhiteShadingBitmapMaterial (ny diceTexture2 (0,0)), ny WhiteShadingBitmapMaterial (ny diceTexture3 (0,0)), ny WhiteShadingBitmapMaterial (ny diceTexture4 ( 0,0)), ny WhiteShadingBitmapMaterial (ny diceTexture5 (0,0)), ny WhiteShadingBitmapMaterial (ny diceTexture6 (0,0))] Var wallTexture: WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial (ny walltexture (0,0)) Var groundTexture: WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial (ny groundtexture (0,0)) Var diceScale: Number = 30var terningkast: Array = new Array () Var diceRandomForce: Number = 50
Som du kanskje har gjettet, de første er for Away3D. Variabelnavnene er enkle, slik at du kan gjette hva de er for.
diceTextures holder terningene står overfor teksturer. Vi tar terningteksturbilder fra biblioteket og sette dem inn WhiteShadingBitmapMaterial. Vi velger dette materialet fordi det vil holde ting lys og for å ytterligere forbedre ytelsen vil det også bli flat. WhiteShadingBitmapMaterial er den beste for våre behov.
wallTexture og groundTexture bruke forskjellige bilder. Ved hjelp av en av disse i vårt tilfelle ville se forferdelig
Trinn 9:.. Setup Away3D
Neste må vi bygge Away3D
funksjon initAway3D (): void {scene = new Scene3D ( ); Kameraet = new HoverCamera3D (); camera.distance = 300 lys = new DirectionalLight3D ({color: 0xFFFFFF, ambient: 0,25, diffuse: 0,75, speil: 0,9}) scene.addChild (lys) view = new View3D ({scene: scene, kamera: Kameraet}); view.x = stage.stageWidth /2; view.y = stage.stageHeight /2; addChild (vis); fysikk = nye Away3DPhysics (vis, 4)}
Den første linjen i denne funksjonen skaper vår 3D-scene, der vi legger til 3D-objekter. For kameraet velger vi HoverCamera3D. HoverCamera er den beste måten å slå på kameraet rundt objektene. Egentlig trenger du ikke å bruke lys til dette prosjektet, men det gjør eksperimentet kult :) Vi skaper Vis og sette den i midten av scenen.
Til slutt, skaper vi nye Away3DPhysics. Den første paremeter er "View3D" og den andre er "gravitasjonen" (jeg bruker 4, men hvis du vil kan du prøve et annet nummer)
Trinn 10:. Opprette Walls
funksjons createWalls (): void { Var venstre: RigidBody = physics.createCube ({width: boxThickness, høyde: boxHeight, dybde: boxDepth}); left.movable = false; left.x = - (boxWidth + boxThickness) /2 Away3dMesh (left.skin) .mesh.material = wallTexture Var akkurat: RigidBody = physics.createCube ({width: boxThickness, høyde: boxHeight, dybde: boxDepth}); right.movable = false; right.x = (boxWidth + boxThickness) /2 Away3dMesh (right.skin) .mesh.material = wallTexture Var front: RigidBody = physics.createCube ({width: boxWidth, høyde: boxHeight, dybde: boxThickness}); front.movable = false; front.z = (boxDepth + boxThickness) /2 Away3dMesh (front.skin) .mesh.material = wallTexture Var tilbake: RigidBody = physics.createCube ({width: boxWidth, høyde: boxHeight, dybde: boxThickness}); back.movable = false; back.z = - (boxDepth + boxThickness) /2 Away3dMesh (back.skin) .mesh.material = wallTexture Var bakken: RigidBody = physics.createCube ({width: boxWidth, høyde: boxThickness, dybde: boxDepth, segmentsW: 2, segmentsH: 2}); ground.movable = false; ground.y = - (boxHeight + boxThickness) /2 Away3dMesh (ground.skin) .mesh.material = groundTexture Away3dMesh (ground.skin) .mesh.pushback = true}
Det ser ut som et rot rett :) Egentlig ingen . Klikk på veggene i boksen i følgende demo for å lære hvordan vi satt sin stilling:
Vi bruker Cubes som vegger, men å gjøre det vi bruker physics.createCube, du kan ikke sette materialet i parametre direkte. JigLib Away3D plugin tillater ikke dette (men du kan endre Away3DPhysics.as fil for å tillate det hvis du vil). For å endre materialet vi trenger for å få den opprinnelige Away3D objekt:
Away3dMesh (rigidObject.skin) .mesh
Ved å bruke dette legger vi våre teksturer til ansiktene våre vegger. Vi setter bevegelig til false fordi vi ikke vil at de skal flyttes rett? :) Når vi skaper bakken vi også satt sin pushback eiendom til sann, så bakken vil ikke være i stand til å hoppe over veggene
Trinn 11:. Opprette en Die
funksjon createDice (): void {var terningen: RigidBody = physics.createCube ({width: diceScale, høyde: diceScale, dybde: diceScale}); dice.y = 500 dice.movable = true Cube (Away3dMesh (dice.skin) .mesh) .cubeMaterials.left = diceTextures [0] Cube (Away3dMesh (dice.skin) .mesh) .cubeMaterials.right = diceTextures [1] Cube (Away3dMesh (dice.skin) .mesh) .cubeMaterials.front = diceTextures [2] Cube (Away3dMesh (dice.skin) .mesh) .cubeMaterials.back = diceTextures [3] Cube (Away3dMesh (dice.skin) .mesh ) .cubeMaterials.top = diceTextures [4] Cube (Away3dMesh (dice.skin) .mesh) .cubeMaterials.bottom = diceTextures [5] dices.push (terning)}
Som du kan se er det veldig enkelt. Vi i utgangspunktet lage en kube og legge teksturer til sine ansikter. Å feste forskjellige teksturer til forskjellige ansikter vi bruker cubeMaterials. cubeMaterials har 6 egenskaper som vi bruker. Disse er:
foran
tilbake
toppen
nederst
forlot
høyre
Du kan stille inn noe materiale til dem, men vi bruker elementer av diceTextures vi opprettet i trinn 8.
Trinn 12: Tilbake Dice
funksjons resetOnlyPositions (): void {for ( Var i: int = 0; i < dices.length; i ++) {terninger [i] .moveTo (ny JNumber3D (0, 100 + i * (diceScale + 10), 0))}} funksjons resetAllDices (e: MouseEvent) : void {for (var i: int = 0, jeg < dices.length; i ++) {terninger [i] .moveTo (ny JNumber3D (0, 100 + i * (diceScale + 10), 0)) addRandomForce (terninger [ ,,,0],i])}}
I disse funksjonene vi har null sine posisjoner. Den første er for begynnelse. Den andre går når brukeren klikker på scenen. Den andre funksjonen legger også tilfeldige krefter på terningen. Dette gjør våre terninger begynner å riste
Trinn 13:. Legge Tilfeldige Forces å Terninger
funksjon addRandomForce (rigid: RigidBody) {var forceX: Number = + Math.random () * (diceRandomForce) Var forceY : Number = + Math.random () * (diceRandomForce) Var forceZ: Number = + Math.random () * (diceRandomForce) rigid.addBodyForce (ny JNumber3D (forceX, forceY, forceZ), ny JNumber3D (rigid.x + diceScale , rigid.y, rigid.z)) rigid.addBodyForce (ny JNumber3D (-forceX, -forceY, -forceZ), ny JNumber3D (rigid.x - diceScale, rigid.y, rigid.z))}
Først vi får tilfeldige verdier for våre styrker. Med disse verdiene gjelder vi krefter i motsatte retninger til motsatte sider av hver dør. Dette tvinger terningen å spinne
Trinn 14: lyttere
funksjons initListeners (). Void {stage.addEventListener (Event.ENTER_FRAME, render); stage.addEventListener (MouseEvent.MOUSE_DOWN, resetAllDices)}
I denne funksjonen vi legge MOUSE_DOWN og ENTER_FRAME lyttere til scenen
Trinn 15:. Rende
funksjon render (e: Hendelses): 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}
Den første linjen av denne funksjonen gjengir 3D. Deretter bruker vi ekte andel i matematikk for å rotere kameraet ved hjelp av muse stillinger. Deretter utjevne lysretningen til posisjonene til vår kameraet. Dette gjør vår lys dynamisk og gjør vårt eksperiment ser ganske kult
Trinn 16:. Siste Step
initAway3D();createWalls();createDice();createDice();resetOnlyPositions()initListeners();
We kalle våre funksjoner én etter én. Jeg ringte createDice () -funksjonen to ganger, så det er 2 terninger i demoen. Du kan legge til hvor mange du vil.
Ok. Vi er klare. Test arbeidet ditt og klikk scenen :)
Konklusjon
I denne opplæringen lærte vi hvordan vi skal bruke JigLib med Away3D og bygge et enkelt eksperiment.
Jeg håper du likte det, takk for lesing!