Bygg ditt eget WebGl Physics-spill

Sep 17, 2025
hvordan
[1. 3]

Dette prosjektet vil bli delt opp i forskjellige deler. Vi vil gi en kort introduksjon til Heroku, vise hvordan du bruker fysijs med tre.js, forklare hvordan du håndterer sockethendelser over node.js og hvordan vi går om å håndtere de sendte dataene.

  • 20 fantastiske eksempler på webgl i aksjon

01. Heroku

Heroku is an easy to use and free to trial node.js web server

Heroku er en enkel å bruke og gratis trial node.js webserver

Dette prosjektet vil bli vert på Heroku. , som er en skyplattform for å være vert for appene dine. Den har et bredt utvalg av støttede språk som Ruby, Java, PHP og Python. Vi skal bruke node.js.

Registrer deg for en konto og velg node.js. For dette prosjektet kan vi bruke den grunnleggende serveren, som er gratis. Etter registrering kommer du til Dashboarden din der du kan opprette appen din. Dette vil skape et underdomene på herokuapp.com.

Som en distribusjonsmetode kan du velge å enten bruke HEROKU-kommandolinjegrensesnittet (CLI) for å distribuere ved hjelp av GIT-depotet, eller ha en tilkobling satt opp til GitHub eller Dropbox. Jeg har valgt å gå med sin CLI; Dette vil kreve en installasjon. Men i retur får du en rekke nye nyttige verktøy, en av disse er live feilsøking gjennom terminalen din.

For å konfigurere serveren anbefaler jeg at du følger trinnene Som beskrevet her .

For å distribuere du bruker standard git-kommandoer. Hver du bruker vil utløse byggeserveren, og appen din vil bli distribuert til Heroku-serveren og deretter synlig på underdomenet.

Når koden er distribuert, kan du se prosjektet ditt på [YourProject] .HerokuApp.com. Hvis du vil vise loggene, bruk kommandoen 'HEROKU LOGS - Tail' i terminalen din. Noen av de tingene som vises, er det som blir servert til klienten - den viser stikkontaktene, og hvis du vil feilsøke koden din, kan du også bruke konsollen. Log for å utdrive til terminalen.

02. Bygg fysikkscenen

Tap your screen or hit the spacebar to bounce the table up

Trykk på skjermen eller trykk mellomromstasten for å sprette bordet opp

Vi vil bruke de mest populære Webgl. rammeverk, tre.js. , for å bygge en 3D-scene som inneholder et objekt som vi legger til fysikk. Fysikkbiblioteket av valg er Physijs. , en plug-in for tre.js. Som en forlengelse til tre.js bruker fysijs den samme kodekonvensjonen, noe som gjør det enklere å bruke hvis du allerede er kjent med tre.js.

Det første er biljardbordet. Vi bruker fysijs HeightfieldMesh. , Fordi dette nettverket vil lese høyden fra planetometrien. Så det vil i utgangspunktet vikle seg rundt tre.js-objektet.

 VAR TableGeometri = Ny tre.Planeegeometri (650, 500, 10, 10);
VAR Tablemater materiale = fysijs.createMaterial (
  nytt tre.Meshphongmaterial ({
    Shininess: 1,
    Farge: 0xb00000,
    Emissive: 0x111111,
    Side: Three.Doubleside.
  }),
  .8, // friksjon
  .4 // Restitution.
);
Tabell = Ny Physijs.HeightfieldMesh (TableGeometri, tables materiale, 0); 

HeightfieldMesh. Krever en geometri, men også et fysijs materiale. Vi legger til to nye funksjoner til tre.js-materialet. De er den friksjon og restitusjon variabler. Friksjon er motstanden objektet gjør, og restitusjon refererer til "bounciness". Disse to variablene vil definere hvor ekte fysikken vil føle seg i din scene.

For de opprettede bassengkulene vil vi ikke gjøre dem for hoppende, så hold nummeret lavt. Som tre.js har fysijs også en rekke grunnleggende former for å gå rundt i det opprinnelige nettverket. SPHEREMESH. Innpakning av det SPompæltometri vil gi ballfysikken. Når vi initialiserer scenen, kaller vi Buildball (8) , som vil utløse følgende funksjon ...

 var buildball = funksjon (nummerball) {
 var balltekstur = ny tre.Texture ();
 var ballindex = ball.length; 

Legg til tekstur:

 BallTexture = tre.Imageutils.loadTexture ('Tekstur /' + nummerball + '_ball.jpg', funksjon (bilde) {
     ballteksture.image = bilde;
  }); 

Opprett Physijs-aktivert materiale med noen anstendig friksjon og sprettegenskaper:

var ballmaterial = fysijs.createMaterial (
    nytt tre.Meshlambertmaterial ({
      Kart: Balltexture,
      Shininess: 10,
      Farge: 0XDDDDD,
      Emissive: 0x111111,
      Side: Three.frontside.
    }),
    .6, // friksjon
    .5 // Restitution.
  ); 

Tekstur kartlegging:

 ballmaterial.map.wraps = ballmaterial.map.wrapt = three.repeArtwrapping;
  ballmaterial.map.repeat.Set (1, 1);
 Lag den fysikkaktiverte sfæremeshen, og start den opp i luften:

  ball [ballindex] = ny fysijs.Spheremesh (
    Ny tre.SphereGeometri (25, 25, 25),
    ballmateriale,
    100.
  );
  // y kompensert til toppen av lerretet
  ball [ballindex] .position.y = 500;
  // skygger
  ball [ballindex] .receiveshadow = sant;
  ball [ballindex] .castshadow = sant;
  // Legg til ballen til lerretet ditt
  scene.add (ball [ballindex]);
};

