Stap 1: De belangrijkste klasse
Het eerste ding dat moet worden gemaakt is een belangrijkste klasse. De belangrijkste klasse zal omgaan met het weergeven van afbeeldingen voor de gebruiker, opgeroepen van andere klassen om te berekenen wat de speler moet worden weergegeven en bijwerken van de positie van de camera.
Voor deze klasse zal de invoer worden:
import java.awt.Color;import java.awt.Graphics; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.util.ArrayList; import javax.swing.JFrame;
De klasse en de variabelen ervan zal als volgt uitzien:
public class Game extends JFrame implements Runnable{ private static final long serialVersionUID = 1L; public int mapWidth = 15; public int mapHeight = 15; private Thread thread; private boolean running; private BufferedImage image; public int[] pixels; public static int[][] map = { {1,1,1,1,1,1,1,1,2,2,2,2,2,2,2}, {1,0,0,0,0,0,0,0,2,0,0,0,0,0,2}, {1,0,3,3,3,3,3,0,0,0,0,0,0,0,2}, {1,0,3,0,0,0,3,0,2,0,0,0,0,0,2}, {1,0,3,0,0,0,3,0,2,2,2,0,2,2,2}, {1,0,3,0,0,0,3,0,2,0,0,0,0,0,2}, {1,0,3,3,0,3,3,0,2,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,2,0,0,0,0,0,2}, {1,1,1,1,1,1,1,1,4,4,4,0,4,4,4}, {1,0,0,0,0,0,1,4,0,0,0,0,0,0,4}, {1,0,0,0,0,0,1,4,0,0,0,0,0,0,4}, {1,0,0,2,0,0,1,4,0,3,3,3,3,0,4}, {1,0,0,0,0,0,1,4,0,3,3,3,3,0,4}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, {1,1,1,1,1,1,1,4,4,4,4,4,4,4,4} };
Merk op dat de kaart kan worden aangepast aan wat u wilt, wat ik hier heb is slechts een voorbeeld. De nummers op de kaart staan wat voor soort muur zal worden op die positie. Een 0 geeft lege ruimte terwijl een andere nummer vertegenwoordigt een stevige muur en de textuur die daarbij hoort. De BufferedImage is wat wordt weergegeven aan de gebruiker, en pixels is een matrix van alle pixels in de afbeelding. De andere variabelen niet echt weer, dat ze worden alleen gebruikt om de grafiek en het programma naar behoren werkt.
De constructor wordt nu als volgt uitzien:
public Game() { thread = new Thread(this); image = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB); pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData(); setSize(640, 480); setResizable(false); setTitle("3D Engine"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBackground(Color.black); setLocationRelativeTo(null); setVisible(true); start(); }
De meeste van deze is enkel initialisatie van de klassevariabelen en het frame. De code na "pixels =" verbindt pixels en afbeelding zodat elk gewenst moment de gegevenswaarden in pixels worden gewijzigd de corresponderende wijzigingen aangebracht op de afbeelding worden weergegeven wanneer het wordt weergegeven aan de gebruiker.
De begin- en eindtijd methoden zijn eenvoudig en gebruikt om te controleren of het programma veilig begint en eindigt.
private synchronized void start() { running = true; thread.start(); } public synchronized void stop() { running = false; try { thread.join(); } catch(InterruptedException e) { e.printStackTrace(); } }
De laatste twee methoden die moeten worden in de Game klasse zijn de render en methoden worden uitgevoerd. De methode render zal er zo uitzien:
public void render() { BufferStrategy bs = getBufferStrategy(); if(bs == null) { createBufferStrategy(3); return; } Graphics g = bs.getDrawGraphics(); g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); bs.show(); }
Een buffer strategie wordt gebruikt bij het weergeven van zodat schermbijwerkingen glansmachine. Over het geheel genomen helpt met behulp van een buffer-strategie net de spel look beter wanneer uitgevoerd. Als u wilt eigenlijk tekenen het beeld op het scherm is een object graphics verkregen uit de buffer strategie en gebruikt bij het tekenen ons imago.
De methode run is zeer belangrijk omdat het behandelt hoe vaak verschillende onderdelen van het programma worden bijgewerkt. Om dit te doen het wat code gebruikt om bij te houden wanneer 1/60e van een seconde is verstreken, en wanneer het heeft het scherm en de camera worden bijgewerkt. Dit verbetert het hoe vloeiend het programma wordt uitgevoerd. De run methode ziet er zo uit:
public void run() { long lastTime = System.nanoTime(); final double ns = 1000000000.0 / 60.0;//60 times per second double delta = 0; requestFocus(); while(running) { long now = System.nanoTime(); delta = delta + ((now-lastTime) / ns); lastTime = now; while (delta >= 1)//Make sure update is only happening 60 times a second { //handles all of the logic restricted time delta--; } render();//displays to the screen unrestricted time } }
Zodra al deze methoden, constructeurs en variabelen zijn dan is het enige wat te doen in de Game klasse op het moment is om een belangrijkste methode toevoegen. De belangrijkste methode is zeer eenvoudig, alles wat je hoeft te doen is:
public static void main(String [] args) { Game game = new Game(); }
En nu de belangrijkste klasse is klaar voor het moment! Als u het programma uitvoert moet nu een zwart scherm omhoog knallen.