From 9c75add9d6527fe5545c74c5db0ccb46dd006d6c Mon Sep 17 00:00:00 2001 From: Kleme Date: Wed, 28 Jun 2017 21:28:16 +0200 Subject: [PATCH] Initial commit --- .classpath | 7 + .gitignore | 2 + .project | 17 ++ .settings/org.eclipse.jdt.core.prefs | 11 + res/icon_luigi.png | Bin 0 -> 315 bytes res/icon_luigi_fire.png | Bin 0 -> 309 bytes res/icon_mario.png | Bin 0 -> 300 bytes res/icon_mario_fire.png | Bin 0 -> 307 bytes res/luigi.png | Bin 0 -> 2084 bytes res/luigi_fire.png | Bin 0 -> 2087 bytes res/mario.png | Bin 0 -> 2103 bytes res/mario_fire.png | Bin 0 -> 2068 bytes src/fr/klemek/minimario/Launch.java | 23 ++ src/fr/klemek/minimario/MarioAI.java | 258 +++++++++++++++++++++++ src/fr/klemek/minimario/MarioWindow.java | 168 +++++++++++++++ src/fr/klemek/minimario/TilePanel.java | 66 ++++++ src/fr/klemek/minimario/Utils.java | 93 ++++++++ 17 files changed, 645 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 res/icon_luigi.png create mode 100644 res/icon_luigi_fire.png create mode 100644 res/icon_mario.png create mode 100644 res/icon_mario_fire.png create mode 100644 res/luigi.png create mode 100644 res/luigi_fire.png create mode 100644 res/mario.png create mode 100644 res/mario_fire.png create mode 100644 src/fr/klemek/minimario/Launch.java create mode 100644 src/fr/klemek/minimario/MarioAI.java create mode 100644 src/fr/klemek/minimario/MarioWindow.java create mode 100644 src/fr/klemek/minimario/TilePanel.java create mode 100644 src/fr/klemek/minimario/Utils.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..198fccd --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01befa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/resources/* \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..44decaf --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + MiniMario + + + + + + 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..bb35fa0 --- /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.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +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.8 diff --git a/res/icon_luigi.png b/res/icon_luigi.png new file mode 100644 index 0000000000000000000000000000000000000000..e755d01d5cd5eb4f728a94dce55890e7fe169f0b GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33Jwr2>%=KS^igtLq zIEGmGpY7i$ddPss#gt7|RoQ?o_1J`zI)~ z;u2HcU2Eq1e2J~$KUcM`KYh+CVcXv5hm0E^2!CK@_^tb3>Kcys{&`z%pE1We{+@g9 z&Y|cM{{!vQUP%AVol!k!zZbilZqTt}fhjZ7SW=fsy13-uVA)f5&S%qepdT1KUHx3v IIVCg!0Dl&DnE(I) literal 0 HcmV?d00001 diff --git a/res/icon_luigi_fire.png b/res/icon_luigi_fire.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5c385506cf52ee4cf3b181cea8737eac7213a7 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33Jwr2>%=KS^iZ*$= zIEGmGpY1;=dPqUQMf0$bj-qNnQ))z;d%tDX77_0SB6%}7XO<>-etEIyyL`$_Nv9wD zQ-j)$NOd<9g{;Az^lhW=&h|{+HXCWRw;p%Jdho^3-#eg=|#V|LoX= z_vzaYdHe9(*HhPSy!ma@A?BKcLKm1C{>pt=m&n0-`cd9i+h?-A2ftabt>k`x(S}i8 y=b`jhvooR}!wVN|==k#dKxT^7As|+25x6Ire%;O3PY>vL1_n=8KbLh*2~7YakZ>3P literal 0 HcmV?d00001 diff --git a/res/icon_mario.png b/res/icon_mario.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c49a3b1fb7a06fa07a8fe836a2b08ec08c4f40 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK3bmJ-GTJ6(gCnhd(4pZ3(cee7CrrKW{<)uj3>+Y{$s roc7)BkSou7-;FQzTC>!+l@`hW@p6AS&s5qS=x7E{S3j3^P6!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33Jwr2>%=KS^iZ*z< zIEGmGpY1;=cvwMzS@ZDHB`jVZl6uOiPi7hgHO-%Ls6XPE6*r%CrJJ$!17{(%KkZ(c z&PhE>-Ou}4v6wuc!+&Yd+Nh*Q3>gMX!=G0EUdzzVks)zhIfn7@{U+H^ofD^b8$PKl z(%y6A$cM*vk(_6?O&67WzLvh4b@Pr(&-K({k^y85}Sb4q9e0L^1@N&o-= literal 0 HcmV?d00001 diff --git a/res/luigi.png b/res/luigi.png new file mode 100644 index 0000000000000000000000000000000000000000..111e47d8528acd2087d2b53fd37eb8e8351b4296 GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/res/mario_fire.png b/res/mario_fire.png new file mode 100644 index 0000000000000000000000000000000000000000..e47f57b9fbd33a5dbf38c517e839d4167073fd23 GIT binary patch literal 2068 zcmV+v2Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00)FgL_t(|UhP^za^yA)^fU659CP#&@{D~( zo{?jokYk>($9;-#8#IKbTO3jZC3-yGny%^+MFOn`Alqy2y!@*8>(AeQf^qxAuLKPC z?d{EZX2`FvuRm+X(G#By9q#OqIm})Dk8ggxGGyv1n{D?vgx1>QsLmZe!r-IoQOlM$eEa5K{bUN%OZZZD0X+`!he1m1gL4t9bLDg?GFLH)o?*E^AHpI{)qpnjmE1?nk(Q$bnn4QFMA@%6 zD%dVt>;virw%A2_D?MT#=e8__zEaPQv=k-S8O9Dcg2z3go;NVQ)v=i)J;vJl2530G zs%*K%njZELA2~gCk;rvQTnZ(jG}4Iuido!fozbHw5RJUz&vRqAH$(2|X`J2PfCEO1 z-4?G^Udp6p+`_0<(II*JfSuhgfQ?(q0fJ$KW*`Fc0kcC!p{j@bS-n=XxOdi{YU;Y9=YJ)` zHF$&CW6v}CoAt<9AfA5wuXUiU;S*x;FhY82YR99XSfDiD0-@) zJfnxkvq=~A9JP*Zm3+}i1A5wbUGo{?F$XWYF%Sw)h#fNront= z9G$`fJ;amS-xa=Z|0g^r zjjMXhw`HLYm;VhpGi3U)6>r!NPn1%M%BcmKf zVi3wMR_IZqG(Bpm*By@FaU5!oj6=e`P##JH{8@Cg9)0^lGZ{B^w*dJ2kOE>6v6!n8=*YdwODKz+!?hqZ?xSXHInDjq|&q&ds@IM zJ?Q9wl`ReM$QPl$*sEHH`yONW8Qq;>9j@LZCc?W=9X8Xpo5UH+9T|*gmO_0Ug_iw_ z_tGo1M!v^$&HI5y4a6bWmOF1X^?ayJqafDBcnsFp_NxQWBdrU~cf(eoZSTmU5eE)T zmK>)P*x?8scU2E{vJS5k&8KF?L4A&*WAS!deAQa@*-)DUal7IHHi8f%ulS7=u zo*f_Y5YR=jK2++;eO*wb?NG;X%|=r1%#c^;0qB#yuvfHde|~SnEc!B7#xXV|_TUg~ zS>6(of-QCh1=RLpX$I@K$2rYLN)wD>kxk9ei7uJC8erqBj;YkI-LY~d}vQgp17TJ9Yj=^+;X_P{mR1hh)7 zad#hD**Xctvq!EcUs%wykeY3<07AL&hMbq7p}mdD{5Y=TV( zYu(v83D&E+`Wy?X*@iX_gXM6s4{EW(L#XD6p*;lswDMrfeW5G>0000=this.maxspdy){ + int randi = rand.nextInt(100); + if(randi<40){ //0-39 - 40% + this.state = State.STILL; + }else if(randi<70){ //40-69 - 30% + this.state = State.WALKING; + }else{ //70-99 - 30% + this.state = State.RUNNING; + } + } + break; + case STILL_BACK: + case STILL_LOOK_UP: + case STILL_WIN: + case STILL_DUCK: + case STILL: + if(this.time2100){ + this.time2 = this.time+rand.nextInt(MAX_STILL_TIME)+MIN_STATE_TIME; + this.wait = true; + this.state = State.STILL; + } + break; + } + + this.pos = Utils.add(this.pos, speed); + + if(pos.x<=minx && this.left || pos.x+sizex>=maxx && !this.left){ + this.turn = true; + this.left = !this.left; + } + + int[] ybounds = Utils.getYBounds((int) pos.x); + + if(this.state != State.JUMPING){ + if(pos.yybounds[1]){ + this.spdy = -rand.nextFloat()*speedf*MAX_JUMP_SPEED_Y; + this.maxspdy = 0f; + this.state = State.JUMPING; + } + } + + return new Point((int)this.pos.x, (int)this.pos.y); + } + + public int getTile(){ + if(this.turn){ + if(this.time%200>=100){ + this.turn = false; + } + return MARIO_TURNING; + }else{ + switch(this.state){ + case LOOSING: + return MARIO_LOOSING; + case WALKING: + return this.time%400<200?MARIO_STILL:MARIO_WALKING_2; + case RUNNING: + return this.time%150<75?MARIO_RUNNING_1:MARIO_RUNNING_2; + case JUMPING: + return this.spdy<=1f?MARIO_JUMPING:MARIO_FALLING; + case STILL_LOOK_UP: + return MARIO_LOOK_UP; + case STILL_WIN: + return MARIO_WIN; + case STILL_BACK: + return MARIO_BACK; + case STILL_DUCK: + return MARIO_DUCK; + case STILL: + default: + return MARIO_STILL; + } + } + } + + public boolean isReversed(){ + return this.left; + } + +} diff --git a/src/fr/klemek/minimario/MarioWindow.java b/src/fr/klemek/minimario/MarioWindow.java new file mode 100644 index 0000000..bd5f4f0 --- /dev/null +++ b/src/fr/klemek/minimario/MarioWindow.java @@ -0,0 +1,168 @@ +package fr.klemek.minimario; + +import java.awt.AWTException; +import java.awt.Color; +import java.awt.Menu; +import java.awt.MenuItem; +import java.awt.Point; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Random; + +import javax.imageio.ImageIO; +import javax.swing.JWindow; +import javax.swing.Timer; + +public class MarioWindow extends JWindow implements ActionListener { + + private static final long serialVersionUID = 1L; + + private static final String VERSION = "1.5"; + + private static final int REFRESH_MS = 20; + private static final int TILE_W = 20; + private static final int TILE_H = 24; + + private TilePanel p; + private final Timer refresh; + + private int factor = 2; + + private MarioAI ai; + + private Point initialClick; + + public MarioWindow() throws IOException { + + this.setBackground(new Color(0, 0, 0, 0)); + this.setLocationRelativeTo(null); + + this.ai = new MarioAI(TILE_W*factor,TILE_H*factor, factor); + + Random r = new Random(); + String tileset_name = "mario"; + if(r.nextInt(100)>=90){ //90-99 - 10% + tileset_name = "luigi"; + } + + if(r.nextInt(100)>=99){ //99 - 1% + tileset_name += "_fire"; + } + + + BufferedImage tileset = ImageIO.read(this.getClass().getResource("/"+tileset_name+".png")); + this.p = new TilePanel(this, tileset, TILE_W, TILE_H, factor); + + this.p.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + initialClick = e.getPoint(); + getComponentAt(initialClick); + } + }); + + this.p.addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + + // get location of Window + int thisX = getLocation().x; + int thisY = getLocation().y; + + // Determine how much the mouse moved since the initial click + int xMoved = (thisX + e.getX()) - (thisX + initialClick.x); + int yMoved = (thisY + e.getY()) - (thisY + initialClick.y); + + // Move window to this position + int X = thisX + xMoved; + int Y = thisY + yMoved; + setLocation(X, Y); + ai.moved(getLocation()); + } + }); + + this.add(this.p); + + this.refresh = new Timer(REFRESH_MS, this); + + this.pack(); + this.setAlwaysOnTop(true); + + if (!SystemTray.isSupported()) { + System.out.println("SystemTray is not supported"); + return; + } + + TrayIcon trayIcon = new TrayIcon(Utils.createImage("/icon_"+tileset_name+".png", "icon")); + trayIcon.setImageAutoSize(true); + + final PopupMenu popup = new PopupMenu(); + + + + Menu sizeMenu = new Menu("Change size"); + popup.add(sizeMenu); + + for(int i = 0; i < 5; i++){ + final int f = (int)Math.pow(2, i); + MenuItem size = new MenuItem(f+"x"); + size.addActionListener(new ActionListener(){ + @Override + public void actionPerformed(ActionEvent e) { + setFactor(f); + } + }); + sizeMenu.add(size); + } + + MenuItem exit = new MenuItem("Kill it !"); + exit.addActionListener(new ActionListener(){ + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + popup.add(exit); + + trayIcon.setPopupMenu(popup); + trayIcon.setToolTip("MiniMario ! (version "+VERSION+")\nBy Klemek"); + + final SystemTray tray = SystemTray.getSystemTray(); + try { + tray.add(trayIcon); + } catch (AWTException e) { + System.out.println("TrayIcon could not be added."); + } + + + this.setVisible(true); + + this.ai.setPos(this.getLocation()); + + this.refresh.start(); + } + + private void setFactor(int factor){ + this.setVisible(false); + this.factor = factor; + this.ai.setSize(TILE_W*factor,TILE_H*factor, factor); + this.p.setFactor(factor); + this.pack(); + this.setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getSource().equals(this.refresh)) { + this.setLocation(this.ai.refresh(REFRESH_MS)); + this.p.setTile(this.ai.getTile(), this.ai.isReversed()); + } + } +} diff --git a/src/fr/klemek/minimario/TilePanel.java b/src/fr/klemek/minimario/TilePanel.java new file mode 100644 index 0000000..2602d40 --- /dev/null +++ b/src/fr/klemek/minimario/TilePanel.java @@ -0,0 +1,66 @@ +package fr.klemek.minimario; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.image.BufferedImage; + +import javax.swing.JPanel; +import javax.swing.JWindow; + +public class TilePanel extends JPanel { + + private static final long serialVersionUID = 1L; + + private final int tileWidth, tileHeight, imageWidth, imageHeight, columns, rows; + private int id, factor; + private BufferedImage image; + private boolean reversed = false; + + + + public TilePanel(JWindow parent, BufferedImage image, int tileWidth, int tileHeight, int factor) { + super(); + this.tileWidth = tileWidth; + this.tileHeight = tileHeight; + this.image = image; + this.imageWidth = image.getWidth(); + this.imageHeight = image.getHeight(); + this.columns = this.imageWidth / this.tileWidth; + this.rows = this.imageHeight / this.tileHeight; + System.out.println("Tileset : "+this.columns+"x"+this.rows); + this.setFactor(factor); + this.setBackground(new Color(0, 0, 0, 0)); + this.setOpaque(false); + } + + public void setFactor(int factor){ + this.factor = factor; + Dimension size = new Dimension(tileWidth * factor, tileHeight * factor); + this.setPreferredSize(size); + this.setMinimumSize(size); + this.setMaximumSize(size); + } + + @Override + public void paintComponent(Graphics g) { + g.clearRect(0, 0, tileWidth * factor, tileHeight * factor); + if (id >= 0 && id < rows * columns) { + if (reversed) { + g.drawImage(image, 0, 0, tileWidth * factor, tileHeight * factor, (1 + id % columns) * tileWidth, + (id / columns) * tileHeight, (id % columns) * tileWidth, (1 + id / columns) * tileHeight, this); + } else { + g.drawImage(image, 0, 0, tileWidth * factor, tileHeight * factor, (id % columns) * tileWidth, + (id / columns) * tileHeight, (1 + id % columns) * tileWidth, (1 + id / columns) * tileHeight, this); + } + } + g.dispose(); + } + + public void setTile(int id, boolean reversed) { + this.id = id; + this.reversed = reversed; + this.repaint(); + } + +} diff --git a/src/fr/klemek/minimario/Utils.java b/src/fr/klemek/minimario/Utils.java new file mode 100644 index 0000000..189b7c1 --- /dev/null +++ b/src/fr/klemek/minimario/Utils.java @@ -0,0 +1,93 @@ +package fr.klemek.minimario; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.geom.Point2D; +import java.net.URL; + +import javax.swing.ImageIcon; + +public abstract class Utils { + + private static Rectangle[] bounds = new Rectangle[0]; + + public static Point2D.Float add(Point2D.Float p1, Point2D.Float p2) { + return new Point2D.Float(p1.x + p2.x, p1.y + p2.y); + } + + public static int getMaxX() { + int maxx = 0; + + GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); + if(bounds.length == 0){ + bounds = new Rectangle[gds.length]; + } + for (int i = 0; i < gds.length; i++) { + GraphicsDevice gd = gds[i]; + bounds[i] = gd.getDefaultConfiguration().getBounds(); + if(bounds[i].getMaxX()>maxx){ + maxx=(int) bounds[i].getMaxX(); + } + } + return maxx; + } + + public static int getMinX(){ + int minx = 0; + GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); + if(bounds.length == 0){ + bounds = new Rectangle[gds.length]; + } + for (int i = 0; i < gds.length; i++) { + GraphicsDevice gd = gds[i]; + bounds[i] = gd.getDefaultConfiguration().getBounds(); + if(bounds[i].getMinX()=b.getMinX()&&x<=b.getMaxX()){ + if(out == null){ + out = new int[]{(int)b.getMinY(),(int)b.getMaxY()}; + }else{ + if(b.getMinY()out[1]) + out[1] = (int) b.getMaxY(); + } + } + } + if(out == null) + out = new int[]{0,0}; + return out; + } + + //Obtain the image URL + public static Image createImage(String path, String description) { + URL imageURL = Utils.class.getResource(path); + + if (imageURL == null) { + System.err.println("Resource not found: " + path); + return null; + } else { + return (new ImageIcon(imageURL, description)).getImage(); + } + } +} \ No newline at end of file