Vi legger til tekstur fra en .jpg-fil. Skape materialet og bruk det for SPHEREMESH. Å lage objektet, som vi vil plassere vertikalt til toppen, slik at den faller inn på skjermen.

03. Stikkontakter tilkobling

The key goal of our game is emulating the physical movements to the screen

Nøkkelmålet med vårt spill er å emulere de fysiske bevegelsene på skjermen

For kommunikasjon mellom serveren og klienten, vil vi bruke socket.io. . Dette er en av de mest pålitelige bibliotekene som er tilgjengelige for node.js. Den er bygget på toppen av WebSockets API.

Nå er fysikk aktivert for maskene vi trenger brukerinngang for å gjøre spillet interaktivt. Inngangsenheten vi bruker er mobilenheten. Mobilbrowseren er kontrolleren som vil gi data fra akselerometeret og gyroskopet til skrivebordet hvor du vil se spillet.

Først av må en forbindelse mellom mobilnettleseren og skrivebordsbrowseren gjøres. Hver gang en nettleser kobles til vår node.js app, må vi lage en ny tilkobling. En klientsiden tilkobling er opprettet ved å bruke følgende:

 var stikkontakt = io.Connect (); 

For å sende meldinger du bruker emit. funksjon:

 socket.emit ('Event Name', Data); 

Og for å motta deg bruker du .på() funksjon:

 socket.on ('hendelsesnavn', funksjon () {}); 

03.1. Sette opp skrivebordet spillet

Hvis vi er på skrivebordet, vil vi sende våre stikkontakter en enhet avgir å fortelle serveren vår skrivebordet er spillet med følgende linje med kode:

 var socket = io.Connect ();
// Når du starter velkomstmelding, svar med 'Game' -type
socket.on ('velkommen', funksjon (data) {
  socket.emit ("Enhet", {"type": "spill"});
}); 

Serveren vil returnere oss en unik nøkkel / spillkode generert av Crypto. . Dette vil bli vist på skrivebordet.

 // Generer en kode
Var GameCode = Crypto.RandomBytes (3) .Tostring ('hex'). Substring (0, 4) .tolowercase ();
// sikre unikhet
mens (gamecode i socketcodes) {
  GameCode = Crypto.RandomBytes (3) .Tostring ('hex'). Substring (0, 4) .Tolowercase ();
}
// lagre spillkode - & gt; Socket Association.
SocketCodes [GameCode] = IO.Sockets.Sockets [Socket.ID];
Socket.GameCode = GameCode 

Fortell spillklient å initialisere og vise spillkoden til brukeren ...

 socket.emit ("Initialize", GameCode); 

03.2. Koble kontrolleren til spillet

For å koble mobilenheten til spillet, vil vi bruke et skjema for å sende inn spillkoden fra skrivebordet. På skjemaet sendes vi spillkoden til serveren for godkjenning.

 socket.emit ("Enhet", {"Type": "Controller", "GameCode": GameCode}); 

Serveren vil sjekke om spillkoden er gyldig og vil sette opp forbindelsen med skrivebordsspillet

 hvis (enhet.gamecode i SocketCodes) {
  // Lagre spillkoden for kontrollerkommandoer
  socket.gamecode = enhet.gamecode.
  // initialiser kontrolleren
  socket.emit ("tilkoblet", {});
  // start spillet
  socketcodes [enheten.gamecode] .emit ("Connected", {});
} 

Når tilkoblingen er alt satt, vil vi da gi 8-ballen et lite trykk fra X og Z med følgende kommando ...

 ball 
