Package MineGod

Source Code of MineGod.MineGod

package MineGod;

import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.geom.*;
import org.newdawn.slick.Image;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
import java.util.ArrayList;



public class MineGod {
  static final boolean godMode = false;
  static final int windowWidth = (int) (Chunk.CHUNK_WIDTH*Block.WIDTH);
  static final int gameHeight = (int) (Chunk.CHUNK_HEIGHT*Block.WIDTH);
  static final int windowHeight = gameHeight + (int)GUIHUD.height;
 
 
  public static double worldPosition = 0;
  public static int chunkIndex = 0;
  public static ArrayList<Chunk> chunks = new ArrayList<Chunk>();
 
  public static ArrayList<ProjectileEntity> projectiles = new ArrayList<ProjectileEntity>();
  public static ArrayList<Entity> entities = new ArrayList<Entity>();
  public static ArrayList<Emitter> emitters = new ArrayList<Emitter>();

  public static ArrayList<Entity> delayedEntities = new ArrayList<Entity>();
 
  public static GUI gui;
 
  static int screenIndex = 0// 0 = menu, 1 = game
  static int menuFlag = 0;
  static int gameFlag = 0;
  static int nameFlag = 0;
  static int scoreFlag = 0;
  static boolean paused = false;
  static boolean gameFinished = false;
 
 
 
  public boolean escapePressed = false;
 
  /** time at last frame */
  long lastFrame;
  /** frames per second */
  int fps;
  /** last fps time */
  long lastFPS;
 
  static Player player;
  static EntityLavaWall lavaWall;
 
  //static Emitter emitter = new Emitter(300.0, 300.0, .5, .1, -.1, .3, .2,3000,500);
  //Emitter(double x, double y, double r, double sxmax, double sxmin, double symax, double symin,
  //        double lmax, double lmin){
 
  Image hMap;
 
