From db5e684b2850c8673e6bc3f81ebffcbe4a93fdc4 Mon Sep 17 00:00:00 2001 From: Aaron Johnon Date: Tue, 27 Aug 2024 03:28:50 -0500 Subject: [PATCH] Restructure --- player.java => src/entities/Player.java | 71 +++++++++++++++++++++--- src/entities/PlayerBullet.java | 35 ++++++++++++ main.java => src/main/Main.java | 8 ++- src/sound/shoot1.wav | Bin 0 -> 17892 bytes src/spr/bullet.png | Bin 0 -> 616 bytes {spr => src/spr}/tank1.png | Bin 6 files changed, 103 insertions(+), 11 deletions(-) rename player.java => src/entities/Player.java (55%) create mode 100644 src/entities/PlayerBullet.java rename main.java => src/main/Main.java (86%) create mode 100644 src/sound/shoot1.wav create mode 100644 src/spr/bullet.png rename {spr => src/spr}/tank1.png (100%) diff --git a/player.java b/src/entities/Player.java similarity index 55% rename from player.java rename to src/entities/Player.java index 08f6516..7780eed 100644 --- a/player.java +++ b/src/entities/Player.java @@ -1,44 +1,97 @@ +package entities; + import javax.swing.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import entities.PlayerBullet; -public class player extends JPanel implements KeyListener, ActionListener { + +public class Player extends JPanel implements KeyListener, ActionListener { private Image sprite; private int x = 400; private int y = 512; private int spd = 1; + private int fdelay = 850; //Time in ms between shots //Movement bools private boolean leftPressed = false; private boolean rightPressed = false; private boolean upPressed = false; private boolean downPressed = false; - private boolean shootPressed = false; - //Game loop timer - private Timer timer; + //Cannon bools + private boolean shootPressed = false; + private boolean canShoot = true; + private List bullets = new ArrayList<>(); + + private Timer gameTimer; //Game loop timer + private Timer shotTimer; //Player shot timer - public player() { + public Player() { ImageIcon icon = new ImageIcon("spr/tank1.png"); sprite = icon.getImage(); setFocusable(true); addKeyListener(this); setPreferredSize(new Dimension(800, 600)); //Timer to set target framerate to 60 (~16ms/frame) - timer = new Timer(1000 / 60, this); - timer.start(); + gameTimer = new Timer(1000 / 60, this); + gameTimer.start(); + + shotTimer = new Timer(fdelay, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + canShoot = true; // Allow shooting again after fdelay milliseconds + shotTimer.stop(); // Stop the timer until the next shot + } + }); } - private void updatePlayerPos() { + private void updatePosition() { if (leftPressed) x -= spd; if (rightPressed) x += spd; if (upPressed) y -= spd; if (downPressed) y += spd; + + //Update bullet positions + for (int i = 0; i < bullets.size(); i++) { + PlayerBullet bullet = bullets.get(i); + bullet.update(); + if (bullet.getY() < -32) { + bullets.remove(i); + i--; + } + } } + private void playSound(String soundFile) { + try { + Clip clip = AudioSystem.getClip(); + clip.open(AudioSystem.getAudioInputStream(new File(soundFile))); + clip.start(); + } catch (Exception e) { + System.out.println("Error playing sound: " + e.getMessage()); + } + } + + private void playerShoot() { + if (canShoot) { + PlayerBullet newBullet = new PlayerBullet(x + sprite.getWidth(null) / 2, y); + bullets.add(newBullet); //Add to bullets list + playSound("sound/shoot1.wav"); + canShoot = false; + shotTimer.start(); + } + } + + @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -102,7 +155,7 @@ public class player extends JPanel implements KeyListener, ActionListener { } public void actionPerformed(ActionEvent e) { - updatePlayerPos(); + updatePosition(); repaint(); } } diff --git a/src/entities/PlayerBullet.java b/src/entities/PlayerBullet.java new file mode 100644 index 0000000..f89bcb3 --- /dev/null +++ b/src/entities/PlayerBullet.java @@ -0,0 +1,35 @@ +package entities; + +import javax.swing.*; +import java.awt.*; + +public class PlayerBullet { + private int x, y; + private int spd = 5; + private Image sprite; + + //Constructor + public PlayerBullet(int startX, int startY) { + this.x = startX; + this.y = startY; + ImageIcon icon = new ImageIcon("spr/bullet.png"); + sprite = icon.getImage(); + } + + public void update() { + y -= spd; + } + + public void draw(Graphics g) { + g.drawImage(sprite, x, y, null); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } +} + diff --git a/main.java b/src/main/Main.java similarity index 86% rename from main.java rename to src/main/Main.java index d8ba178..d19d281 100644 --- a/main.java +++ b/src/main/Main.java @@ -1,10 +1,14 @@ +package main; + +import entities.Player; + import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -public class main { +public class Main { public static void main(String[] args) { System.out.println("I like birds."); JFrame mainframe = new JFrame(); @@ -17,7 +21,7 @@ public class main { //JLabel label = new JLabel("Label test!", JLabel.CENTER); //mainframe.add(label); - player playerPanel = new player(); + Player playerPanel = new Player(); mainframe.add(playerPanel); playerPanel.requestFocusInWindow(); diff --git a/src/sound/shoot1.wav b/src/sound/shoot1.wav new file mode 100644 index 0000000000000000000000000000000000000000..2dbd562c45847b9c1667eaec2b1c8d1b4e01b45a GIT binary patch literal 17892 zcmche3shEB7JzZBnwm9})-*NC%Eqh+Mps5TPCAxaJgqEWAcCNSf{~;siugnj8xj?g zcL+X09$`pAprEOUl9uU=r5RyPt!OQ?NynKrGqq;AuXFA>=bq=i|LSY?pMCbZ7ytV> zd+)RN`6ow&hW3Q``9+P73`tB$8+@yupI<-izu*Qx3-V9dvP2`AZPafZzTHzfU5dnz7@I`x0g{Lp)- z1Jdr61E+dE_rgVsFTVQb3Y%}_dB1qpSV_hS2+-$`ub2@1_Gya`z4K|`6^R$%f6`p5 ztepLXfG5>R$jE5+Ib}sf={_eSBH|u8BeSwL^@;dOijUjdTQ>WO-EFPMnX?W|De3ln zS65eay${)|S(EPfeadFd7!Uu2kNBmp%4;T-2tO?cIo%ZAzq{zKCflDCUy#(wZ`~`64>^Vhi{~xsxA5;&n9@JunFOx_`PKsXZFC= zQiL^+Q5m7c40P?(jDJD5y-s^hR8_4IECi*8C#RxR?C=?lM^P@)J&vpvPa^fy>q})o z-V32Bh!=0kn^0iBbaXuup|VJScUOs*yV+dd(z{U<-&FMQVdUMGsdh1a-@i{1 z94+xiQwzaK5c;}p&s`ws`I~1>6_La$M@N(sA_)_+eS3>hI&9r)(eSCohp@P)DAa5r zS#8x`)thuQqA=uY;Gx{Kjdm1lN%^8mICp&6LI)lb+evw^lhl9g0b{}4y$mmfYrQxy zVf%St;6n~ZKkJ3(0F$OTh{S^h54|kXY?hbrFek9)halZ9c&A}zRU@aB+ zGbcl7cB~d8rnv0~2AybZ4dhZRQWSMUkt!TqN!@;<3b#<#Bx_z#A{SYg+Tt4^P~^9E z6uFIb8Ad;w3?zhokVyymU9(+4dtgo-W+c~E)97SY?co3=QGCXH?8N8c{jTVudV>o{ zrVEJIWa!&P`WvIaFqle+1S0|iK^7lv`)g=5bywVu7sP`sMoE?Nm0AbqY|E(A(fh21wqPFV>RpGU$JK zl?}e(`@W4#P;JzsDq1RDGOW~)f6JHg>*OB zK@5~=fq<#2vu1PFA}0JRCa!m^kV&AOb70@ z9SxF8)HWLb@d%}tK)M!df0fyUI8tFwMG)5+jH0DX2wez2?X^&5Z+!}06(V~hIKd_y z^7kL2?_?f)9}6_R;K>X4MI0=zMt0!d2~9ZK$YmQp>_tb5S;3yEZ&Wc&N8Y7z5YVBt zg{iHR&wGdimHCCrVWKuib}M0GOj0P_#%DV}8)S^yDIrtJ7rfDP%_Nq%WR4y2GV)m$K8iM?qEN*t>bPFN^M zcR0&L06pP0hdaY0LbE}cY>GL@RnsU=fwYW{{!~sx5EV6DW7cd}EE2r+>FFEX#xVu; zZ;3cbSPyPSn;1OKj;+B+ss39D9;w3Bc?><9glfYP@B9pv=b7P=J+Kt@40O59bUgf< zO3!j&T2aQ|94~j4mPpN!vuCAhqXqQzC#s!3Mv@m;sVhWZTqfa1ig+(ZVKvvun}f%Z z+KwiYzawaUQ%qqVpS9?+kReYO?zIV?DrSaVa7#%+fBB5atemB$hlved%nruVghod@ zU^zctvqsaC8H$_v$58x=Hj{O-lg>=Okxp1+Y(k*T~Exs1&I;0A3`;?+{`{0(> zq*!T8Vdt)GRFi7|Mt~=+nmvbxk+-ogvY3OFOgbfbSk6yUs%ov$HzO%<+vtO zl0qa1fLTve*vQTD*n=yCQDWjE^zZWI{p>v_+HdPkjv~3`Lx(IIbMQdN{(Wulv^4K+ v+S9nZ;m!Kmnq51#RaI_%y}Ycnq_}X)YX$k6H|A}4HTTc!bJk^Nt9w literal 0 HcmV?d00001 diff --git a/src/spr/bullet.png b/src/spr/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..678afb9db54510df9f5a87caf413ba923ef5e45d GIT binary patch literal 616 zcmV-u0+;=XP)EX>4Tx04R}tkv&MmKpe$iQ;S6^4t5ZA$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2zhIPS;0dyl(!fY7Wm&FV=2nr@q! zR8q|4SH<2}gfW5;;t0yjGUg;H4d3x~j{slq;yla$+@GUgEm#Z)h{OqIm^SeS@yw=e zaNZ}5va+lapA%1*bV1@rt}7nDaW1(m@XV;0&CC-=iN#VED_zXWrbawX98)!&@`aqo zD(5ZETD8vF_v9~(6!ev4uG1Vv3X52R1Q81AsGtg)`l>)D#X^SmlRo}o*DsMvAy);A z91EyHgY5dj|KNAGR&i?5ONu0c(2L`Ii~+s7K&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wt0S*p< z@e*aP`@B2c-P^xs+Wq|idGm6q9#e9~00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=m;AK1s{LM02lxO02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{002NqL_t&-(_>&j0xfkh|6A%}{v(SqB1_6iLb#8f|7WOa zTEfV{z`(%7Kmbs#fCZWJ==p#ACdf%LGQb>4Gyni+`wsxWFk?Lc0000