Att göra en grundläggande 3D-motor i Java (2 / 5 steg)
Steg 2: Klassen konsistens
Innan hopp i beräkningarna för att hitta hur skärmen ska se kommer jag att ta en omväg och ställa in en textur klass. Texturer kommer att tillämpas på olika väggar i miljön, och kommer från bilder som har sparats i projektmappen. I bilderna har jag tagit 4 texturer jag hittade på nätet att jag kommer att använda i detta projekt. Du kan använda oavsett texturer du vill. Om du vill använda dessa texturer rekommenderar jag att sätta dem i en mapp i projektfilen. För att göra detta gå till projektmapp (i eclipse detta ligger i mappen arbetsytan). Efter att du får till projektmapp skapa en ny mapp med namnet "res" eller något. Placera texturer i denna mapp. Du kan placera texturer någon annanstans, det är bara där jag förvara min texturer. När detta är gjort kan vi börja skriva koden för att göra texturer kan användas.
Import för klassen är:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
Rubriken klass och dess variabler kommer att se ut så här:
allmän klass textur {
Public int [] pixlar.
privata sträng kontrollinjen.
offentliga slutliga int storlek;
Matrisen pixlar används för att hålla data för alla pixlar i bilden av texturen. Loc används för att ange att datorn där bildfilen för texturen kan hittas. STORLEKEN är hur stor textur är på ena sidan (en 64 x 64 bild skulle ha storlek 64), och alla texturer blir perfekt kvadrat.
Konstruktören kommer att initiera loc och storlek variabler och samtal i en metod för att läsa in bilden i pixlar. Det ser ut så här:
offentliga textur (sträng läge, int storlek) {
Loc = plats;
STORLEK = storlek;
pixlar = nya int [storlek * storlek];
load();
}
Nu allt som återstår för klassen textur är att lägga till en belastning metod för att få data från bilder och lagra dem i en array med pixeldata. Denna metod kommer att se ut så här:
privata void load() {
försök {
BufferedImage image = ImageIO.read (nya File(loc));
int w = image.getWidth();
int h = image.getHeight();
image.getRGB (0, 0, w, h, pixlar, 0, w);
} fånga (IOException e) {
e.printStackTrace();
}
}
Load metoden fungerar genom att läsa data från filen som loc pekar till och skriva data till en buffrad bild. Data för varje pixel är sedan tas från buffrade bilden och lagras i pixlar.
På denna punkt är klassen textur gjort, så jag ska gå vidare och definiera några texturer som används i sista programmet. För att göra detta sätter detta
offentliga statisk struktur trä = ny textur ("res/wood.png", 64);
offentliga statisk struktur tegel = ny textur ("res/redbrick.png", 64);
offentliga statisk struktur bluestone = ny textur ("res/bluestone.png", 64);
offentliga statisk struktur sten = ny textur ("res/greystone.png", 64);
mellan "public class textur" linje och "offentliga int [] pixlar".
För att göra dessa texturer tillgänglig för resten av programmet låt oss gå vidare och ge dem till klassen spel. För att göra detta behövs en ArrayList att hålla alla texturer, och vi kommer att behöva lägga till texturer i denna ArrayList. Att skapa ArrayList lägga den följande lina av koden med variablerna nära toppen av klassen:
offentliga ArrayList < textur > texturer;
Denna ArrayList måste initieras i konstruktören och texturer bör också läggas till det i konstruktören. Lägg till följande bit kod i konstruktorn:
texturer = ny ArrayList < textur > ();
Textures.Add(Texture.Wood);
Textures.Add(Texture.Brick);
Textures.Add(Texture.Bluestone);
Textures.Add(Texture.Stone);
Och nu texturer är bra att gå!