  Texture paloTex;
   
 
  public void start() {
    GUIScoreMenu.updateLHS();
    try {
      Display.setDisplayMode(new DisplayMode(windowWidth, windowHeight));
      Display.create();
    } catch (LWJGLException e) {
      e.printStackTrace();
      System.exit(0);
    }
   
    initGL(); // init OpenGL

    loadGUITextures();
    loadTextures()
   
    /* Menu Screen */
    getDelta(); // call once before loop to initialise lastFrame
    lastFPS = getTime(); // call before loop to initialise fps timer
    while (!Display.isCloseRequested() && !escapePressed) {
      Display.sync(100);
      updateFPS();
      if(screenIndex == 0){
        if(menuFlag == 0){
          gui = new GUIStartMenu();
          menuFlag = 1;
        }
        startMenuLoop();
      } else if (screenIndex == 1){
        if(gameFlag == 0){
          // Destroy any clicks
          gui = new GUIHUD();
          Mouse.destroy();
          try {
            Mouse.create();
          } catch (LWJGLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         
          player = new Player();
          lavaWall = new EntityLavaWall();
         
          if (!godMode){
            entities.add(lavaWall);
          }
         
          chunks.clear();
          chunks.add(new Chunk(chunks.size()));
          chunks.add(new Chunk(chunks.size(), getCurrChunk()));
          for (ResidualArrayElement rAE: chunks.get(1).rAEs){
            for (int[] locs: rAE.blockLocs){
              if (locs[0] < 0){
                chunks.get(0).blocks[(locs[0]+Chunk.CHUNK_WIDTH)%Chunk.CHUNK_WIDTH][locs[1]] = rAE.bGen.provideBlock();
              }
            }
          }
          chunks.add(new Chunk(chunks.size(), getNextChunk()));
          for (ResidualArrayElement rAE: chunks.get(2).rAEs){
            for (int[] locs: rAE.blockLocs){
              if (locs[0] < 0 && locs[1] != 0 /*The water goes at the top*/){
                chunks.get(1).blocks[(locs[0]+Chunk.CHUNK_WIDTH)%Chunk.CHUNK_WIDTH][locs[1]] = rAE.bGen.provideBlock();
              }
            }
          }
          gameFlag = 1;
          gui.refreshGUI(this);
         
        }
        gameLoop();
      } else if (screenIndex == 2){
        if (GUIScoreMenu.playerScore>GUIScoreMenu.lowestHighScore)
        {
          if (nameFlag == 0)
          {
            gui = new GUINameEntry();
            nameFlag = 1;
          }
          nameEnterLoop();
        }
        else{
          GUIScoreMenu.playerName = "";
          screenIndex = 3;
        }
      } else if (screenIndex == 3){
        if(scoreFlag == 0){
          gui = new GUIScoreMenu();
          scoreFlag = 1;
          gameFinished = false;
        }
        startMenuLoop();
      }
     
    }
   
    Display.destroy();
  }
 
 
  public static void endGame(){
    screenIndex = 2;
    scoreFlag = 0;
    gameFlag = 0;
    gameFinished = true;
   
    //update ScoreGUIScreent thing
    GUIScoreMenu.playerScore = (int)worldPosition;
   
    //erase chunks
    chunks.clear();
    worldPosition = 0;
    chunkIndex = 0;   
    projectiles.clear();
    entities.clear();
    delayedEntities.clear();
    emitters.clear();
   
    player = null;
  }
 
 
 
  public void startMenuLoop(){
    int delta = getDelta();
    updateMenu(delta);
    renderMenuGL();
   
    Display.update();
    //Display.sync(100); // cap fps to 100fps
  }
 
  public void nameEnterLoop(){
    //int delta = getDelta();
    pollInputNameEntry();//updateMenu(delta);
    renderMenuGL();
   
    Display.update();
    //Display.sync(100); // cap fps to 100fps
  }
 
 
  public void gameLoop(){
    int delta = getDelta();
   
    if(delta < 50){
      update(delta);
      renderGL()
      if(player.hp <= 0){
        MineGod.endGame();
      }
      Display.update();
      //Display.sync(100); // cap fps to 60fps
    }
  }
 
 
  /**
   * Calculate how many milliseconds have passed
   * since last frame.
   *
   * @return milliseconds passed since last frame
   */
  public int getDelta() {
      long time = getTime();
      int delta = (int) (time - lastFrame);
      lastFrame = time;
      return delta;
  }
  /**
   * Get the accurate system time
   *
   * @return The system time in milliseconds
   */
  public long getTime() {
      return (Sys.getTime() * 1000) / Sys.getTimerResolution();
  }
  /**
   * Calculate the FPS and set it in the title bar
   */
  public void updateFPS() {
    if (getTime() - lastFPS > 1000) {
      Display.setTitle("FPS: " + fps);
      fps = 0;
      lastFPS += 1000;
    }
    fps++;
  }
 
 
 
  public void initGL() {
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    //GL11.glEnable(GL11.GL_LIGHTING);
   
    GL11.glLoadIdentity();
    GL11.glOrtho(0, windowWidth, windowHeight, 0, 30, -30);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glEnable(GL11.GL_TEXTURE_2D)
  }
 
 
  public void renderGL() {
    // Clear The Screen And The Depth Buffer
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    // R,G,B,A Set The Color To Blue One Time Only
    //GL11.glColor3f(0.5f, 0.5f, 1.0f);
    GL11.glPushMatrix();
    GL11.glColor3d(1.0, 1.0, 1.0)// THIS IS REALLY NOT NEEDED USUALLY
      /* THESE SHOULD BE RENDERED FROM BACK TO FRONT TO DISPLAY TRANSPARENCY CORRECTLY!! */
      ArrayList<Entity> oneZIndex = new ArrayList<Entity>();
      ArrayList<Entity> zeroZIndex = new ArrayList<Entity>();
      ArrayList<Entity> negHalfZIndex = new ArrayList<Entity>();
      ArrayList<Entity> neg2ZIndex = new ArrayList<Entity>();
     
     
      for(Entity e: entities){
        if (e.zIndex == 1){
          oneZIndex.add(e);
        } else if (e.zIndex == 0){
          zeroZIndex.add(e);
        } else if (e.zIndex == -.5){
          negHalfZIndex.add(e);
        } else if (e.zIndex == -2){
          neg2ZIndex.add(e);
        }
       
      }
     
      // zIndex = 1
      for(Entity e: oneZIndex){
        e.render(worldPosition);
      }
     
      // zIndex = 0
      for(Entity e: zeroZIndex){
        e.render(worldPosition);
      }
     
      // zIndex = 0
      if (getPrevChunk() != null){
        getPrevChunk().renderChunk(worldPosition);
      }
      getCurrChunk().renderChunk(worldPosition);
      getNextChunk().renderChunk(worldPosition);
     
      // zIndex = -0.5
      for(Entity e: negHalfZIndex){
        e.render(worldPosition);
      }
     
      //zIndex = -1
      player.render();
     
      // zIndex = -2
      for(Entity e: neg2ZIndex){
        e.render(worldPosition);
      }
     
      // zIndex = -3
      for(ProjectileEntity entity: projectiles){
        entity.render(worldPosition);
      }
     
      for (Emitter emitter: emitters){
        emitter.render();
      }
     
      gui.render();
     
    GL11.glPopMatrix();
  }
 
  public void update(int delta) {
    pollInput();
    if (Mouse.getX()+worldPosition<player.xPos)
    {
      player.leftFacing = true;
    }
    else{
      player.leftFacing = false;
    }
    if (screenIndex == 1 && paused == false){
      /*
       * Player Logic
       */
      player.doLogic(delta, getPrevChunk(), getCurrChunk(), getNextChunk());
     
      ArrayList<Entity> removes2 = new ArrayList<Entity>();
      for (Entity entity: entities){
        if (entity.x < lavaWall.x){
          entity.dead = true;
          removes2.add(entity);
          continue;
        }
        entity.doLogic(delta, getPrevChunk(), getCurrChunk(), getNextChunk());
        if(Utils.intersects(player.getNextMask((float)player.xSpeed, (float)player.ySpeed), entity.mask)){
          entity.interactWithPlayerOnCollision(player);
        }
       
        if(entity.dead == true){
          removes2.add(entity);
        }
       
      }
     
     
      for (Entity e: removes2){
        entities.remove(e);
      }
      for (Entity e: delayedEntities){
        entities.add(e);
      }
      delayedEntities = new ArrayList<Entity>();
     
     
     
      /*
       * Projectile Logic
       */
      ArrayList<ProjectileEntity> removes = new ArrayList<ProjectileEntity>();
      for(ProjectileEntity entity: projectiles){
        entity.doLogic(delta, getPrevChunk(), getCurrChunk(), getNextChunk());
        if (entity.age > entity.maxAge || entity.dead){
          removes.add(entity);
        }
      }
      for(ProjectileEntity r: removes){
        projectiles.remove(r);
      }
      ProjectileEntitySmall.lastShot += delta;
      ProjectileEntityBig.lastShot += delta;
      ProjectileEntityDestroy.lastShot += delta;
     
      /*
       * Emitter logic
       */
      ArrayList<Emitter> r = new ArrayList<Emitter>();
      for (Emitter emitter: emitters){
        emitter.step(delta);
        if (emitter.alive == false){
          r.add(emitter);
        }
      }
      for (Emitter emitter: r){
        emitters.remove(emitter);
      }
     
     
     
     
    }
    updateChunks();
  }
 
 
  public void updateChunks(){
    int prevIndex = chunkIndex;
    chunkIndex = (int)(player.xPos / Chunk.CHUNK_PIXEL_WIDTH);
    if (prevIndex < chunkIndex && /*Also check if we are near the end of chunks, otherwise blending screws up*/ chunkIndex == chunks.size()-2){
      chunks.add(generateNextChunk());
    }
  }
 
  public Chunk getPrevChunk(){
    if(chunkIndex > 0){
      return chunks.get(chunkIndex-1);
    } else {
      return null;
    }
  }
 
  public Chunk getCurrChunk(){
    return chunks.get(chunkIndex);
  }
 
  public Chunk getNextChunk(){
    return chunks.get(chunkIndex+1);
  }
 
  public Chunk getUberNextChunk(){
    return chunks.get(chunkIndex+2);
  }
 
  public Chunk generateNextChunk(){
    Chunk temp = new Chunk(chunks.size(), getNextChunk());
    Chunk prevChunk = getNextChunk();
    for (ResidualArrayElement rAE: temp.rAEs){
      for (int[] locs: rAE.blockLocs){
        if (locs[0] < 0 && locs[1] != 0 /*The water goes at the top*/){
          prevChunk.blocks[(locs[0]+Chunk.CHUNK_WIDTH)%Chunk.CHUNK_WIDTH][locs[1]] = rAE.bGen.provideBlock();
        }
      }
    }
    return temp;
  }
 
 
 
  public void pollInput() {
   
    if (paused == false){
      if (Mouse.isButtonDown(0)) {
        int mouseX = Mouse.getX();
        int mouseY = Mouse.getY();
        shootProjectile(mouseX, mouseY);
        //entities.add(new EntityMobBat(mouseX,windowHeight-mouseY));
          }
          while (Keyboard.next()) {
            if (Keyboard.getEventKeyState()) {
              if (Keyboard.getEventKey() == Keyboard.KEY_S) {
                player.climbDown(1);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_A) {
                player.walkLeft(-1);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_D) {
                player.walkRight(1);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_W){
                player.climbUp(-1);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_P){
                if(paused == false){
                  paused = true;
                  break;
                }
              } else if (Keyboard.getEventKey() == Keyboard.KEY_SPACE){
                player.weaponSelectedIndex = player.getNextUsableInventorySlot();
                gui.updateLabels(this);
              }
            } else {
              if (Keyboard.getEventKey() == Keyboard.KEY_S) {
                player.climbDown(0);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_A) {
                player.walkLeft(0);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_D) {
                player.walkRight(0);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_W){
                player.climbUp(0);
              } else if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE){
                escapePressed = true;
              }
            }
          }
    } else {
       while (Keyboard.next()) {
              if (Keyboard.getEventKeyState()) {
                if (Keyboard.getEventKey() == Keyboard.KEY_P){
                  paused = false;
                }
              }
           }
      
      }     
    }
 
