Att göra en grundläggande 3D-motor i Java (3 / 5 steg)

Steg 3: Klassen Camera

Nu låt oss ta en omväg och ställa in klassen Camera. Klassen Camera håller reda på var spelaren ligger i 2D-kartan, och tar också hand om uppdatering av spelarens position. För att göra detta i klassen kommer att genomföra KeyListener, så det kommer att behöva importera KeyEvent och KeyListener.

importera java.awt.event.KeyEvent; < br > import java.awt.event.KeyListener;

Många variabler för att hålla reda på kamerans position och vad det kan se. På grund av detta första bit av klassen ser ut så här:

allmän klass kamera implementerar KeyListener {
offentliga dubbel xPos, yPos, xDir, yDir, xPlane, yPlane;
offentliga boolean vänster, höger, fram, tillbaka;
offentliga slutliga dubbel MOVE_SPEED =. 08;
offentliga slutliga dubbel ROTATION_SPEED =. 045;

xPos och yPos är platsen för spelaren på 2D-kartan som har skapats i klassen spel. xDir och yDir är x och y komponenter i en vektor som pekar i riktningen spelaren står inför. xPlane och yPlane är också x och y komponenter i en vektor. Vektorn definieras av xPlane och yPlane är alltid vinkelrät riktning vektorn och den pekar på den yttersta kanten av kamerans synfält på ena sidan. Längst kanten på andra sidan är bara negativa plan vektorn. Kombinationen av vektorn riktning och planet vektorn definierar vad som är i kamerans synfält. De booleska värden används för att hålla reda på vilka tangenter som trycks av användaren så att användaren kan flytta kameran. MOVE_SPEED och ROTATION_SPEED diktera hur snabbt kameran rör sig och vänder medan användaren är att trycka på motsvarande knapp.

Nästa är konstruktören. Konstruktören tar i värden som berättar för klassen där kameran ligger och vad det kan se och tilldelar dem till den motsvarande variabeln (xPos, yPos...).

offentliga kamera (double x, dubbla y, dubbel xd, dubbel yd, dubbel xp, dubbel yp)
{
xPos = x;
yPos = y;
xDir = xd;
yDir = yd;
xPlane = xp;
yPlane = yp;
}

En kamera objekt kommer att behövas i sista programmet, så låt oss gå vidare och Lägg till ett. I spelet klass med alla de andra variabeldeklarationer lägga till i

offentliga kamera kamera;

och i konstruktören lägger till i

kamera = ny kamera (4,5 4,5, 1, 0, 0,-. 66);
addKeyListener(camera);

Denna kamera kommer att arbeta med kartan jag använder, om du använder en annan karta eller justera värdena xPos och yPos (4 och 6 i mitt exempel) om du vill börja på en annan plats. Med hjälp av.66 ger vad jag känner är ett bra synfält, men du kan justera värdet för att få en olika FOV.

Nu när klassen Camera har en konstruktör kan vi börja lägga till metoder att spåra användaren ingångar och att uppdatera kamerans position/orientering. Eftersom klassen Camera implementerar KeyboardListener måste alla metoder från det genomförs. Eclipse bör automatiskt uppmana dig att lägga till dessa metoder. Du kan lämna den keyTyped metoden tomt, men de andra två metoderna ska användas. keyPressed ställer booleans till true när deras motsvarande tangenter trycks, och keyReleased kommer att ändra dem tillbaka till false när knapparna kommer. Metoderna som ser ut så här:

public void keyPressed (KeyEvent key) {
IF((Key.getKeyCode() == KeyEvent.VK_LEFT))
vänster = sant;
IF((Key.getKeyCode() == KeyEvent.VK_RIGHT))
höger = sant;
IF((Key.getKeyCode() == KeyEvent.VK_UP))
framåt = sant;
IF((Key.getKeyCode() == KeyEvent.VK_DOWN))
tillbaka = sant;
}

och

public void keyReleased (KeyEvent key) {
IF((Key.getKeyCode() == KeyEvent.VK_LEFT))
vänster = false;
IF((Key.getKeyCode() == KeyEvent.VK_RIGHT))
höger = false;
IF((Key.getKeyCode() == KeyEvent.VK_UP))
framåt = false;
IF((Key.getKeyCode() == KeyEvent.VK_DOWN))
tillbaka = false;
}

Nu när klassen Camera är att hålla spår som tangenter trycks ned kan vi börja uppdatera spelarens position. Att göra detta kommer vi att använda en uppdateringsmetod som kallas i metoden kör i klassen spel. Medan vi är på det vi ska gå vidare och lägga till kollision upptäckt metoden update genom att skicka kartan till den när den anropas i klassen spel. Metoden update ser ut så här:

public void uppdatera (int [] [] karta) {
IF(forward) {
IF(Map[(int) (xPos + xDir * MOVE_SPEED)] [(int) yPos] == 0) {
xPos += xDir * MOVE_SPEED;
}
IF(Map[(int)xPos][(int) (yPos + yDir * MOVE_SPEED)] == 0)
yPos += yDir * MOVE_SPEED;
}
IF(back) {
IF(Map[(int) (xPos - xDir * MOVE_SPEED)] [(int) yPos] == 0)
xPos-= xDir * MOVE_SPEED;
IF(Map[(int)xPos][(int) (yPos - yDir * MOVE_SPEED)] == 0)
yPos-= yDir * MOVE_SPEED;
}
IF(Right) {
Double oldxDir = xDir;
xDir=xDir*Math.cos(-ROTATION_SPEED) - yDir*Math.sin(-ROTATION_SPEED);
yDir=oldxDir*Math.sin(-ROTATION_SPEED) + yDir*Math.cos(-ROTATION_SPEED);
Double oldxPlane = xPlane;
xPlane=xPlane*Math.cos(-ROTATION_SPEED) - yPlane*Math.sin(-ROTATION_SPEED);
yPlane=oldxPlane*Math.sin(-ROTATION_SPEED) + yPlane*Math.cos(-ROTATION_SPEED);
}
IF(Left) {
Double oldxDir = xDir;
xDir=xDir*Math.cos(ROTATION_SPEED) - yDir*Math.sin(ROTATION_SPEED);
yDir=oldxDir*Math.sin(ROTATION_SPEED) + yDir*Math.cos(ROTATION_SPEED);
Double oldxPlane = xPlane;
xPlane=xPlane*Math.cos(ROTATION_SPEED) - yPlane*Math.sin(ROTATION_SPEED);
yPlane=oldxPlane*Math.sin(ROTATION_SPEED) + yPlane*Math.cos(ROTATION_SPEED);
}
}

De delar av metoden som kontroll framåt och bakåt rörelse arbete genom att lägga xDir och yDir till xPos och yPos, respektive. Innan denna rörelse händer kontrolleras om rörelsen kommer att sätta kameran inuti en vägg, och inte gå igenom med rörelse om det kommer. För rotation både riktning vektorn och planet vektor multipliceras med rotation matrix, som är:

[cos(ROTATION_SPEED)-sin(ROTATION_SPEED)]
[sin(ROTATION_SPEED) cos(ROTATION_SPEED)]

för att få deras nya värden. Med metoden update avslutade kan vi nu kalla det från klassen spel. I spelet klassens kör metoden tillägga den följande lina av koden där det visas här

Lägg till detta:
Camera.Update(Map);
i här:
While(Running) {
länge nu = System.nanoTime();
delta = delta + ((now-lastTime) / ns);
lastTime = nu;
medan (delta > = 1) //Make säker uppdatering sker endast 60 gånger per sekund
{
hanterar all logik begränsad tid
Camera.Update(Map);
delta--;
}
Render (), //displays till dess att skärmen obegränsad
}

Nu när det är gjort kan vi äntligen gå vidare till den sista klassen och beräkna skärmen!

Se Steg
Relaterade Ämnen

Att göra en grundläggande privat server i Minecraft

Vill ha ett enkelt sätt att spela Minecraft med dina vänner utan alla troll och irriterande människor på publika servrar? Här är det enklaste sättet att göra en grundläggande lösenordsskyddad server! Detta görs på en mac. Jag tror det är liknande til...

Att göra en grundläggande pappersflygplan

Här är hur man gör en grundläggande pappersflygplan.Steg 1: Få papperUtforma det så det är liggande orienteringSteg 2: Vik papperet på mittenSteg 3: VikSteg 4: Vik ner högra hörnet för att centrera fodrar?Steg 5: Vik ner vänstra hörnet för att centre...

Att göra en grundläggande Roux

göra en grundläggande Roux kan vara en av de enklaste matlagning tekniker som du kan lära dig. Dock kan det användas i på så många sätt. Det är startmotorn för vita frukost sås, till cheesy såser för mac-n-ost och gå över grönsaker, det är också anvä...

Introduktion till ShapeCrete (att göra en grundläggande leaf print)

Detta instructable beskriver att göra en leaf avtryck med ShapeCrete och måla den. Främst, kommer vi att diskutera vad ShapeCrete är och vad man ska göra med detta awesome material.I ett nötskal, är här vad vi kommer att täcka:1. vi kommer att gå öve...

Hur du gör Windows 7 snabbare genom att ändra några grundläggande inställningar - se upp för några knep

Att köra din arbetsdrift systemet snabbare än någonsin tidigare - här är några enkla tips att göra det - inte Glöm att starta om datorn när du har ändrat alla dessa inställningar att göra förändringar effektivt....

Att göra en grundläggande HTML webbplats

vissa människor tror att att göra en hemsida är svårt. De är felSteg 1: där? Du kan prod is html webbplatser med något så enkelt som anteckningar eller text editSteg 2: Se webbplats Html. TypSteg 3: Lägga till innehåll Nu du kan lägga till punkterna...

Android-utveckling: Att skapa en grundläggande kalkylator

Välkommen till en rolig tutorial på att göra en grundläggande kalkylator på en Android-applikation. I denna tutorial guidar jag dig genom dataöverföring all nödvändig programvara, utforma layouten för ansökan, kodning till att få det att fungera orde...

Hur man knyter en grundläggande siffran åtta Knut & att följa genom

en siffra åtta med en bight är en berömd knut i bergsklättring världen. När klättring, skulle du använda en siffra åtta med en bight (ett bett är en loop) att knyta dig själv till din sele för att hindra dig från att falla. Du uppnå knyta en siffra å...

Grundläggande remskiva mekanismer

Från tank slitbanor till cykel redskap till fiske linjer, som remskivor används överallt när det gäller mekaniska transmissioner. Alla typer av remskiva mekanismerna består av någon form av flexibelt bälte (kedja, kabel, rep, etc.) vrida runt omkrets...

Grundläggande raden efter Robot med Arduino

09/07/2015Det har varit några år eftersom vi Ursprungligen postat denna grundläggande linje följande Robot med Arduino handledning, och det verkar så många människor tyckte att det bra att vi ska skicka en uppdatering som löper nuvarande Arduino bibl...

Grundläggande elektronik

att komma igång med grundläggande elektronik är lättare än du kanske tror. Detta Instructable kommer förhoppningsvis att avmystifiera grunderna i elektronik så att alla med intresse i att bygga kretsar kan slå i marken kör. Detta är en snabb översikt...

Grundläggande elmotor Masco G37

Användningen av detta instructable gör att vem som helst att skapa en liten motor. Genom att använda vissa grundläggande material, kan du bygga en motor som snurrar. Den använder de grundläggande principerna för en motor, spolen bildar en elektromagn...

Grundläggande mänskliga skanna med Kinect & ReconstructMe konsolen

detta instructable kommer att täcka den grundläggande processen för att göra en 3D skanning av en mänsklig kropp med hjälp av XBOX 360 Kinect, en Windows-dator och programvara ReconstructMe (konsolen upplaga).ErkännandeNicolas Brunet gjorde en underb...

Justerbar utarbetandet bord med grundläggande verktyg och material

jag har spelat runt med tanken på att få mig en liten utarbetandet bord, som jag hittar den justerbar vinkeln ganska bekväm för ett antal olika saker: Rita, läsa, skriva, arbetar med tangentbord/mus, etc. Först testade jag det ut genom att bara sätta...

1/3 grundläggande skal utmatning pistol.

3 veckor ska jag försöka få till du stötarna skal avkastad steg i att börja på grundläggande då nästa t jag kommer bygga en mellanliggande shell utmatning pistol och då är kommer att göra en expert shell utmatning pistol. så 3 veckor hoppas jag kunna...

Grundläggande läder halvmask

Välkommen!Här hittar du en handledning om att göra en grundläggande läder halfmask (som visar på 2: a bilden).Jag har arbetat med läder i över 15 år, och ville bara dela en grundläggande gå igenom om hur man gör en bra mask av din alldeles egna :)Gär...

Bygga en grundläggande lap steel-gitarr

i detta, min första Instructable, kommer jag försöka krönika byggandet av en enkel Lap Steel guitar. Ansvarsfriskrivning; elverktyg och skarp skärande verktyg kommer att användas och jag tar inget ansvar för människor som använder dessa saker slarvig...

Grundläggande modifierbara Lödstation

Välkommen till min första Instructable för en Lödstation.Det finns många lödning stationer på denna webbplats så varför är detta en speciell?Det är mycket material effektivt, kan fungera för en variant av brödunderläggen, du kan arbeta i olika vinkla...

Grundläggande för verilog

HDl design:Här jag kommer för att förklara om grundläggande funadamental av handstil tvättprogram i verilog .here jag visar att eller operationen gjort av mig med design såväl som testa bänk. prova detta på online programmering webbplatser.Design: fo...