Java e videogiochi “Dal mobile al desktop, dal 2D al 3D” Arturo Montieri Game Programming Italia Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Agenda GameProg.it Il punto di riferimento italiano La piattaforma Java da un’altra prospettiva Semplicità ed object oriented nella progettazione dei giochi Java everywhere: mobile, web, desktop Uno sguardo da vicino: l’approccio al mobile Grafica 2D: esempio base “Platform” Grafica 3D: esempio base “FPS” Live Demo Domande Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi La piattaforma Java da un’altra prospettiva Perché Java? Semplicità Object oriented design Cross platform e virtual machine Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API GameCanvas Funzionalità di base dello schermo e dei tasti di gioco Layer Classe base che rappresenta un elemento visuale nel gioco Sprite Rappresenta un oggetto animato nel gioco composto da vari frame TiledLayer Rappresenta un livello di gioco costituito da una griglia di celle LayerManager Gestisce il rendering dei vari livelli di gioco Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API GameCanvas: il game loop public class MiniMarioGame extends GameCanvas implements Runnable { public void run() { Graphics g = getGraphics(); while(!gameOver) { //leggi stato dei tasti checkKeys(); // aggiorna lo stato del gioco updateGame(); // disegna renderGame(g); } } } Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API Sprite: gli attori del gioco Ad uno sprite è associata una immagine che contiene i vari frame dei suoi movimenti Image imageMario = Image.createImage("/mario_frames.png"); int[] marioFrameSequence = {0, 1, 2, 3, 4, 5}; Sprite sprMario = new Sprite(imageMario, 16, 16); sprMario.setFrameSequence(marioFrameSequence); sprMario.defineReferencePixel(8, 8); . . if (RIGHT_PRESSED) { sprMario.nextFrame(); sprMario.move(3,0); . Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API TiledLayer: il livello di gioco Ad un TiledLayer è associata una griglia che contiene i vari elementi grafici del livello Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API TiledLayer: il livello di gioco Image imageLevel1 = Image.createImage("/level1.png"); TiledLayer level1 = new TiledLayer(MAX_HORIZONTAL_TILES, MAX_VERTICAL_TILES, imageLevel1, TILE_WIDTH, TILE_HEIGHT); int[][] levelGrid = { {0, 0, 4, 5, 0}, {0, 0, 0, 0, 0}, {0, 0, 2, 3, 2}, {0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}}; for (int row=0; row<MAX_VERTICAL_TILES; row++) { for (int col=0; col<MAX_HORIZONTAL_TILES; col++) { level1.setCell(col, row, levelGrid[row][col]); } } Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API LayerManager: incolliamo il tutto LayerManager layerManager = new LayerManager(); layerManager.append(sprMario); layerManager.append(level1); layerManager.setViewWindow(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); . . sprMario.setRefPixelPosition(x, y); level1.setPosition(xLevel1X, yLevel1); Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 2D: MIDP 2.0 Game API Demo Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Graphics3D Gestione contesto grafico 3D e render Object3D Classe base che rappresenta un oggetto nello spazio 3D World Gestione dello “spazio” contenente i nostri oggetti 3D Camera Gestione telecamera Loader Gestione caricamento file esterni Light Gestione luci Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Transform e Group Gestione matrici di trasformazioni e raggruppamento degli oggetti 3D Background Gestione “sfondo” dell’applicazione Appearance: Material e Texture2D Gestione materiali e texture Mesh: SkinnedMesh e MorphingMesh Gestione mesh animate VertexArray e VertexBuffer Gestione buffer di array di vertici, normali, colori e coordinate texture RayIntersection Gestione collisioni Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Costruzione del mondo 3D level.m3g Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Luci, camera, azione!!! private Graphics3D g3d; private World myWorld; private Camera myCamera; private Object3D myObjects[]; private Light myLight; ... //Inizializzazione setFullScreenMode(true); g3d = Graphics3D.getInstance(); myObjects = Loader.load("/level.m3g"); myLight = new Light(); myLight.translate(0.0f, 0.0f, -1.0f); myLight.setMode(Light.AMBIENT); myLight.setColor(0xFFFFFF); myCamera = new Camera(); myCamera.setTranslation(camX, camY, camZ); myCamera.setPerspective(45.0f, width / height, 0.1f, 300.0f); Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Luci, camera, azione!!! Image2D backgroundImage = loadImage("/nuvole.png"); Background background = new Background(); background.setImage(backgroundImage); myWorld = (World) myObjects[0]; myWorld.addChild(myLight); myWorld.addChild(myCamera); myWorld.setActiveCamera(myCamera); myWorld.setBackground(background); Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API GameCanvas: il game loop public class MobileFPSGame extends GameCanvas implements Runnable { public void run() { Graphics g = getGraphics(); while(!gameOver) { //leggi stato dei tasti checkKeys(); // aggiorna lo stato del gioco updateGame(); // disegna renderGame(g); } } } Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API L’interattività: il controllo dei tasti public void checkKeys() { if (LEFT_PRESSED) { // ruota a sinistra camAngle += 3.0f; offsetX = STEP * Math.sin(Math.toRadians(camAngle)); offsetZ = STEP * Math.cos(Math.toRadians(camAngle)); } if (UP_PRESSED) { camZ -= offsetZ; camX -= offsetX; } . . } Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Update e Render public void updateGame() { myCamera.setOrientation(camAngle, 0f, 1f, 0f); myCamera.setTranslation(camX, camY, camZ); } public void renderGame(Graphics g) { try { g3d.bindTarget(g); g3d.render(myWorld); } finally { g3d.releaseTarget(); } } Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi L’approccio al mobile Grafica 3D: M3G 3D Mobile Graphics API Demo Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009 Java e videogiochi Conclusioni “La programmazione è un’arte, la passione è prima di tutto.” Arturo Montieri - [email protected] – GameProg.it Javaday Roma III Edizione – 24 gennaio 2009