  public void pollInputNameEntry(){
    while(Keyboard.next()){
      if(Keyboard.getEventKeyState()){
        if (!(Keyboard.getEventKey() == Keyboard.KEY_BACK || Keyboard.getEventKey() == Keyboard.KEY_RETURN) && (((int)Keyboard.getEventCharacter()>=65 && (int)Keyboard.getEventCharacter()<=90) || ((int)Keyboard.getEventCharacter()>=97 && (int)Keyboard.getEventCharacter()<=122)))
        {
          GUILabelNameTyping.addLetter(Keyboard.getEventCharacter());
        } else if (Keyboard.getEventKey() == Keyboard.KEY_BACK){
          GUILabelNameTyping.removeLetter();
        } else if (Keyboard.getEventKey() == Keyboard.KEY_RETURN){
          MineGod.screenIndex = 3;
          MineGod.menuFlag = 0;
          MineGod.gameFlag = 0;
          MineGod.nameFlag = 0;
          GUIScoreMenu.playerName = GUILabelNameTyping.text;
        }
      }
    }
    if (Mouse.isButtonDown(0)) {
      int mouseX = Mouse.getX();
      int mouseY = windowHeight - Mouse.getY();
      gui.handleMouseDown(this, mouseX, mouseY);
        }
  }
 