.setLinearvelocity (ny tre.Vector3 (30, 0, 30)

04. Sende data

Nå som forbindelsen er etablert, vil vi sende gyro og akselerometervariabler til spillet. Ved å bruke den window.ondevicemotion. og window.ondeviceorientering Hendelser, vi har dataene vi trenger for å etterligne de samme tiltbevegelsene i telefonen til biljardbordet. Jeg har valgt å bruke et intervall på 100ms for å avgi disse verdiene.

SetInterval (funksjon () {
  socket.emit ('send gyro', [Math.Round (Roty), Math.Round (Rotx), AY, AX]);
}, intervalltid); 

På klientsiden vil vi løse latensen ved å tweening de innkommende verdiene fra serveren til tilt av biljardbordet. For tweening vi bruker Tweenmax. .

 // Håndter innkommende Gyro-data
socket.on ('ny gyro', funksjon (data) {
  var degy = data 
& lt; 0? Math.abs (data
): -Data
; Tweenmax.to (tabell.Rotasjon, 0,3, { X: Degtorad (Degy - 90), Y: Degtorad (data
), Enkel: Linear.Emenone, OnupDate: Funksjon () { Tabell .__ DirtyRotation = sant; } }); });

05. Ekstra hendelser

More balls equals more fun. Try hitting the spacebar or tapping the screen of your mobile

Flere baller er lik morsommere. Prøv å treffe mellomromstasten eller trykke på skjermen på mobilen din

For å gi det litt mer interaktivitet, har jeg lagt til et par ekstra hendelser for brukeren å leke med. Vi skal gi brukeren muligheten til å legge til ekstra baller ved siden av 8-ballen ved hjelp av tallene på tastaturet.

En annen er å sprette bordet oppover. For dette kan du slå mellomromstasten. Men vi legger også til en trykkhendelse på kontrollerenheten. Dette vil sende en hendelse til biljardbordet, som vil stige bordet og sende ballene opp.

Først må vi fange tastaturarrangementene ...

 // Lag baller / slambord på mellomromstasten
Document.AddeventListener ('KeyDown', Funksjon (E) {
  hvis (e.keycode == 49) {// nøkkel: 1
    buildball (1);
  } ellers hvis (e.keycode == 50) {// nøkkel: 1
    buildball (2);
  } ellers hvis (e.keycode == 51) {// nøkkel: 1
    buildball (3);
  } ellers hvis (e.keycode == 32) {// nøkkel: mellomromstasten
    bouncetable ();
  }
}); 

De Buildball Funksjonen er den samme funksjonen vi pleide å lage sfæren 8-ballen. Vi bruker bare forskjellige teksturer som vil vikle sfæren. For å skyve bordet opp, gir vi bordet en oppadgående bevegelse langs y-aksen med denne koden ...

 tabell.SetLinearVelocity (ny tre.Vector3 (0, 500, 0)); 

Konklusjon

Add more balls and see how much your browser can handle

Legg til flere baller og se hvor mye nettleseren din kan håndtere

Når du har et konsept for et spill eller noe annet, er det helt sannsynlig at det er biblioteker der ute som kan gjøre livet enklere. Dette er en demo som viser hvordan dette kan fungere. Vi håper dette vil bidra til å gi noen kreative ideer eller hjelpe deg med ditt nåværende prosjekt. Se et live eksempel på spillet her , eller finn den på GitHub. .

Denne artikkelen ble opprinnelig publisert i utgave 300 av nett , verdens toppmagasin for profesjonelle webdesignere og utviklere. Kjøp utgave 300. eller Abonner her .

Relaterte artikler:

  • Kom i gang med WebGL ved hjelp av tre.js
  • 20 JavaScript-verktøy for å blåse ditt sinn
  • Lag interaktive 3D-visuelle med tre.js

hvordan - Mest populære artikler

Kom i gang med flamme maleren

hvordan Sep 17, 2025

Flame Painter er en frittstående maling og partikkel effekter pakke som gjør at du raskt og enkelt vil skape originale malerier, lyse effekter, ukonvensjonelle design eller fantastiske bakg..


Figur tegning: En nybegynnerhåndbok

hvordan Sep 17, 2025

[1. 3] Side 1 av 3: Hvordan tegne en figur: Kvinne Hvordan tegne en figur:..


7 Topptips for å starte din egen virksomhet

hvordan Sep 17, 2025

[1. 3] Hvis du har følt deg fast i en kreativ rut, kan det være verdt å ha et øyeblikk å ta vare på din karriere og bestemme..


Lag din egen kalligrafiske børste i Illustrator

hvordan Sep 17, 2025

[1. 3] En av de beste tingene om Illustrator er evnen til å lage dine egne børster. Du kan finne noen fantastiske gratis illustr..


Hvordan designe troverdige fantasy dyr

hvordan Sep 17, 2025

[1. 3] Det er mange måter å nærme seg skapning og karakter design , og alt avhenger av hva du vil at sluttresult..


Hvordan bygge raskere nettsteder

hvordan Sep 17, 2025

[1. 3] Foran hans snakk på Generere London 21. september fanget vi opp med Patrick Hamann. , en web..


Hvordan forbedre ytelsen til e-handelsplasser

hvordan Sep 17, 2025

[1. 3] Tammy Everts. vil gi en presentasjon om sammenhengen mellom design, ytelse og konverteringsfrek..


Lag et responsivt dashbord med figma

hvordan Sep 17, 2025

Figma er et grafikkverktøy for UI-designere. Den har et enkelt grensesnitt og gjør det mulig å samarbeide på jobb med lagkameratene dine. Hvis du vil jobbe offline, kan du velge å bruke ..


Kategorier