From fe43eb9c3bf75d6b06fd1fc70b6278aa0410f838 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 1 Jun 2022 14:39:57 -0400 Subject: [PATCH] Add sprite spinning, persistent sprite positions, menu --- out/production/final/GameFrame.class | Bin 816 -> 1338 bytes out/production/final/GamePanel.class | Bin 4695 -> 5211 bytes out/production/final/GenericSprite.class | Bin 2252 -> 2250 bytes out/production/final/Player.class | Bin 1610 -> 1846 bytes src/GameFrame.java | 18 +++++++++-- src/GamePanel.java | 25 +++++++++++---- src/GenericSprite.java | 4 +-- src/MenuPanel.java | 39 +++++++++++++++++++++++ src/Player.java | 14 +++++--- 9 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 src/MenuPanel.java diff --git a/out/production/final/GameFrame.class b/out/production/final/GameFrame.class index 324fea9b2d53ea24f6f0c135cae2d230e31dc155..02804570ca2e869a4affcad2e5ec39a060c69894 100644 GIT binary patch literal 1338 zcmZux|8f&m7(JJy-6Xwj)6!4`DWM1^3leQrlp<;Ztt}~F8y2ac-lo@PWwRT1H!Y(+ zi7&w4I(Bhj#s}~n{L|Nu*<97DLt60>f8b-;J*cq)KHciwv?BauOqu0@)=(2Doe#t1vbj0%F6$ z7|pBN@7__q_Hr0S$~aF*Oya0Ox=oY7Nc{k^U@!%VW0)4mw^UT^#&O`+Jh%BsZwVAi z<+`b_;we^F4FXRqpH6S!goTq5Z{n1|#D5S1afnz0nG_V%nj|)4IcgODko^!rKBfuRzOwti!O|iS^cv$4%Xd-N4V`JjxQb5p=v0 zx_-PKtLCFdsG8bPyeRPwE(zo!9XoF1Zh9;#UD`0w-yKLg(5%weY+mAhd_d54Pu!8Z z5xEB;{R}Qke1wllOl`4VyVO@n?Z%Z_(C!4j_Tz*GBI|9dvzplSm zT`#VAL8NbYbg0aE7;%^T*foiDb1dl&1DoA z@W0qkA?(y1Ec-b|??1)(9`g1duztm?%{8B3D#3Bur!ey;icj|ctzSq`db0nIv8EDS zpksxO@9kmEc+4gE@SZ(+CBapj=FjZkQA@CF4<}f)6MSi>6Etj*;O=j%rHl&ZI6WzB zuo?#iKF5*f%w&X7Mx5;%i1dM!xfm`~VM`m(1}EzUBHI?+K*#nL=1p5f3e#w+K-*9Kq&G3;!(w delta 482 zcmX|-%TC)+5Qe{FhnU!hYe=}$qyz{D8p53tU)kScZCZC`~oVjS8o&YZdY^Zzq*=YC1MzaQ^@0$Xf;a_8#~?TXBff7aOZ&l^n_ z2Rnm@cIeP_()G8xeI*b@+hu}Mc)R~wYOcV0G`(aMwtsxAFj3XcM-M7LlvC)PgExgB zEF4{2G>ZwgUo*g9RI(;!JcczRj0!4jT<p>U@agtutEU_Hr?89v8 z`XmVdEz{bt7X7k|A3Q9%kdh|{XnC?ZY00ce^bxyN+cLK(bC2`xmdp=aW4`0YbiXyd zeKC1s#|)WojK!2pI;L!5W=$$)&ZwA$ufk-pDz+j+K?kXpS{DQBbTdW|<8o6&mO1)Z YB*z+gHtCli^z#V3W?dphO{~Sn6S6c;&j0`b diff --git a/out/production/final/GamePanel.class b/out/production/final/GamePanel.class index 5a72dbcc3e97ea5a5c739ea2949ab87c98f5fd4b..0cd9913f3985c7b15b163baa893b1b2354ffc5db 100644 GIT binary patch literal 5211 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 G{QV!*(I-d% diff --git a/out/production/final/GenericSprite.class b/out/production/final/GenericSprite.class index 87a5e2dbc21f306bc7a33f74a3e794fd38328bf6..499fc0c6e8af6aadb6fda4f50ecf10f04a4b7ecf 100644 GIT binary patch delta 112 zcmX>jcuH`C2s`I_237_}1_p+_$+GMULNgh7wIa7LSnwxrWw6lN!XPnoav*!Cy)r{E zgDyiTg9$?zgB?QzgBL?2Lm)#mLo7oKLne^SWrzdv7#MgUMgc`*fxHwTW@TX36`1^# G{W$lct&u82s`IR237_}1_p+L$+GMUA}k9Sc(o$8Fj(*>Z)LF1+QJ~gvS6}5d#Jq% zLokCLLnwn8Ll}btLj;2lLnKfnnjxMch9R3FmLZ=Z4#;C*;DHzh6paP)Qh=D1fmu&* I@?-Yr07$_Vwg3PC diff --git a/out/production/final/Player.class b/out/production/final/Player.class index aa4c79d955002fcf70da7baa406b2dc1c8703fe4..5909082895a0a846879e4e15be5eaf4a51b4648b 100644 GIT binary patch delta 931 zcmah{O-~b16g@N3QklNcn3y73V^LCSp(3<}0!mR3t)e0-pMFr=0jmAbwnn-lF|18+ zc3m2mY)GUMOA6QDFw;dGsbeM0S^g;B`yl-mDR>T zzrX;5f|g98SehG87mQ>nozF?FL4l!KXp*t{zhV~!F3DK4Oq(bqvWCov35-fqS(Dxs zficS~>$r*u2d)WRN8J3N%yi25O@T?=qQ=^ck;y01r7|i4)4N8yBE#w=&3Vh(MXZ}1oBFE;oO$z=cJDzaJ2 zvN6D{YCZNxL?4?!wUPJ}M$X^}S2uK4aN#(PQR@U>FHXV-54v#*OJq!2ydV;IN)HIi zp-@Tg#>|(tURRQA2a(gvl@+#atr1y4=ZS%{u%p9La$A1Wfl?DvFqol`Q_K8iYh6Fg z^fU9^e=>dOlr>o=WGMmmz$bKU6Hsv|6@-m9Y>8;?==S;{6f9$rYHhz&lE>XD*%VmV$Wu=PoS#2x8{f%ARb|v51GdqY#|NfyL z4S04i{Ev=jUnE;ov2F3Jn$YA>Pt3V(90k8elBS0S@8~f3@t)OFj>OFy0NU XBF)|;_Kbb2c+R~BB}OpAt%~d)n^2c% delta 714 zcmaiy%T5z<7{z~cZ5c<5q*f7(EfN@e5j%i)YmIoR;$4eccZ~~UjfrtVSG<7<&cehU zdp2HzMiU=^C-4n?3*-4u5z&}9$;@~8pYMF<{4;BV>tV3|_2uNLJLO#wem+@o>&>g08pH7KA`sIKc9UZddo@?kcY+ZrjB-tgTPd!}b#ADF zs_`Z!lg%WNS6jL%WJaC+n$-rK)TPN*^h@QB?0c)s#_SBz?id~iQto^owaM*k+ih`J zI{znE@o%n4yol&OWD`spVXyrB(r*MHaZ;h8kmKx=PL6Y(mtMCUkN!E~u8QADZzr#N sLAN_ZEKAdrnB~5H8Kbe#*Rgq1ZCWfyrL=KR4s0O}k5y9hfl{0HPeP(u5C8xG diff --git a/src/GameFrame.java b/src/GameFrame.java index ad7e7ad..c2c9559 100644 --- a/src/GameFrame.java +++ b/src/GameFrame.java @@ -8,11 +8,23 @@ import javax.swing.*; public class GameFrame extends JFrame{ - GamePanel panel; + MenuPanel menu; + GamePanel game; + boolean startGame = false; public GameFrame(){ - panel = new GamePanel(); //run GamePanel constructor - this.add(panel); + menu = new MenuPanel(); + while (!startGame) { + startGame = menu.hasButtonClicked(); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + menu.setVisible(false); // hide menu when game has launched + game = new GamePanel(); //run GamePanel constructor + this.add(game); this.setTitle("GUI is cool!"); //set title for frame this.setResizable(false); //frame can't change size this.setBackground(Color.white); diff --git a/src/GamePanel.java b/src/GamePanel.java index 3b6c3c7..a089809 100644 --- a/src/GamePanel.java +++ b/src/GamePanel.java @@ -19,8 +19,8 @@ import javax.swing.*; public class GamePanel extends JPanel implements Runnable, KeyListener{ //dimensions of window - public static final int GAME_WIDTH = 1536; - public static final int GAME_HEIGHT = 768; + public static final int GAME_WIDTH = 1200; + public static final int GAME_HEIGHT = 600; public Thread gameThread; public Image image; @@ -30,7 +30,7 @@ public class GamePanel extends JPanel implements Runnable, KeyListener{ // keeps track of how many ticks has elapsed since last frame change public int frameCounter = 0; - public BufferedImage[][] spriteArray = new BufferedImage[4][11]; + public BufferedImage[][][] spriteArray = new BufferedImage[2][2][11]; public static ArrayListmap = new ArrayList(); @@ -39,10 +39,10 @@ public class GamePanel extends JPanel implements Runnable, KeyListener{ try { BufferedImage sprite = getImage(String.format("img/walk/p1_walk%s.png", String.format("%1$2s", i+1).replace(' ', '0'))); - spriteArray[1][i] = sprite; - spriteArray[3][i] = sprite; - spriteArray[0][i] = sprite; - spriteArray[2][i] = sprite; + spriteArray[1][0][i] = sprite; + spriteArray[1][1][i] = sprite; + spriteArray[0][0][i] = flipImageHorizontally(sprite); + spriteArray[0][1][i] = flipImageHorizontally(sprite); } catch (IOException e) { e.printStackTrace(); @@ -170,4 +170,15 @@ public class GamePanel extends JPanel implements Runnable, KeyListener{ return ImageIO.read(new File(imageLocation)); } + public BufferedImage flipImageHorizontally(BufferedImage originalImage) { + BufferedImage flippedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < originalImage.getWidth(); x++) { + for (int y = 0; y < originalImage.getHeight(); y++) { + // -1 is added to prevent off-by-one errors + flippedImage.setRGB(x, y, originalImage.getRGB(originalImage.getWidth()-x-1, y)); + } + } + return flippedImage; + } + } \ No newline at end of file diff --git a/src/GenericSprite.java b/src/GenericSprite.java index e508a8b..6a7cbae 100644 --- a/src/GenericSprite.java +++ b/src/GenericSprite.java @@ -79,10 +79,10 @@ public class GenericSprite extends Rectangle{ public void move(){ y = y + (int)yVelocity; x = x + (int)xVelocity; - if(rightPressed==true){ + if(rightPressed){ xVelocity+=1; } - if(leftPressed==true) { + if(leftPressed) { xVelocity -= 1; } if(upPressed&isGrounded){ diff --git a/src/MenuPanel.java b/src/MenuPanel.java new file mode 100644 index 0000000..72b0a64 --- /dev/null +++ b/src/MenuPanel.java @@ -0,0 +1,39 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +public class MenuPanel extends JFrame implements ActionListener { + + private Boolean buttonClicked = false; + JButton launchGame; + Container menuContainer; + + public MenuPanel() { + this.setTitle("First"); + this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + this.setSize(280, 200); + this.setVisible(true); + + launchGame = new JButton("Click"); + launchGame.addActionListener(this); + + menuContainer = getContentPane(); + menuContainer.setLayout(new FlowLayout()); + menuContainer.add(launchGame); + } + + public void paint(Graphics g) { + super.paint(g); + g.drawString("potato", 50, 50); + } + + public void actionPerformed(ActionEvent evt) { + buttonClicked = true; + } + + public Boolean hasButtonClicked() { + return buttonClicked; + } +} \ No newline at end of file diff --git a/src/Player.java b/src/Player.java index 96e42dd..cc7565c 100644 --- a/src/Player.java +++ b/src/Player.java @@ -11,13 +11,14 @@ public class Player extends GenericSprite { public final int SPEED = 5; public static final int PLAYER_WIDTH = 72; public static final int PLAYER_HEIGHT = 97; + public int lastXDirection, lastYDirection, lastFrame; public int upKey, downKey, rightKey, leftKey; // sA[0] is -x, -y // sA[1] is x, -y // sA[2] is -x, y // sA[3] is x, y - public BufferedImage[][] spriteArray; - public Player(int x, int y, int upKey, int downKey, int leftKey, int rightKey, BufferedImage[][] sprites) { + public BufferedImage[][][] spriteArray; + public Player(int x, int y, int upKey, int downKey, int leftKey, int rightKey, BufferedImage[][][] sprites) { super(x, y, PLAYER_HEIGHT, PLAYER_WIDTH); this.upKey = upKey; @@ -46,11 +47,14 @@ public class Player extends GenericSprite { public int draw(Graphics g, int frame) { // g.setColor(Color.WHITE); - if (xVelocity == 0 && yVelocity == 0) { - g.drawImage(spriteArray[1][0], x, y, null); + if (!upPressed && !downPressed && !leftPressed && !rightPressed) { + g.drawImage(spriteArray[lastXDirection][lastYDirection][lastFrame], x, y, null); return 0; } else { - g.drawImage(spriteArray[(int)(Math.signum(xVelocity)+Math.signum(yVelocity)*2+3)/2][frame], x, y, null); + lastXDirection = (int)(Math.signum(xVelocity) + 1) / 2; + lastYDirection = (int)(Math.signum(yVelocity) + 1) / 2; + lastFrame = frame; + g.drawImage(spriteArray[lastXDirection][lastYDirection][frame], x, y, null); return 1; } }