| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- /*
- * Copyright (c) 2009-2012 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package jme3test.games;
- import com.jme3.app.SimpleApplication;
- import com.jme3.bounding.BoundingVolume;
- import com.jme3.font.BitmapFont;
- import com.jme3.font.BitmapText;
- import com.jme3.input.KeyInput;
- import com.jme3.input.controls.AnalogListener;
- import com.jme3.input.controls.KeyTrigger;
- import com.jme3.material.Material;
- import com.jme3.math.ColorRGBA;
- import com.jme3.math.FastMath;
- import com.jme3.math.Quaternion;
- import com.jme3.math.Vector3f;
- import com.jme3.scene.Geometry;
- import com.jme3.scene.Node;
- import com.jme3.scene.shape.Box;
- import com.jme3.scene.shape.Dome;
- import java.util.ArrayList;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- /**
- * @author Kyle "bonechilla" Williams
- */
- public class CubeField extends SimpleApplication implements AnalogListener {
- public static void main(String[] args) {
- CubeField app = new CubeField();
- app.start();
- }
- private BitmapFont defaultFont;
- private boolean START;
- private int difficulty, Score, colorInt, highCap, lowCap,diffHelp;
- private Node player;
- private Geometry fcube;
- private ArrayList<Geometry> cubeField;
- private ArrayList<ColorRGBA> obstacleColors;
- private float speed, coreTime,coreTime2;
- private float camAngle = 0;
- private BitmapText fpsScoreText, pressStart;
- private boolean solidBox = true;
- private Material playerMaterial;
- private Material floorMaterial;
- private float fpsRate = 1000f / 1f;
- /**
- * Initializes game
- */
- @Override
- public void simpleInitApp() {
- Logger.getLogger("com.jme3").setLevel(Level.WARNING);
- flyCam.setEnabled(false);
- setDisplayStatView(false);
- Keys();
- defaultFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
- pressStart = new BitmapText(defaultFont, false);
- fpsScoreText = new BitmapText(defaultFont, false);
- loadText(fpsScoreText, "Current Score: 0", defaultFont, 0, 2, 0);
- loadText(pressStart, "PRESS ENTER", defaultFont, 0, 5, 0);
-
- player = createPlayer();
- rootNode.attachChild(player);
- cubeField = new ArrayList<Geometry>();
- obstacleColors = new ArrayList<ColorRGBA>();
- gameReset();
- }
- /**
- * Used to reset cubeField
- */
- private void gameReset(){
- Score = 0;
- lowCap = 10;
- colorInt = 0;
- highCap = 40;
- difficulty = highCap;
- for (Geometry cube : cubeField){
- cube.removeFromParent();
- }
- cubeField.clear();
- if (fcube != null){
- fcube.removeFromParent();
- }
- fcube = createFirstCube();
- obstacleColors.clear();
- obstacleColors.add(ColorRGBA.Orange);
- obstacleColors.add(ColorRGBA.Red);
- obstacleColors.add(ColorRGBA.Yellow);
- renderer.setBackgroundColor(ColorRGBA.White);
- speed = lowCap / 400f;
- coreTime = 20.0f;
- coreTime2 = 10.0f;
- diffHelp=lowCap;
- player.setLocalTranslation(0,0,0);
- }
- @Override
- public void simpleUpdate(float tpf) {
- camTakeOver(tpf);
- if (START){
- gameLogic(tpf);
- }
- colorLogic();
- }
- /**
- * Forcefully takes over Camera adding functionality and placing it behind the character
- * @param tpf Tickes Per Frame
- */
- private void camTakeOver(float tpf) {
- cam.setLocation(player.getLocalTranslation().add(-8, 2, 0));
- cam.lookAt(player.getLocalTranslation(), Vector3f.UNIT_Y);
-
- Quaternion rot = new Quaternion();
- rot.fromAngleNormalAxis(camAngle, Vector3f.UNIT_Z);
- cam.setRotation(cam.getRotation().mult(rot));
- camAngle *= FastMath.pow(.99f, fpsRate * tpf);
- }
- @Override
- public void requestClose(boolean esc) {
- if (!esc){
- System.out.println("The game was quit.");
- }else{
- System.out.println("Player has Collided. Final Score is " + Score);
- }
- context.destroy(false);
- }
- /**
- * Randomly Places a cube on the map between 30 and 90 paces away from player
- */
- private void randomizeCube() {
- Geometry cube = fcube.clone();
- int playerX = (int) player.getLocalTranslation().getX();
- int playerZ = (int) player.getLocalTranslation().getZ();
- // float x = FastMath.nextRandomInt(playerX + difficulty + 10, playerX + difficulty + 150);
- float x = FastMath.nextRandomInt(playerX + difficulty + 30, playerX + difficulty + 90);
- float z = FastMath.nextRandomInt(playerZ - difficulty - 50, playerZ + difficulty + 50);
- cube.getLocalTranslation().set(x, 0, z);
- // playerX+difficulty+30,playerX+difficulty+90
- Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- if (!solidBox){
- mat.getAdditionalRenderState().setWireframe(true);
- }
- mat.setColor("Color", obstacleColors.get(FastMath.nextRandomInt(0, obstacleColors.size() - 1)));
- cube.setMaterial(mat);
- rootNode.attachChild(cube);
- cubeField.add(cube);
- }
- private Geometry createFirstCube() {
- Vector3f loc = player.getLocalTranslation();
- loc.addLocal(4, 0, 0);
- Box b = new Box(loc, 1, 1, 1);
- Geometry geom = new Geometry("Box", b);
- Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- mat.setColor("Color", ColorRGBA.Blue);
- geom.setMaterial(mat);
- return geom;
- }
- private Node createPlayer() {
- Dome b = new Dome(Vector3f.ZERO, 10, 100, 1);
- Geometry playerMesh = new Geometry("Box", b);
- playerMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- playerMaterial.setColor("Color", ColorRGBA.Red);
- playerMesh.setMaterial(playerMaterial);
- playerMesh.setName("player");
- Box floor = new Box(Vector3f.ZERO.add(playerMesh.getLocalTranslation().getX(),
- playerMesh.getLocalTranslation().getY() - 1, 0), 100, 0, 100);
- Geometry floorMesh = new Geometry("Box", floor);
- floorMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- floorMaterial.setColor("Color", ColorRGBA.LightGray);
- floorMesh.setMaterial(floorMaterial);
- floorMesh.setName("floor");
- Node playerNode = new Node();
- playerNode.attachChild(playerMesh);
- playerNode.attachChild(floorMesh);
- return playerNode;
- }
- /**
- * If Game is Lost display Score and Reset the Game
- */
- private void gameLost(){
- START = false;
- loadText(pressStart, "You lost! Press enter to try again.", defaultFont, 0, 5, 0);
- gameReset();
- }
-
- /**
- * Core Game Logic
- */
- private void gameLogic(float tpf){
- //Subtract difficulty level in accordance to speed every 10 seconds
- if(timer.getTimeInSeconds()>=coreTime2){
- coreTime2=timer.getTimeInSeconds()+10;
- if(difficulty<=lowCap){
- difficulty=lowCap;
- }
- else if(difficulty>lowCap){
- difficulty-=5;
- diffHelp+=1;
- }
- }
-
- if(speed<.1f){
- speed+=.000001f*tpf*fpsRate;
- }
- player.move(speed * tpf * fpsRate, 0, 0);
- if (cubeField.size() > difficulty){
- cubeField.remove(0);
- }else if (cubeField.size() != difficulty){
- randomizeCube();
- }
- if (cubeField.isEmpty()){
- requestClose(false);
- }else{
- for (int i = 0; i < cubeField.size(); i++){
-
- //better way to check collision
- Geometry playerModel = (Geometry) player.getChild(0);
- Geometry cubeModel = cubeField.get(i);
- cubeModel.updateGeometricState();
- BoundingVolume pVol = playerModel.getWorldBound();
- BoundingVolume vVol = cubeModel.getWorldBound();
- if (pVol.intersects(vVol)){
- gameLost();
- return;
- }
- //Remove cube if 10 world units behind player
- if (cubeField.get(i).getLocalTranslation().getX() + 10 < player.getLocalTranslation().getX()){
- cubeField.get(i).removeFromParent();
- cubeField.remove(cubeField.get(i));
- }
- }
- }
- Score += fpsRate * tpf;
- fpsScoreText.setText("Current Score: "+Score);
- }
- /**
- * Sets up the keyboard bindings
- */
- private void Keys() {
- inputManager.addMapping("START", new KeyTrigger(KeyInput.KEY_RETURN));
- inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_LEFT));
- inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_RIGHT));
- inputManager.addListener(this, "START", "Left", "Right");
- }
- public void onAnalog(String binding, float value, float tpf) {
- if (binding.equals("START") && !START){
- START = true;
- guiNode.detachChild(pressStart);
- System.out.println("START");
- }else if (START == true && binding.equals("Left")){
- player.move(0, 0, -(speed / 2f) * value * fpsRate);
- camAngle -= value*tpf;
- }else if (START == true && binding.equals("Right")){
- player.move(0, 0, (speed / 2f) * value * fpsRate);
- camAngle += value*tpf;
- }
- }
- /**
- * Determines the colors of the player, floor, obstacle and background
- */
- private void colorLogic() {
- if (timer.getTimeInSeconds() >= coreTime){
-
- colorInt++;
- coreTime = timer.getTimeInSeconds() + 20;
-
- switch (colorInt){
- case 1:
- obstacleColors.clear();
- solidBox = false;
- obstacleColors.add(ColorRGBA.Green);
- renderer.setBackgroundColor(ColorRGBA.Black);
- playerMaterial.setColor("Color", ColorRGBA.White);
- floorMaterial.setColor("Color", ColorRGBA.Black);
- break;
- case 2:
- obstacleColors.set(0, ColorRGBA.Black);
- solidBox = true;
- renderer.setBackgroundColor(ColorRGBA.White);
- playerMaterial.setColor("Color", ColorRGBA.Gray);
- floorMaterial.setColor("Color", ColorRGBA.LightGray);
- break;
- case 3:
- obstacleColors.set(0, ColorRGBA.Pink);
- break;
- case 4:
- obstacleColors.set(0, ColorRGBA.Cyan);
- obstacleColors.add(ColorRGBA.Magenta);
- renderer.setBackgroundColor(ColorRGBA.Gray);
- floorMaterial.setColor("Color", ColorRGBA.Gray);
- playerMaterial.setColor("Color", ColorRGBA.White);
- break;
- case 5:
- obstacleColors.remove(0);
- renderer.setBackgroundColor(ColorRGBA.Pink);
- solidBox = false;
- playerMaterial.setColor("Color", ColorRGBA.White);
- break;
- case 6:
- obstacleColors.set(0, ColorRGBA.White);
- solidBox = true;
- renderer.setBackgroundColor(ColorRGBA.Black);
- playerMaterial.setColor("Color", ColorRGBA.Gray);
- floorMaterial.setColor("Color", ColorRGBA.LightGray);
- break;
- case 7:
- obstacleColors.set(0, ColorRGBA.Green);
- renderer.setBackgroundColor(ColorRGBA.Gray);
- playerMaterial.setColor("Color", ColorRGBA.Black);
- floorMaterial.setColor("Color", ColorRGBA.Orange);
- break;
- case 8:
- obstacleColors.set(0, ColorRGBA.Red);
- floorMaterial.setColor("Color", ColorRGBA.Pink);
- break;
- case 9:
- obstacleColors.set(0, ColorRGBA.Orange);
- obstacleColors.add(ColorRGBA.Red);
- obstacleColors.add(ColorRGBA.Yellow);
- renderer.setBackgroundColor(ColorRGBA.White);
- playerMaterial.setColor("Color", ColorRGBA.Red);
- floorMaterial.setColor("Color", ColorRGBA.Gray);
- colorInt=0;
- break;
- default:
- break;
- }
- }
- }
- /**
- * Sets up a BitmapText to be displayed
- * @param txt the Bitmap Text
- * @param text the
- * @param font the font of the text
- * @param x
- * @param y
- * @param z
- */
- private void loadText(BitmapText txt, String text, BitmapFont font, float x, float y, float z) {
- txt.setSize(font.getCharSet().getRenderedSize());
- txt.setLocalTranslation(txt.getLineWidth() * x, txt.getLineHeight() * y, z);
- txt.setText(text);
- guiNode.attachChild(txt);
- }
- }
|