From b9423c14537a051f0bf4d0d94cd85379436aa03e Mon Sep 17 00:00:00 2001 From: Karsten Jeppesen Date: Thu, 22 Apr 2021 13:04:04 +0200 Subject: [PATCH] Game-3: Threaded version --- Game-3/.classpath | 6 ++ Game-3/.project | 17 +++++ Game-3/bin/resources/missile.png | Bin 0 -> 269 bytes Game-3/bin/resources/spaceship.png | Bin 0 -> 738 bytes Game-3/src/Game/Board.java | 109 +++++++++++++++++++++++++++++ Game-3/src/Game/Missile.java | 32 +++++++++ Game-3/src/Game/MissileThread.java | 35 +++++++++ Game-3/src/Game/SpaceShip.java | 87 +++++++++++++++++++++++ Game-3/src/Game/Sprite.java | 56 +++++++++++++++ Game-3/src/Game/TheGame.java | 35 +++++++++ Game-3/src/resources/missile.png | Bin 0 -> 269 bytes Game-3/src/resources/spaceship.png | Bin 0 -> 738 bytes 12 files changed, 377 insertions(+) create mode 100644 Game-3/.classpath create mode 100644 Game-3/.project create mode 100644 Game-3/bin/resources/missile.png create mode 100644 Game-3/bin/resources/spaceship.png create mode 100644 Game-3/src/Game/Board.java create mode 100644 Game-3/src/Game/Missile.java create mode 100644 Game-3/src/Game/MissileThread.java create mode 100644 Game-3/src/Game/SpaceShip.java create mode 100644 Game-3/src/Game/Sprite.java create mode 100644 Game-3/src/Game/TheGame.java create mode 100644 Game-3/src/resources/missile.png create mode 100644 Game-3/src/resources/spaceship.png diff --git a/Game-3/.classpath b/Game-3/.classpath new file mode 100644 index 0000000..fb50116 --- /dev/null +++ b/Game-3/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/Game-3/.project b/Game-3/.project new file mode 100644 index 0000000..9ad1bcc --- /dev/null +++ b/Game-3/.project @@ -0,0 +1,17 @@ + + + Game-3 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/Game-3/bin/resources/missile.png b/Game-3/bin/resources/missile.png new file mode 100644 index 0000000000000000000000000000000000000000..ab620f832dfd7413a9b76f42cd4f23e275c68d97 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^96-#TT$X?><>&pI=MO4^SSmEpby+9$!64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aiF47PZ!4!j_bMScJm%G5NW&k-by@JK+ZHkCCK57<3T17pB@)( z?+Z&jMRjuO#7@k7AfeFkZbMR6e7@}Q%TmV5#~N6KLPVE*IedP)?ayeB`97EPR=k#6 z+EI9B&pg|IJNDmvC#E3LHqU~8hqO>jf`mf(;>_uj+wE=Im0oc@d$$tk00vK2KbLh* G2~7a+@mJRX literal 0 HcmV?d00001 diff --git a/Game-3/bin/resources/spaceship.png b/Game-3/bin/resources/spaceship.png new file mode 100644 index 0000000000000000000000000000000000000000..b412667db1bb0727c968a5d1ba046222316613d9 GIT binary patch literal 738 zcmV<80v-K{P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K%$L_t(2&!v-1NRt5^#((d- z?cH=!GrzFS(sYXU1*w#hl9YjTD7+*F+6OAyp-V)qL!Porh9?hwp>_$vh>AMcArI=M z50%hFvX+{gb8b^-wvT^@LWl^V9(Z_ezr(}xkh42ODr-taQ4sidE2kXCr0CF2RsyRm z%=vIlFW`21S@H+*%y^j`aS{$i*hqRsRroYMOF>!*O8jmWI`)(C=$oyU=DYi%JGji({$+u)y`UO;iVAT zD<7p5COUd95K$LUs_M$bmYs%u&o<2QF@(N{5fN5b)9q{U*wG>M+l9~b zAL#A7M_c19l-8aW@h>bh_Iiq;=kG{L-$YAW4SG$FW;7robUGd|Ixw+btT9$2#%w}W z6-0zZcK}-NpOb^t#p?@Ib&4b;nI$pBB9;V`B&NoTs#7*zcV@m-;x}9V>mGpo0HS#l UH?@I*NdN!<07*qoM6N<$f_E-Eng9R* literal 0 HcmV?d00001 diff --git a/Game-3/src/Game/Board.java b/Game-3/src/Game/Board.java new file mode 100644 index 0000000..4a1d88b --- /dev/null +++ b/Game-3/src/Game/Board.java @@ -0,0 +1,109 @@ +package Game; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.List; + +import javax.swing.Timer; +import javax.swing.JPanel; + + +public class Board extends JPanel implements ActionListener { + + private final int ICRAFT_X = 40; + private final int ICRAFT_Y = 60; + private final int DELAY = 10; + private Timer timer; + private SpaceShip spaceShip; + + public Board() { + + initBoard(); + } + + private void initBoard() { + + addKeyListener(new TAdapter()); + setBackground(Color.BLACK); + setFocusable(true); + + spaceShip = new SpaceShip(ICRAFT_X, ICRAFT_Y); + + timer = new Timer(DELAY, this); + timer.start(); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + doDrawing(g); + + Toolkit.getDefaultToolkit().sync(); + } + + private void doDrawing(Graphics g) { + + Graphics2D g2d = (Graphics2D) g; + + g2d.drawImage(spaceShip.getImage(), spaceShip.getX(), + spaceShip.getY(), this); + + List missiles = spaceShip.getMissiles(); + + for (Missile missile : missiles) { + + g2d.drawImage(missile.getImage(), missile.getX(), + missile.getY(), this); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + + updateMissiles(); + updateSpaceShip(); + + repaint(); + } + + private void updateMissiles() { + + List missiles = spaceShip.getMissiles(); + + for (int i = 0; i < missiles.size(); i++) { + + Missile missile = missiles.get(i); + + if (!missile.active) { + + missiles.remove(i); + } + } + } + + private void updateSpaceShip() { + + spaceShip.move(); + } + + private class TAdapter extends KeyAdapter { + + @Override + public void keyReleased(KeyEvent e) { + spaceShip.keyReleased(e); + } + + @Override + public void keyPressed(KeyEvent e) { + spaceShip.keyPressed(e); + } + } +} + diff --git a/Game-3/src/Game/Missile.java b/Game-3/src/Game/Missile.java new file mode 100644 index 0000000..2ac79a0 --- /dev/null +++ b/Game-3/src/Game/Missile.java @@ -0,0 +1,32 @@ +// Origin: https://zetcode.com/javagames/movingsprites/ + +package Game; + +public class Missile extends Sprite { + + private final int BOARD_WIDTH = 800; + private final int MISSILE_SPEED = 2; + + public Missile(int x, int y) { + super(x, y); + + initMissile(); + MissileThread myMissile = new MissileThread( this, 1, 0, 800, 800 ); + myMissile.start(); + } + + private void initMissile() { + + loadImage("src/resources/missile.png"); + getImageDimensions(); + } + +// public void move() { +// +// x += MISSILE_SPEED; +// +// if (x > BOARD_WIDTH) { +// visible = false; +// } +// } +} \ No newline at end of file diff --git a/Game-3/src/Game/MissileThread.java b/Game-3/src/Game/MissileThread.java new file mode 100644 index 0000000..ce3a168 --- /dev/null +++ b/Game-3/src/Game/MissileThread.java @@ -0,0 +1,35 @@ +package Game; + +public class MissileThread extends Thread { + + private Missile myMissile; + private int Xspeed, Yspeed, MaxX, MaxY; + + public MissileThread(Missile theMissile, int theXspeed, int theYspeed, int maxX, int maxY) { + myMissile = theMissile; + Xspeed = theXspeed; + Yspeed = theYspeed; + MaxX = maxX; + MaxY = maxY; + } + + public void run() { + System.out.println("Missile started"); + try { + while (true) { + Thread.sleep(10); + myMissile.x += Xspeed; + myMissile.y += Yspeed; + if ((myMissile.x > MaxX) || (myMissile.y > MaxY)) { + myMissile.active = false; + // Die die die + System.out.println("Missile died"); + break; + } + } + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/Game-3/src/Game/SpaceShip.java b/Game-3/src/Game/SpaceShip.java new file mode 100644 index 0000000..dbf7e6d --- /dev/null +++ b/Game-3/src/Game/SpaceShip.java @@ -0,0 +1,87 @@ +// Origin: https://zetcode.com/javagames/movingsprites/ + +package Game; + +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; + +public class SpaceShip extends Sprite { + + private int dx; + private int dy; + private List missiles; + + public SpaceShip(int x, int y) { + super(x, y); + + initSpaceShip(); + } + + private void initSpaceShip() { + + missiles = new ArrayList<>(); + + loadImage("src/resources/spaceship.png"); + getImageDimensions(); + } + + public void move() { + x += dx; + y += dy; + } + + public List getMissiles() { + return missiles; + } + + public void keyPressed(KeyEvent e) { + + int key = e.getKeyCode(); + + if (key == KeyEvent.VK_SPACE) { + fire(); + } + + if (key == KeyEvent.VK_LEFT) { + dx = -1; + } + + if (key == KeyEvent.VK_RIGHT) { + dx = 1; + } + + if (key == KeyEvent.VK_UP) { + dy = -1; + } + + if (key == KeyEvent.VK_DOWN) { + dy = 1; + } + } + + public void fire() { + missiles.add(new Missile(x + width, y + height / 2)); + } + + public void keyReleased(KeyEvent e) { + + int key = e.getKeyCode(); + + if (key == KeyEvent.VK_LEFT) { + dx = 0; + } + + if (key == KeyEvent.VK_RIGHT) { + dx = 0; + } + + if (key == KeyEvent.VK_UP) { + dy = 0; + } + + if (key == KeyEvent.VK_DOWN) { + dy = 0; + } + } +} \ No newline at end of file diff --git a/Game-3/src/Game/Sprite.java b/Game-3/src/Game/Sprite.java new file mode 100644 index 0000000..b266a5c --- /dev/null +++ b/Game-3/src/Game/Sprite.java @@ -0,0 +1,56 @@ +// Origin: https://zetcode.com/javagames/movingsprites/ + +package Game; + +import java.awt.Image; +import javax.swing.ImageIcon; + +public class Sprite { + + protected int x; + protected int y; + protected int width; + protected int height; + protected boolean active; + protected Image image; + + public Sprite(int x, int y) { + + this.x = x; + this.y = y; + active = true; + } + + protected void loadImage(String imageName) { + + ImageIcon ii = new ImageIcon(imageName); + image = ii.getImage(); + } + + protected void getImageDimensions() { + + width = image.getWidth(null); + height = image.getHeight(null); + } + + public Image getImage() { + return image; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public boolean isActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } +} + diff --git a/Game-3/src/Game/TheGame.java b/Game-3/src/Game/TheGame.java new file mode 100644 index 0000000..58b7474 --- /dev/null +++ b/Game-3/src/Game/TheGame.java @@ -0,0 +1,35 @@ +// Origin: https://zetcode.com/javagames/movingsprites/ + +package Game; + +import java.awt.EventQueue; +import javax.swing.JFrame; + +public class TheGame extends JFrame { + + public TheGame() { + + initUI(); + } + + private void initUI() { + + add(new Board()); + + setTitle("Moving sprite"); + setSize(800, 800); + + setLocationRelativeTo(null); + setResizable(false); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + public static void main(String[] args) { + + EventQueue.invokeLater(() -> { + TheGame ex = new TheGame(); + ex.setVisible(true); + }); + } + +} diff --git a/Game-3/src/resources/missile.png b/Game-3/src/resources/missile.png new file mode 100644 index 0000000000000000000000000000000000000000..ab620f832dfd7413a9b76f42cd4f23e275c68d97 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^96-#TT$X?><>&pI=MO4^SSmEpby+9$!64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aiF47PZ!4!j_bMScJm%G5NW&k-by@JK+ZHkCCK57<3T17pB@)( z?+Z&jMRjuO#7@k7AfeFkZbMR6e7@}Q%TmV5#~N6KLPVE*IedP)?ayeB`97EPR=k#6 z+EI9B&pg|IJNDmvC#E3LHqU~8hqO>jf`mf(;>_uj+wE=Im0oc@d$$tk00vK2KbLh* G2~7a+@mJRX literal 0 HcmV?d00001 diff --git a/Game-3/src/resources/spaceship.png b/Game-3/src/resources/spaceship.png new file mode 100644 index 0000000000000000000000000000000000000000..b412667db1bb0727c968a5d1ba046222316613d9 GIT binary patch literal 738 zcmV<80v-K{P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K%$L_t(2&!v-1NRt5^#((d- z?cH=!GrzFS(sYXU1*w#hl9YjTD7+*F+6OAyp-V)qL!Porh9?hwp>_$vh>AMcArI=M z50%hFvX+{gb8b^-wvT^@LWl^V9(Z_ezr(}xkh42ODr-taQ4sidE2kXCr0CF2RsyRm z%=vIlFW`21S@H+*%y^j`aS{$i*hqRsRroYMOF>!*O8jmWI`)(C=$oyU=DYi%JGji({$+u)y`UO;iVAT zD<7p5COUd95K$LUs_M$bmYs%u&o<2QF@(N{5fN5b)9q{U*wG>M+l9~b zAL#A7M_c19l-8aW@h>bh_Iiq;=kG{L-$YAW4SG$FW;7robUGd|Ixw+btT9$2#%w}W z6-0zZcK}-NpOb^t#p?@Ib&4b;nI$pBB9;V`B&NoTs#7*zcV@m-;x}9V>mGpo0HS#l UH?@I*NdN!<07*qoM6N<$f_E-Eng9R* literal 0 HcmV?d00001