Game-3: Threaded version
This commit is contained in:
6
Game-3/.classpath
Normal file
6
Game-3/.classpath
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
17
Game-3/.project
Normal file
17
Game-3/.project
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Game-3</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
BIN
Game-3/bin/resources/missile.png
Normal file
BIN
Game-3/bin/resources/missile.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 269 B |
BIN
Game-3/bin/resources/spaceship.png
Normal file
BIN
Game-3/bin/resources/spaceship.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 738 B |
109
Game-3/src/Game/Board.java
Normal file
109
Game-3/src/Game/Board.java
Normal file
@@ -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<Missile> 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<Missile> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
32
Game-3/src/Game/Missile.java
Normal file
32
Game-3/src/Game/Missile.java
Normal file
@@ -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;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
35
Game-3/src/Game/MissileThread.java
Normal file
35
Game-3/src/Game/MissileThread.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
87
Game-3/src/Game/SpaceShip.java
Normal file
87
Game-3/src/Game/SpaceShip.java
Normal file
@@ -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<Missile> 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<Missile> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
56
Game-3/src/Game/Sprite.java
Normal file
56
Game-3/src/Game/Sprite.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
35
Game-3/src/Game/TheGame.java
Normal file
35
Game-3/src/Game/TheGame.java
Normal file
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
BIN
Game-3/src/resources/missile.png
Normal file
BIN
Game-3/src/resources/missile.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 269 B |
BIN
Game-3/src/resources/spaceship.png
Normal file
BIN
Game-3/src/resources/spaceship.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 738 B |
Reference in New Issue
Block a user