diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..0c417e5 --- /dev/null +++ b/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..9b0fc3c --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + MAndApps + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..7341ab1 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/AppList.cfg b/AppList.cfg new file mode 100644 index 0000000..1d8e909 --- /dev/null +++ b/AppList.cfg @@ -0,0 +1,3 @@ +MAndApps.apps.MainMenu +MAndApps.apps.Settings +MAndApps.apps.SpaceWars \ No newline at end of file diff --git a/src/MAndApps/apps/BackgroundSettings.java b/src/MAndApps/apps/BackgroundSettings.java new file mode 100644 index 0000000..34d478f --- /dev/null +++ b/src/MAndApps/apps/BackgroundSettings.java @@ -0,0 +1,5 @@ +package MAndApps.apps; + +public class BackgroundSettings { + +} diff --git a/src/MAndApps/apps/GraphicalArrayList.java b/src/MAndApps/apps/GraphicalArrayList.java new file mode 100644 index 0000000..ef30366 --- /dev/null +++ b/src/MAndApps/apps/GraphicalArrayList.java @@ -0,0 +1,5 @@ +package MAndApps.apps; + +public class GraphicalArrayList { + +} diff --git a/src/MAndApps/apps/JonsLearningPlayground.java b/src/MAndApps/apps/JonsLearningPlayground.java new file mode 100644 index 0000000..e08937f --- /dev/null +++ b/src/MAndApps/apps/JonsLearningPlayground.java @@ -0,0 +1,96 @@ +package MAndApps.apps; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.event.KeyEvent; + +import MAndEngine.BasicApp; + +class JonsLearningPlayground implements BasicApp { + + @Override + public Dimension getResolution() { + return new Dimension(800, 600); + } + + @Override + public void initialize() { + // TODO Auto-generated method stub + + } + + @Override + public void resumeApp() { + // TODO Auto-generated method stub + + } + + @Override + public void pauseApp() { + // TODO Auto-generated method stub + + } + + @Override + public void tick() { + // TODO Auto-generated method stub + + } + + @Override + public void render(Graphics2D g) { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void keyReleased(KeyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public String getTitle() { + return "Jons Learning Playground"; + } + + @Override + public Color getColor() { + return Color.WHITE; + } + + @Override + public int getFramerate() { + return 30; + } + + @Override + public boolean getResizable() { + return false; + } + + @Override + public boolean visibleInMenu() { + return true; + } + + @Override + public void resized(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void click() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/MAndApps/apps/MainMenu.java b/src/MAndApps/apps/MainMenu.java new file mode 100644 index 0000000..b37f89c --- /dev/null +++ b/src/MAndApps/apps/MainMenu.java @@ -0,0 +1,248 @@ +package MAndApps.apps; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.event.KeyEvent; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import javax.imageio.ImageIO; + +import MAndEngine.AppHelper; +import MAndEngine.BasicApp; +import MAndEngine.Engine; +import MAndEngine.Variable; +import static MAndEngine.Engine.ANIMATION_CONSTANT; + +public class MainMenu implements BasicApp { + + public static Variable wallpaperPath; + + private static Image BKG; + private Color GREY, GREEN, WHITE, BLACK; + private int xMargin = 300, yMargin = 303, yGap = 50, selection = 0; + private double yOffset = 0; + private Color[] appColors; + private String[] appNames; + private int visibleApps; + private double backgroundScroll = 0; + private int backgroundRange = 0; + + @Override + public Dimension getResolution() { + // TODO Auto-generated method stub + return new Dimension(800, 600); + } + + /** + * THIS PART STARTS STUFF! + * WOO! + */ + @Override + public void initialize() { + + if(wallpaperPath == null) wallpaperPath = new Variable("MAndWorks\\MAndApps\\Settings", "wallpaper", "http://www.controltheweb.com/images/desktop-background-large/milkyWay.jpg", true); + + //COLORS! Because ... wait actually why? + //we don't use the colors. + GREY = new Color(50, 50, 50); + GREEN = new Color(137, 198, 35); + WHITE = new Color(200, 200, 200); + BLACK = new Color(10, 10, 10); + + //WE HAVE APPS THAT ARE LIKE ... VISIBLE. LETS COUNT THEM + visibleApps = 0; + + for (int i = 0, app = 0; app < Engine.apps.length; i++, app++) { + if (Engine.apps[app].visibleInMenu()) { + //oneee...... + //wat no... + //i....... + visibleApps++; + } else { + i--; + } + } + + //these are names, because we can't render null now can we timmy. + //yeah he fucked up the basic course in Graphics2D... + //timmy was me + //2 days ago. + appNames = new String[visibleApps]; + + appColors = new Color[visibleApps]; + + //loopshit. what are we looping? + //FILL THE ARRAYS WITH ALLLLL LTHE DATA! + for (int i = 0, app = 0; app < Engine.apps.length; i++, app++) { + if (Engine.apps[app].visibleInMenu()) { + appNames[i] = Engine.apps[app].getTitle(); + appColors[i] = Engine.apps[app].getColor(); + } else { + i--; + } + } + + backgroundScroll = 0; + + try { + BufferedImage image = ImageIO.read(new URL(wallpaperPath.getValue())); + image = getScaledImage(image, 800); + BKG = image; + backgroundRange = image.getHeight() - 600; + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void pauseApp() { + //why the actual fuck would we pause the main. fucking. menu. + } + + @Override + public void resumeApp() { + //see pause. + } + + @Override + public void tick() { + int desiredYOffset = selection * yGap; + yOffset -= (yOffset - desiredYOffset) / ANIMATION_CONSTANT; + + int desiredBackgroundScroll = (int) (backgroundRange * ((double)selection/(visibleApps - 1))); + backgroundScroll -= ((double)backgroundScroll - desiredBackgroundScroll)/ANIMATION_CONSTANT; + } + + @Override + public void render(Graphics2D g) { + g.drawImage(BKG, 0, (int) (0 - backgroundScroll), null); + + g.setColor(appColors[selection]); + g.fillRect(0, 290, 800, 20); + g.setColor(BLACK); + g.fillRect(0, 291, 800, 18); + g.setColor(WHITE); + + final int clearMargin = 190; + final int range = 100; + + for (int i = 0; i < visibleApps; i++) { + + int y = yMargin + (i * yGap) - (int) yOffset; + float opacity = y; + opacity -= clearMargin; + opacity = opacity < 0 ? 0 : opacity; + + opacity /= range; + + opacity = opacity > 1 ? 1 : opacity; + + g.setColor(createColor(WHITE, opacity)); + + g.drawString(appNames[i], xMargin, y); + } + + g.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 30)); + + g.setColor(Color.WHITE); + g.drawString("MAndApps", 300, 100); + + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyChar() == 'w') + if (selection > 0) + selection--; + else + selection = visibleApps - 1; + if (e.getKeyChar() == 's') + if (selection < visibleApps - 1) + selection++; + else + selection = 0; + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + int openApp = AppHelper.getIDbyName(appNames[selection]); + Engine.switchApps(openApp); + } + } + + @Override + public void keyReleased(KeyEvent e) { + //WE DUNN DO SHIT. + } + + @Override + public String getTitle() { + return "Main Menu"; + } + + @Override + public Color getColor() { + return new Color(255, 255, 255); + } + + @Override + public int getFramerate() { + return 50; + } + + @Override + public boolean getResizable() { + return false; + } + + @Override + public boolean visibleInMenu() { + return false; + } + + /** + * im sorry about creating a new color object every tick.
+ * jk, #soznosoz + * + * @param base + * @param opacity + * @return + */ + public static Color createColor(Color base, float opacity) { + int r = base.getRed(); + int g = base.getGreen(); + int b = base.getBlue(); + int a = (int) (opacity * 255); + return new Color(r, g, b, a); + } + + public static BufferedImage getScaledImage(BufferedImage image, int width) throws IOException { + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + + double scaleX = (double)width/imageWidth; + AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleX); + AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR); + + return bilinearScaleOp.filter( + image, + new BufferedImage(width, (int)(imageHeight * scaleX), image.getType())); + } + + @Override + public void resized(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void click() { + // TODO Auto-generated method stub + + } + +} \ No newline at end of file diff --git a/src/MAndApps/apps/Settings.java b/src/MAndApps/apps/Settings.java new file mode 100644 index 0000000..30bc0e5 --- /dev/null +++ b/src/MAndApps/apps/Settings.java @@ -0,0 +1,307 @@ +package MAndApps.apps; + +import static MAndEngine.Engine.ANIMATION_CONSTANT; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.event.KeyEvent; +import java.io.File; +import java.util.ArrayList; + +import MAndApps.apps.settings.Item; +import MAndEngine.AppHelper; +import MAndEngine.BasicApp; +import MAndEngine.Engine; +import MAndEngine.Variable; + +public class Settings implements BasicApp { + + private static final int WIDTH = 800, HEIGHT = 600; + + // we need to have a home in case all else fails. + private static final String defaultSearchDirectory = System.getenv("APPDATA") + "\\MAndWorks\\MAndApps\\Backgrounds\\"; + + // current selection + private int selection = 0; + + // rendering animation number thing that + // looks like selection but is rendered + // horizontally and stuff. in pixels. BC ANIMATION + private double scroll; + + // TIME. pretty self explanatory. + private static double time = 0; + + // items list + private ArrayList items; + + private File currentDirectoryFile; + private Variable currentDirectoryVariable; + + final int THUMB_WIDTH = 80; + final int THUMB_MARGIN = 30; + final int FULL_WIDTH = THUMB_WIDTH + THUMB_MARGIN; + final int Y_OFFSET = 470; + + final int X_OFFSET_SELECTION = (int)(THUMB_MARGIN + (selection * FULL_WIDTH) - (scroll * FULL_WIDTH)); + + final int LEFT_BAR_WIDTH = FULL_WIDTH + THUMB_MARGIN; + final int INNER_FRAME_HEIGHT = (int)(((WIDTH - LEFT_BAR_WIDTH) / 4d) * 3d); + final int TOP_BAR_HEIGHT = HEIGHT - INNER_FRAME_HEIGHT; + final int INNER_FRAME_WIDTH = WIDTH - LEFT_BAR_WIDTH; + + //YES IT WORKED + + @Override + public Dimension getResolution() { + return new Dimension(WIDTH, HEIGHT); + } + + private void setCurrentDir(String path) { + currentDirectoryVariable.setValue(path); + currentDirectoryFile = new File(path); + } + + @Override + public void initialize() { + //uhhhh basically, i think we forgot to actually... MAKE the folder... + if(!new File(defaultSearchDirectory).exists()) new File(defaultSearchDirectory).mkdir(); + + + // make sure we have our variable and file + // we can explicitly set them as we are trying to pick up where we left + // off + currentDirectoryVariable = new Variable("MAndWorks\\MAndApps\\Settings", "WallpaperSearchDirectory", defaultSearchDirectory, false); + currentDirectoryFile = new File(currentDirectoryVariable.getValue()); + + // which we use, be it variable or file, is completely arbitrary here. + reload(); + } + + private void reload() { + + // we need to reset ERRYTHANG well, important stuff. + items = new ArrayList(); + selection = 0; + + new Thread(new Runnable() { + public void run() { + + repopulate(); + + } + }).start(); + } + + private void repopulate() { + + if (currentDirectoryFile.isDirectory()) { + + // parent? + String parent = currentDirectoryFile.getParent(); + if (parent != null) { + Item item = new Item(parent); + if (item.getSeemsLegit()) + items.add(item); + } + + // folderssss + for (String path : currentDirectoryFile.list()) { + File file = new File(currentDirectoryFile.getAbsolutePath() + "\\" + path); + if (file.isDirectory()) { + Item item = new Item(file.getAbsolutePath()); + if (item.getSeemsLegit()) + items.add(item); + } + } + + // filezzzz + for (String path : currentDirectoryFile.list()) { + File file = new File(currentDirectoryFile.getAbsolutePath() + "\\" + path); + if (!file.isDirectory()) { + Item item = new Item(file.getAbsolutePath()); + if (item.getSeemsLegit()) + items.add(item); + } + } + + } else { + + // how did you manage that... this is specified by the system... + // whatever, i'll reset the variable for you and we can retry... + setCurrentDir(defaultSearchDirectory); + repopulate(); + + } + } + + @Override + public void resumeApp() { + + } + + @Override + public void pauseApp() { + + } + + @Override + public void tick() { + int desiredScroll = selection; + + + scroll -= (scroll - desiredScroll) / (ANIMATION_CONSTANT); + + + time += 1 / 60d; + time = Math.PI + 1; // PI IS TOP, 0/2PI is bottom + } + + @Override + public void render(Graphics2D g) { + + try { + + + //this is the black box + //NOW IN GREY + g.setColor(new Color(200, 200, 200)); + g.fillRect(0, 0, WIDTH, HEIGHT); + + try{ + g.drawImage(items.get(selection).getImage(), WIDTH - items.get(selection).getImage().getWidth()/2 - INNER_FRAME_WIDTH/2, TOP_BAR_HEIGHT, null); + }catch(Exception e) { + //between ticks, nothing really big + } + + + g.setColor(new Color(225, 225, 225)); + g.fillRect(0, 0, WIDTH, TOP_BAR_HEIGHT); + g.setColor(new Color(255, 127, 0)); + g.drawLine(0, TOP_BAR_HEIGHT - 1, WIDTH, TOP_BAR_HEIGHT - 1); + + g.setColor(new Color(240, 240, 240)); + g.fillRect(0, 0, FULL_WIDTH + THUMB_MARGIN, HEIGHT); + g.setColor(new Color(255, 127, 0)); + g.drawLine(LEFT_BAR_WIDTH - 1, 0, LEFT_BAR_WIDTH - 1, HEIGHT); + + g.setColor(new Color(35, 35, 35)); + //g.setFont(Main.largerFont); + int dirWidth = g.getFontMetrics().stringWidth(currentDirectoryVariable.getValue()); + + g.drawString(currentDirectoryVariable.getValue(), LEFT_BAR_WIDTH + THUMB_MARGIN, TOP_BAR_HEIGHT / 2 + 5); + + + + for (int i = 0; i < items.size(); i++) + g.drawImage(items.get(i).getThumbnail(), THUMB_MARGIN, -1 + (int)(THUMB_MARGIN + (i * FULL_WIDTH) - (scroll * FULL_WIDTH)), null); + + /* + g.setColor(Color.WHITE); + g.drawRect(THUMB_MARGIN - 2, Y_OFFSET - 2, THUMB_WIDTH + 3, THUMB_WIDTH + 3); + + g.setColor(Color.BLACK); + g.drawRect(THUMB_MARGIN - 1, Y_OFFSET - 1, THUMB_WIDTH + 1, THUMB_WIDTH + 1); + g.drawRect(THUMB_MARGIN - 3, Y_OFFSET - 3, THUMB_WIDTH + 5, THUMB_WIDTH + 5); + */ + g.setColor(new Color(0, 127, 255)); + g.fillRect(445, 285, 35, 100); + + g.setColor(new Color(0, 127, 255)); + g.fillRect(350, 300, 150, 100); + g.setColor(new Color(255, 255, 255)); + g.fillRect(351, 301, 148, 98); + + } catch (Exception e) { + + g.setColor(Color.BLACK); + g.fillRect(0, 0, 800, 600); + g.setColor(Color.WHITE); + g.drawString("Please wait...", 0, 600); + e.printStackTrace(); + } + + } + + @Override + public void keyPressed(KeyEvent e) { + + Engine.log("" + e.getKeyCode()); + + if (e.getKeyCode() == KeyEvent.VK_D || + e.getKeyCode() == KeyEvent.VK_S) { + if (selection == items.size() - 1) + selection = 0; + else + selection++; + } + if (e.getKeyCode() == KeyEvent.VK_A || + e.getKeyCode() == KeyEvent.VK_W) { + selection--; + if (selection < 0) + selection = items.size() - 1; + } + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (new File(items.get(selection).getPath()).isDirectory()) { + setCurrentDir(items.get(selection).getPath()); + reload(); + } else { + MainMenu.wallpaperPath.setValue(items.get(selection).getPath()); + Engine.switchApps(AppHelper.getIDbyClass("Main Menu")); + } + } + if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { + + if(selection == 0) { + Engine.switchApps(AppHelper.getIDbyClass("Main Menu")); + } else { + selection = 0; + } + + } + } + + @Override + public void keyReleased(KeyEvent e) { + + } + + @Override + public String getTitle() { + return "Settings"; + } + + @Override + public Color getColor() { + return new Color(255, 127, 0); + } + + @Override + public int getFramerate() { + return 30; + } + + @Override + public boolean getResizable() { + return false; + } + + @Override + public boolean visibleInMenu() { + return true; + } + + @Override + public void resized(int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public void click() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/MAndApps/apps/settings/Item.java b/src/MAndApps/apps/settings/Item.java new file mode 100644 index 0000000..1dce9f3 --- /dev/null +++ b/src/MAndApps/apps/settings/Item.java @@ -0,0 +1,125 @@ +package MAndApps.apps.settings; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +public class Item { + + private static int scaleToHeight; + + //cropped to a thumb nail, of size 80*80 + private final BufferedImage thumbnail; + + //the original image, not cropped or anything. + private final BufferedImage image; + + //Absolute path, i think. + private final String path; + private String name; + + // we need this because im scared. + // if literally anything in the creating of an item + // goes MODERATELY wrong, you set this to FALSE. + // then we don't try and render something that + // makes no sense. + // set this to false by the end of the constructor + // and when it comes back to being added to the list, + // it'll be thrown out. + private boolean seemsLegit = true; + + public Item(String path) { + + BufferedImage thumbnail = null; + BufferedImage image = null; + + try { + File file = new File(path); + if (file.isDirectory()) { + // then lets do the directory thing! + + thumbnail = new BufferedImage(80, 80, BufferedImage.TYPE_INT_ARGB); + Graphics thumbnailGraphics = thumbnail.getGraphics(); + thumbnailGraphics.setColor(new Color(0, 0, 255)); + thumbnailGraphics.fillRect(0, 0, 80, 80); + + image = new BufferedImage((int)((scaleToHeight/3d)*4d), scaleToHeight, BufferedImage.TYPE_INT_ARGB); + Graphics imageGraphics = image.getGraphics(); + imageGraphics.fillRect(0, 0, (int)((scaleToHeight/3d)*4d), scaleToHeight); + + imageGraphics.setColor(Color.black); + imageGraphics.drawString("" + path, 100, 100); + + name = file.getName(); + + } else { + + // try and do the image thing! + image = ImageIO.read(file); + image = getScaledImage(image, scaleToHeight); + thumbnail = (getScaledImageFill(image, 80, 80)); + path = file.getAbsolutePath(); + + // discard it as it won't fit the screen. + if (!(((double) image.getWidth() / image.getHeight()) <= (4 / 3d))) { + seemsLegit = false; + } + + name = ""; + } + } catch (Exception e) { + seemsLegit = false; + } + + this.image = image; + this.path = path; + this.thumbnail = thumbnail; + } + + public boolean getSeemsLegit() { + return seemsLegit; + } + + private static BufferedImage getScaledImage(BufferedImage image, int height) throws IOException { + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + double scale = (double) height / imageHeight; + AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale, scale); + AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR); + return bilinearScaleOp.filter(image, new BufferedImage((int) (imageWidth * scale), height, image.getType())); + } + + private static BufferedImage getScaledImageFill(BufferedImage image, int width, int height) throws IOException { + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + double scaleX = (double) width / imageWidth; + double scaleY = (double) height / imageHeight; + double scale = scaleX > scaleY ? scaleX : scaleY; + AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale, scale); + AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR); + return bilinearScaleOp.filter(image, new BufferedImage(width, height, image.getType())); + } + + public BufferedImage getImage() { + return image; + } + + public BufferedImage getThumbnail() { + return thumbnail; + } + + public String getPath() { + return path; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..1a0a692 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,30 @@ +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; +import java.util.Scanner; + +import MAndEngine.Engine; + +public class Main { + public static void main(String[] args) { + try{ + Scanner scan = new Scanner(new FileInputStream(new File("./AppList.cfg"))); + + ArrayList list = new ArrayList(); + while(scan.hasNextLine()) { + String line = scan.nextLine(); + list.add("" + line); + + } + + String[] classes = new String[list.size()]; + classes = list.toArray(classes); + + Engine engine = new Engine(classes, true); + engine.run(); + + }catch(Exception e) { + e.printStackTrace(); + } + } +}