import java.awt.*; import java.awt.event.*; import javax.swing.*; @SuppressWarnings("serial") public class G3Test extends JApplet implements Runnable, MouseListener, MouseMotionListener, KeyListener { Image img; Graphics2D g2; Thread t; int mx, my; int pmx, pmy; int nmx, nmy; boolean ml, mr; boolean pml, pmr; boolean nml, nmr; G3Renderer g3; int count; @Override public void init() { setSize(512, 384); setPreferredSize(new Dimension(512, 384)); addMouseListener(this); addMouseMotionListener(this); addKeyListener(this); setFocusable(true); initGame(); t = new Thread(this); t.start(); } void initGame() { g3 = new G3Renderer(512, 384); } public void step() { if (img == null) img = createImage(512, 384); if (img == null) return; if (g2 == null) g2 = (Graphics2D) img.getGraphics(); move(); draw(); Graphics g = getGraphics(); if (g != null && img != null) { g.drawImage(img, 0, 0, null); Toolkit.getDefaultToolkit().sync(); g.dispose(); } } @Override public void update(Graphics g) { paint(g); } @Override public void paint(Graphics g) { g.drawImage(img, 0, 0, null); } void move() { pmx = mx; pmy = my; mx = nmx; my = nmy; pml = ml; pmr = mr; ml = nml; mr = nmr; count++; } void draw() { g2.setColor(new Color(0, 0, 0)); g2.fillRect(0, 0, 512, 384); g3.updateScene(0xff000080); long st = System.nanoTime(); g3.rotateY(count / 100f); g3.rotateX(count / 70f); g3.scale(2, 2, 2); g3.setMaterial(0.8f, 0.8f, 0, 0, 0, 1, 0, 0, 1); g3.drawPolygon(new float[] { -100, 100, 0 }, new float[] { 100, 100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); g3.drawPolygon(new float[] { 100, 100, 0 }, new float[] { 100, -100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); g3.setMaterial(0.8f, 0.8f, 0, 0, 0, 0, 0, 1, 1); g3.rotateY((float) Math.PI / 2f); g3.drawPolygon(new float[] { -100, 100, 0 }, new float[] { 100, 100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); g3.drawPolygon(new float[] { 100, 100, 0 }, new float[] { 100, -100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); g3.setMaterial(0.8f, 0.8f, 0, 0, 0, 0, 1, 0, 1); g3.rotateX((float) Math.PI / 2f); g3.drawPolygon(new float[] { -100, 100, 0 }, new float[] { 100, 100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); g3.drawPolygon(new float[] { 100, 100, 0 }, new float[] { 100, -100, 0 }, new float[] { -100, -100, 0 }, null, null, null, null, null, null); long en = System.nanoTime(); System.out.println((en - st) / 1000000f); g3.updateFrame(); g2.drawImage(g3.getSceneImage(), 0, 0, null); } public void run() { long ot, nt, mt, slp, over, tar; ot = System.nanoTime(); tar = 20000000; over = 0; while (true) { step(); nt = System.nanoTime(); mt = nt - ot; slp = tar - mt - over; if (slp < 2000000) { try { Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } over = 0; ot = System.nanoTime(); } else { try { Thread.sleep(slp / 1000000); } catch (InterruptedException e) { e.printStackTrace(); } ot = System.nanoTime(); over = ot - nt - slp; } } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { switch (e.getButton()) { case MouseEvent.BUTTON1: nml = true; break; case MouseEvent.BUTTON3: nmr = true; break; } } public void mouseReleased(MouseEvent e) { switch (e.getButton()) { case MouseEvent.BUTTON1: nml = false; break; case MouseEvent.BUTTON3: nmr = false; break; } } public void mouseDragged(MouseEvent e) { nmx = e.getX(); nmy = e.getY(); } public void mouseMoved(MouseEvent e) { nmx = e.getX(); nmy = e.getY(); } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } public static void main(String[] args) { JFrame frame = new JFrame("3Dエンジンテスト用"); G3Test applet = new G3Test(); applet.init(); frame.add(applet); frame.setResizable(false); frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }