Java tutorial
/** * Copyright (c) 25/feb/2015 Davide Cossu & Matthew Albrecht. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, see <http://www.gnu.org/licenses>. */ package com.minestellar.core.gui; import cpw.mods.fml.client.FMLClientHandler; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.resources.I18n; import org.lwjgl.opengl.GL11; import com.minestellar.core.Constants; import com.minestellar.core.MinestellarCore; import com.minestellar.core.blocks.machines.Computer; import com.minestellar.core.blocks.tile.TileEntityComputer; import com.minestellar.core.gui.widget.GuiDraw; import com.minestellar.core.gui.widget.GuiScreenWidget; import com.minestellar.core.gui.widget.GuiSideBarWidget; import com.minestellar.core.gui.widget.GuiWidget; import com.minestellar.core.gui.widget.planets.GuiPlanet; import com.minestellar.core.handler.FileHandler; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Iterator; /** * GuiScreen for the {@link Computer} and {@link TileEntityComputer} */ public class ComputerGui extends GuiScreenWidget { public int screenWidth, screenHeight, spaceX, spaceY, spaceWidth, spaceHeight, earthA, earthB; private boolean doesDraw = false; private static ArrayList<String> knownPlanets = new ArrayList<String>(); public ArrayList<GuiPlanet> planets = new ArrayList<GuiPlanet>(); public ArrayList<Point2D.Double> earthCoordsArray = new ArrayList<Point2D.Double>(); public ArrayList<Point2D.Double> moonCoordsArray = new ArrayList<Point2D.Double>(); public ArrayList<Point2D.Double> mercuryCoordsArray = new ArrayList<Point2D.Double>(); public ArrayList<Point2D.Double> venusCoordsArray = new ArrayList<Point2D.Double>(); private static PlanetMover earthMover, venusMover, moonMover; public static GuiPlanet selectedPlanet, sun, earth, moon, venus; public GuiSideBarWidget planetInfoTop, planetInfoLeft, planetInfoBottom, planetInfoRight; /** * @param knownPlanets The planets known by the player. It's used to display only those */ public ComputerGui(ArrayList<String> knownPlanets) { super(GuiDraw.displaySize().width, GuiDraw.displaySize().height); // 0,0 is in the top left corner ComputerGui.knownPlanets = knownPlanets; this.screenWidth = GuiDraw.displaySize().width; this.screenHeight = GuiDraw.displaySize().height; this.spaceX = this.spaceY = 10; this.spaceWidth = this.screenWidth - this.spaceX * 2; this.spaceHeight = this.screenHeight - this.spaceY * 2; this.earthA = 152 / 2; this.earthB = 147 / 2; GuiDraw.fillEllipseCoordsArray(earthA, earthB, earthCoordsArray); GuiDraw.fillEllipseCoordsArray(384 / 152, 383 / 147, moonCoordsArray); GuiDraw.fillEllipseCoordsArray(108 / 2, 107 / 2, venusCoordsArray); GuiDraw.fillEllipseCoordsArray(57 / 2, 56 / 2, mercuryCoordsArray); } @Override public void updateScreen() { super.updateScreen(); if (selectedPlanet != null) { if (doesDraw) { setDraw(false); add(planetInfoLeft = new GuiSideBarWidget(screenWidth, screenHeight, 200, screenHeight, 1) .setColors(0xAA555555, 0xAA000000).setTitle(selectedPlanet.getName()) .setContent("dimension", I18n.format("data." + selectedPlanet.getName() + ".dimension")) .setContent("gravity", I18n.format("data." + selectedPlanet.getName() + ".gravity"))); } } if (selectedPlanet == null && !this.doesDraw) { setDraw(true); removeSidebars(); } setWorldAndResolution(FMLClientHandler.instance().getClient(), screenWidth, screenHeight); } @Override public void addWidgets() { add(sun = new GuiPlanet(getMid(screenWidth) - (int) Math.sqrt(earthA ^ 2 - earthB ^ 2), getMid(screenHeight) - 4, "sun")); String text = FileHandler.readFromFile(Constants.coordinatesFile, false); if (text != null) { String[] split = text.split(" "); if (split.length >= 3) { String textX = split[1]; String textY = split[2]; int x = Integer.parseInt(textX); int y = Integer.parseInt(textY); if (x > 0 && y > 0) { if (knownPlanets.contains("moon")) { add(moon = new GuiPlanet(x, y, "moon")); moon.setSize(x, y, 4, 4); planets.add(moon); MinestellarCore.planetMovers.add(new PlanetMover(Planet.MOON)); } if (knownPlanets.contains("earth")) { add(earth = new GuiPlanet(x, y, "earth")); planets.add(earth); MinestellarCore.planetMovers.add(new PlanetMover(Planet.EARTH)); } if (knownPlanets.contains("venus")) { add(venus = new GuiPlanet(x, y, "venus")); planets.add(venus); MinestellarCore.planetMovers.add(new PlanetMover(Planet.VENUS)); } } else { if (knownPlanets.contains("moon")) { add(moon = new GuiPlanet(x, y, "moon")); moon.setSize(x, y, 4, 4); planets.add(moon); MinestellarCore.planetMovers.add(new PlanetMover(Planet.MOON)); } if (knownPlanets.contains("earth")) { add(earth = new GuiPlanet(x, y, "earth")); planets.add(earth); MinestellarCore.planetMovers.add(new PlanetMover(Planet.EARTH)); } if (knownPlanets.contains("venus")) { add(venus = new GuiPlanet(x, y, "venus")); planets.add(venus); MinestellarCore.planetMovers.add(new PlanetMover(Planet.VENUS)); } } } } } @Override public void drawBackground() { drawDefaultBackground(); GuiDraw.drawRect(spaceX, spaceY, spaceWidth, spaceHeight, 0xFF000000); } @Override public void drawForeground() { GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_TEXTURE_2D); { GL11.glPushMatrix(); { GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glDisable(GL11.GL_TEXTURE_2D); // Earth GL11.glColor4d(0, 0, 1, 1); Tessellator tess = Tessellator.instance; tess.startDrawing(GL11.GL_LINES); for (Point2D.Double anEarthCoordsArray : earthCoordsArray) { tess.addVertex(getMid(screenWidth) + 4 + anEarthCoordsArray.x, getMid(screenHeight) + 4 + anEarthCoordsArray.y, 0.0D); } tess.draw(); if (knownPlanets.contains("moon")) { GL11.glColor4d(0.89, 0.89, 0.89, 1); tess.startDrawing(GL11.GL_LINES); for (Point2D.Double aMoonCoordsArray : moonCoordsArray) { tess.addVertex(earth.x + 4 + aMoonCoordsArray.x, earth.y + 4 + aMoonCoordsArray.y, 0.0D); } tess.draw(); } if (knownPlanets.contains("venus")) { GL11.glColor4d(0.84, 0.63, 0.29, 1); tess.startDrawing(GL11.GL_LINES); for (Point2D.Double aVenusCoordsArray : venusCoordsArray) { tess.addVertex(getMid(screenWidth) + 4 + aVenusCoordsArray.x, getMid(screenHeight) + 4 + aVenusCoordsArray.y, 0.0D); } tess.draw(); } } GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(true); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_TEXTURE_2D); } GL11.glPopMatrix(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); } @Override public void actionPerformed(String ident, Object... params) { if (ident.equals("test")) { System.out.println(ident); } } @Override public boolean doesGuiPauseGame() { return false; } /** * Sets the <code>doesDraw</code> variable to the parameter * * <p><code>doesDraw</code> is used to draw only one time the {@link GuiSideBarWidget} * * @param b The boolean * @see GuiSideBarWidget */ public void setDraw(boolean b) { this.doesDraw = b; } /** * Sets the selected planet to draw the {@link GuiSideBarWidget} */ public void setSelectedPlanet(GuiPlanet planet) { selectedPlanet = planet; } /** * Returns the current selected planet * * @return The current selected planet */ public GuiPlanet getSelectedPlanet() { return selectedPlanet; } /** * Removes all the sidebars from the screen */ public void removeSidebars() { Iterator<GuiWidget> iterator = widgets.listIterator(); while (iterator.hasNext()) { GuiWidget next = iterator.next(); if (next == planetInfoBottom || next == planetInfoLeft || next == planetInfoRight || next == planetInfoTop) { iterator.remove(); } } planetInfoBottom = null; planetInfoLeft = null; planetInfoRight = null; planetInfoTop = null; } /** * Calculates the new planet coordinates */ public static void movePlanets() { // if(earthMover != null){ // earthMover.run(); // }else{ // earthMover = new PlanetMover(Planet.EARTH); // } // // if(moonMover != null){ // if(knownPlanets.contains("moon")) moonMover.run(); // }else{ // moonMover = new PlanetMover(Planet.MOON); // } // // if(venusMover != null){ // if(knownPlanets.contains("venus")) venusMover.run(); // }else{ // venusMover = new PlanetMover(Planet.VENUS); // } for (PlanetMover mover : MinestellarCore.planetMovers) { mover.run(); } } /** * Gets the planet object from the given variable name * <p>Unfortunately it cant be used in any static context</p> * * @param name The name of the variable to search * @return The object corresponding */ public GuiPlanet getPlanetFromString(String name) { GuiPlanet p = null; try { p = (GuiPlanet) this.getClass().getDeclaredField(name.toLowerCase()).get(this); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return p; } /** * Sets the coordinates of the planets */ public static void setPlanetCoordinates() { String text = FileHandler.readFromFile(Constants.coordinatesFile, false); if (text != null) { String[] split = text.split(" "); if (split.length >= 3) { String name = split[0].toLowerCase(); String x = split[1]; String y = split[2]; if (name.equals("earth") && earth != null) { //Unfortunately I can't use the ComputerGui#getPlanetFromString(String). Because I can't use static methods earth.setCoords(Integer.parseInt(x), Integer.parseInt(y)); } else if (name.equals("moon") && moon != null) { moon.setCoords(Integer.parseInt(x), Integer.parseInt(y)); } else if (name.equals("venus") && venus != null) { venus.setCoords(Integer.parseInt(x), Integer.parseInt(y)); } } } } }