Package engine

Source Code of engine.Planet$PointIncrementThread

package engine;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Interact2D;
import com.threed.jpct.Loader;
import com.threed.jpct.Logger;
import com.threed.jpct.Object3D;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.World;

import font.GLFont;

public class Planet implements IEntity, IEventListener {
  // LOGIC FIELDS
  private int points;
  private Ownership owner;
  private float radius;
  private SimpleVector position;

  private PointIncrementThread pointIncrementThread;

  // RENDER FIELDS
  private Object3D planetObject;
  private Object3D labelHandler;
  private Object3D border;
  private Object3D icosphere;
  // private Object3D border2;
  private boolean visible;

  private static final GLFont font = new GLFont(new Font("Arial", Font.PLAIN, 20));

  private final float LABEL_HEIGHT = 1.0f;

  public Planet() {
  }

  // LOGIC GETTERS AND SETTERS
  public int getPoints() {
    return points;
  }

  public void setPoints(int points) {
    this.points = points;
  }

  public Ownership getOwner() {
    return owner;
  }

  public void setOwner(Ownership owner) {
    this.owner = owner;
  }

  public float getRadius() {
    return radius;
  }

  public void setRadius(float r) {
    radius = r;
  }

  public void setPosition(float x, float y, float z) {
    position = new SimpleVector(x, y, z);
  }

  public void setPosition(SimpleVector v) {
    position = v;
  }

  public SimpleVector getPosition() {
    return position;
  }

  public Object3D getBoundingSphere() {
    return icosphere;
  }

  // RENDER

  public Object3D getPlanetObject() {
    return planetObject;
  }

  @Override
  public void onFocus() {
    // Logger.log("onFocus");
    border.setVisibility(true);
  }

  @Override
  public void onFocusLoss() {
    // Logger.log("onFocusLoss");
    border.setVisibility(false);
  }

  @Override
  public void onSelect() {
    // Logger.log("onSelect");
  }

  @Override
  public void onRelease() {
    // Logger.log("onRelease");
  }

  @Override
  public void onVisible() {
    visible = true;
  }

  @Override
  public void onInvisible() {
    visible = false;
  }

  @Override
  public void onInit(World world, FrameBuffer buffer) {
    planetObject = Loader.loadOBJ("content/planet.obj", null, radius)[0];
    planetObject.translate(position);
    planetObject.compile();
    world.addObject(planetObject);

    icosphere = Loader.loadOBJ("content/icosphere.obj", null, radius * 0.99f)[0];
    icosphere.translate(position);
    world.addObject(icosphere);

    labelHandler = Object3D.createDummyObj();
    labelHandler.translate(0, -LABEL_HEIGHT * radius, 0);
    labelHandler.addParent(planetObject);

    border = Loader.loadOBJ("content/selected.obj", null, radius)[0];
    border.setBillboarding(true);
    border.addParent(planetObject);
    border.setTransparency(50);
   
    border.setTexture("red");
    border.align(planetObject);
    border.setVisibility(false);
    border.compile();
    border.build();
    world.addObject(border);

    pointIncrementThread = new PointIncrementThread(this);
    pointIncrementThread.start();

    visible = true;
  }

  @Override
  public void onUpdate(World world, FrameBuffer buffer) {
    planetObject.setTexture(owner.toString());

    if (visible) {
      SimpleVector labelHandlerProjection = Interact2D.projectCenter3D2D(world.getCamera(), buffer, labelHandler);

      if (labelHandlerProjection != null) {
        String pointString = Integer.toString(points);
        Dimension d = font.getStringBounds(pointString);
        font.blitString(buffer, pointString, (int) labelHandlerProjection.x - d.width / 2, (int) labelHandlerProjection.y, 100, Color.WHITE);
      }
    }
  }

  /**
   * Increments planet points. Larger radius -> faster incrementation.
   */
  private class PointIncrementThread extends Thread {
    private Planet planet;
    private static final int START_OFFSET = 10000;
    private boolean running;

    public PointIncrementThread(Planet planet) {
      this.planet = planet;
      running = true;
    }

    public void run() {
      try {
        Thread.sleep(START_OFFSET);
      } catch (InterruptedException e) {
        Logger.log(e.getMessage());
      }

      while (true) {
        if (running) {
          if (planet.getOwner() != Ownership.NEUTRAL) {
            planet.setPoints(planet.getPoints() + 1);
          }
        }
        try {
          Thread.sleep((long) (10 / planet.getRadius() * 1000));
        } catch (InterruptedException e) {
          Logger.log(e.getMessage());
        }
      }
    }

    public void setRunning(boolean state) {
      running = state;
    }
  }

  public void stopPointIncrementation() {
    pointIncrementThread.setRunning(false);
  }

  public void startPointIncrementation() {
    pointIncrementThread.setRunning(true);
  }
}
TOP

Related Classes of engine.Planet$PointIncrementThread

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.