  private void loadTextures(){
    try {
      //player.texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/player.png"));
      BlockDirt.loadTexture();
      BlockStone.loadTexture();
      BlockSand.loadTexture();
      BlockWater.loadTexture();
      BlockLava.loadTexture();
      BlockHardStone.loadTexture();
      ItemEntityGunpowder.gunpowderTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/gunpowder.png"));
      ItemEntityDiamond.diamondTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/diamond.png"));
     
      EntityMobBat.batTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/mobBat_0.png"));
     
      ProjectileEntitySmall.projectileTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/regShot.png"));
      ProjectileEntityBig.projectileTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/BoomShot.png"));
      ProjectileEntityDestroy.projectileTex = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/destroyShot.png"));
     
    }catch (IOException e){
      e.printStackTrace();
      System.exit(-1);
    }
   
  }
 
 
  private void loadGUITextures(){
    GUIButtonStart.loadTexture();   
    GUILabelProjectileSmall.loadTexture();
    GUILabelProjectileBig.loadTexture();
    GUILabelHealthBar.loadTexture();
    GUILabelProjectileDestroy.loadTexture();
    GUILabelInventory.loadTexture();
    GUIButtonStartMenu.loadTexture();
    GUILabelScore.loadTexture();
    GUILabelNameTyping.loadTexture();
    GUIButtonNameEntry.loadTexture();
    GUIStartMenu.loadTexture();
    GUIButtonGoToHighScores.loadTexture();
    GUIScoreMenu.loadTexture();
    GUILabelYourScore.loadTexture();
  }
 
 
  private void updateMenu(int delta){
    pollMenuInput();
  }
 
 
  public void renderMenuGL() {
    // Clear The Screen And The Depth Buffer
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    // R,G,B,A Set The Color To Blue One Time Only
    //GL11.glColor3f(0.5f, 0.5f, 1.0f);
    GL11.glPushMatrix();
    GL11.glColor3d(1.0, 1.0, 1.0)// THIS IS REALLY NOT NEEDED USUALLY
    gui.render();
   
    GL11.glPopMatrix();
  }
 
 
  public void pollMenuInput(){
    if (Mouse.isButtonDown(0)) {
      int mouseX = Mouse.getX();
      int mouseY = windowHeight - Mouse.getY();
      gui.handleMouseDown(this, mouseX, mouseY);
        }
  }
 
 

