/* * Copyright © 2012 Nokia Corporation. All rights reserved. * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. * Oracle and Java are trademarks or registered trademarks of Oracle and/or its * affiliates. Other product and company names mentioned herein may be trademarks * or trade names of their respective owners. * See LICENSE.TXT for license information. */ package com.nokia.example.spacemission; import java.util.Random; import javax.microedition.lcdui.Graphics; import javax.microedition.m3g.*; public class Game3DManager { private Graphics3D graphics3D; private PlayerModel playerCamera; private Random rnd; private int canvasWidth; private int canvasHeight; private int score; private int numberOfAliens; private World scene; private int appTime = 0; private int nextTimeToAnimate; private static final int FLOOR_LEN = 20; private GameStatusListener status; public Game3DManager(int canvasWidth, int canvasHeight) { this.numberOfAliens = 10; this.score = 0; this.canvasWidth = canvasWidth; this.canvasHeight = canvasHeight; this.graphics3D = Graphics3D.getInstance(); rnd = new Random(); scene = new World(); // create scene graph buildScene(); nextTimeToAnimate = scene.animate(appTime); } public void paint(Graphics g) { try { graphics3D.bindTarget(g); graphics3D.render(scene); graphics3D.releaseTarget(); } catch (IllegalStateException illegal) { } } private void buildScene() { addCamera(); addLights(); addBackground(); addFloor(); addAliens(); } private void addAliens() { AlienModel em; float x, z; for (int i = 0; i < numberOfAliens; i++) { x = rndCoord(); z = rndCoord(); em = new AlienModel(x, z); scene.addChild(em.getModelGroup()); } } private float rndCoord() { float f = rnd.nextFloat(); // 0.0f to 1.0f float coord = (f * FLOOR_LEN) - FLOOR_LEN / 2.0f; return coord; } private void addCamera() { playerCamera = new PlayerModel(canvasWidth, canvasHeight); scene.addChild(playerCamera.getCameraGroup()); scene.setActiveCamera(playerCamera.getCamera()); } private void addLights() { Light light = new Light(); // default white, directional light light.setIntensity(2.5f); // make it a bit brighter light.setOrientation(-65.0f, 1.0f, 0, 0); // pointing down and into scene.addChild(light); } private void addBackground() { Background backGnd = new Background(); Image2D backIm = loadImage2D("/game/background.png"); if (backIm != null) { backGnd.setImage(backIm); } else { backGnd.setColor(0x000000); } scene.setBackground(backGnd); } private void addFloor() { Image2D floorIm = loadImage2D("/game/floor.png"); FloorTiles f = new FloorTiles(floorIm, FLOOR_LEN); scene.addChild(f.getFloorMesh()); } private Image2D loadImage2D(String fn) { Image2D im = null; try { im = (Image2D) Loader.load(fn)[0]; } catch (Exception e) { System.out.println("Cannot make image from " + fn); } return im; } public int updateGame() { try { appTime++; if (appTime >= nextTimeToAnimate) { nextTimeToAnimate = scene.animate(appTime) + appTime; } } catch (Exception e) { e.printStackTrace(); } float[] pos = playerCamera.getPosition(); int maxPos = FLOOR_LEN / 2; if ((-maxPos < pos[0]) && (pos[0] < maxPos) && (-maxPos < pos[2]) && (pos[2] < maxPos)) { playerCamera.updatePosition(); } else if (status != null) { status.gameOver(GameStatusListener.PLAYER_DIED); } if (numberOfAliens <= 0) { if (status != null) { status.gameOver(GameStatusListener.GAME_COMPLETED); } } return score; } public void setFirePressed() { RayIntersection ri = new RayIntersection(); float[] camPos = playerCamera.getPosition(); // camera's current // position float[] camDir = playerCamera.getDirection(); // camera's current // direction if (scene.pick(-1, camPos[0], camPos[1], camPos[2], camDir[0], camDir[1], camDir[2], ri)) { // hit something? Node selected = ri.getIntersected(); if (selected instanceof Mesh) { Mesh m = (Mesh) selected; m.setAppearance(0, AlienModel.getFrozenAppearance()); m.setPickingEnable(false); score += 10; numberOfAliens--; } } } public void setKeysPressed(boolean leftPressed, boolean rightPressed, boolean upPressed, boolean downPressed) { playerCamera.setKeysPressed(leftPressed, rightPressed, upPressed, downPressed); } public void setGameStatusListener(GameStatusListener status) { this.status = status; } }