  public void shootProjectile(int mouseX, int mouseY){
    switch(player.weaponSelectedIndex){
      case 0: // ProjectileEntitySmall
        if(ProjectileEntitySmall.lastShot > ProjectileEntitySmall.shotSpacing){       
          projectiles.add(new ProjectileEntitySmall(player.xPos, player.yPos).shoot(mouseX, windowHeight-mouseY, player.getScreenX(), player.yPos, player.xSpeed, player.ySpeed));
        }
        break;
      case 1:
        if(ProjectileEntityBig.lastShot > ProjectileEntityBig.shotSpacing){       
          projectiles.add(new ProjectileEntityBig(player.xPos, player.yPos).shoot(mouseX, windowHeight-mouseY, player.getScreenX(), player.yPos, player.xSpeed, player.ySpeed));
          ProjectileEntityBig.lastShot = 0;
          player.inventory[0] = Math.max(player.inventory[0]-1, 0);
          if(!player.hasAmpleResourcesForWeapon(1)){
            player.weaponSelectedIndex = 0;
            ProjectileEntitySmall.lastShot = -ProjectileEntityBig.shotSpacing;
            gui.updateLabels(this);
          }
        }
        break;
      case 2:
        if(ProjectileEntityDestroy.lastShot > ProjectileEntityDestroy.shotSpacing){       
          projectiles.add(new ProjectileEntityDestroy(player.xPos, player.yPos).shoot(mouseX, windowHeight-mouseY, player.getScreenX(), player.yPos, player.xSpeed, player.ySpeed));
          ProjectileEntityDestroy.lastShot = 0;
          player.inventory[1] = Math.max(player.inventory[1]-1, 0);
          if(!player.hasAmpleResourcesForWeapon(2)){
            player.weaponSelectedIndex = 0;
            ProjectileEntitySmall.lastShot = -ProjectileEntityDestroy.shotSpacing;
            gui.updateLabels(this);
          }
        }
    }
  }
 
 
 
 
  public static void main(String[] argv) {
    //System.get
    System.setProperty("org.lwjgl.librarypath",System.getProperty("user.dir") + "/libs/lwjgl-2.8.3/native");
    MineGod game = new MineGod();
    game.start();
  }
}
TOP

Related Classes of MineGod.MineGod

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.