import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Vector;
public class GamePanel extends JPanel implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
boolean game_running = true;
boolean started = true;
boolean gore = true;
long delta = 0;
long last = 0;
long fps = 0;
boolean up1 = false;
boolean down1 = false;
boolean left1 = false;
boolean right1 = false;
boolean drop1 = false;
boolean up2 = false;
boolean down2 = false;
boolean left2 = false;
boolean right2 = false;
boolean drop2 = false;
int h1 = 0;
int h2 = 0;
int[] bombs = new int[2];
Bomb bomb;
Player player1;
Player player2;
Explosion explosion;
Destructble_Block[] desBlocks;
Sprite[] blocks;
Vector<Sprite> actors;
BufferedImage[] bombpics;
BufferedImage[] explopics;
BufferedImage[] destructblepics;
BufferedImage[] colbombpics;
BufferedImage[] peperonipics;
BufferedImage[] jointpics;
BufferedImage[] glassespics;
BufferedImage[] sockpics;
BufferedImage[] oneopics;
BufferedImage background;
JButton button1;
JButton button2;
JFrame frame;
JLayeredPane layeredpane;
public GamePanel(int w, int h) {
this.setPreferredSize(new Dimension(w,h));
frame = new JFrame("BomberMJ");
frame.setLocation(100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.addKeyListener(this);
layeredpane = new JLayeredPane();
frame.add(this);
add(layeredpane);
frame.pack();
frame.setVisible(true);
doInitializations();
}
public boolean isStarted() {
return started;
}
public boolean getGore() {
return gore;
}
public Sprite[] getBlocks() {
return blocks;
}
public Player getPlayer(int i) {
if(i == 1) {
return player1;
}
if(i == 2) {
return player2;
}
return null;
}
public Destructble_Block[] getDesBlocks() {
return desBlocks;
}
public BufferedImage[] getExplopics() {
return explopics;
}
public BufferedImage[] getColbombpics() {
return colbombpics;
}
public BufferedImage[] getPeperonipics() {
return peperonipics;
}
public BufferedImage[] getJointpics() {
return jointpics;
}
public BufferedImage[] getGlassespics() {
return glassespics;
}
public BufferedImage[] getSockpics() {
return sockpics;
}
public BufferedImage[] getOneopics() {
return oneopics;
}
public void setStarted(boolean started) {
this.started = started;
}
public void setBombs(int i) {
bombs[i]--;
}
public void setDesBlocks(Destructble_Block b, int i) {
try {
desBlocks[i] = b;
}
catch(Exception e) {
}
}
private void doInitializations() {
int k = 0;
last = System.nanoTime();
bombs[0] = 0;
bombs[1] = 0;
actors = new Vector<Sprite>();
BufferedImage[] mjpics = this.loadPics("pics/MJ.gif", 36);
BufferedImage[] blockpics = this.loadPics("pics/Block.gif", 1);
explopics = this.loadPics("pics/Explosion.gif", 18);
bombpics = this.loadPics("pics/Bomb.gif", 2);
destructblepics = this.loadPics("pics/destructble_Block.gif", 5);
colbombpics = this.loadPics("pics/Collectable_Bomb.gif", 4);
peperonipics = this.loadPics("pics/Peperoni.gif", 4);
jointpics = this.loadPics("pics/Joint.gif", 4);
glassespics = this.loadPics("pics/Glasses.gif", 4);
sockpics = this.loadPics("pics/Sock.gif", 4);
oneopics = this.loadPics("pics/1,0.gif", 4);
background = this.loadPics("pics/Background.gif", 1)[0];
desBlocks = new Destructble_Block[40];
blocks = new Sprite[20];
setDestructbleBlocks();
for(int i = 1; i < 8; i = i + 2) {
for(int j = 1; j < 10; j = j + 2) {
if(k < blocks.length ) {
blocks[k] = new Block(blockpics, j * 75 , i * 75, 100, this);
actors.add(blocks[k]);
k++;
}
}
}
player1 = new Player(mjpics, 0, 0, 100, this, 1);
player1.setLoop(0,0);
player2 = new Player(mjpics, 750, 575, 100, this, 2);
player2.setLoop(0,0);
actors.add(player1);
actors.add(player2);
button1 = new JButton("retry");
button2 = new JButton("back to main menu");
button1.setLocation(315, 24);
button1.setSize(200, 50);
button2.setLocation(315, 28);
button2.setSize(200, 100);
layeredpane.add(button1);
layeredpane.add(button2);
Thread t = new Thread(this);
t.start();
}
private BufferedImage[] loadPics(String path, int pics) {
BufferedImage[] anim = new BufferedImage[pics];
BufferedImage source = null;
URL pic_url = getClass().getClassLoader().getResource(path);
try {
source = ImageIO.read(pic_url);
}
catch(IOException e) {
}
for(int x = 0; x < pics; x++) {
anim[x] = source.getSubimage(x * source.getWidth() / pics, 0, source.getWidth() / pics, source.getHeight());
}
return anim;
}
private void setDestructbleBlocks() {
int[][] a = new int[2][79];
boolean[] b = new boolean[79];
b[0] = true;
b[1] = true;
b[9] = true;
b[10] = true;
b[11] = true;
b[16] = true;
b[78] = true;
b[77] = true;
b[69] = true;
b[68] = true;
b[67] = true;
b[62] = true;
int k = 0;
int l = 0;
int m = 0;
int n = 0;
for(int i = 0; i <= 600; i = i + 75) {
for(int j = 0; j <= 750; j = j + 75) {
if(((j / 75) % 2 != 0) && ((i / 75) % 2 != 0)) {
continue;
}
a[0][k] = j;
a[1][k] = i;
k++;
}
}
while(l < 40) {
m = (int) (Math.random() * 78);
if(!b[m]) {
desBlocks[l] = new Destructble_Block(destructblepics, a[0][m], a[1][m], 100, this);
desBlocks[l].setLoop(0, 0);
actors.add(desBlocks[l]);
b[m] = true;
l++;
}
}
}
private void dropBomb(Player player) {
if(bombs[player.getPlayernr() -1] < player.getBombs()) {
for(int i = 0; i <= 600; i = i + 75) {
for(int j = 0; j <= 750; j = j + 75) {
if(((j / 75) % 2 != 0) && ((i / 75) % 2 != 0)) {
continue;
}
if((player.getX() + 37 >= j && player.getX() + 37 < j + 75) && (player.getY() + 90 >= i && player.getY() + 90 < i + 75)) {
bomb = new Bomb(bombpics, j , i, 100, this, player.getPlayernr());
bombs[player.getPlayernr() -1]++;
actors.add(bomb);
}
}
}
}
}
private void computeDelta() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9) / delta;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
g.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
if(actors != null) {
for(int i = 0; i < actors.size(); i++) {
actors.get(i).drawObjects(g);
}
}
if(!isStarted()) {
g.setColor(Color.black);
g.fillRect(312, 20, 200, 200);
g.setColor(Color.red);
g.fillRect(314, 22, 196, 196);
}
}
private void doLogic() {
Vector<Sprite> trash = new Vector<Sprite>();
Sprite check, s1, s2;
for(int i = 0; i < actors.size(); i++) {
actors.get(i).doLogic(delta);
check = (Sprite) actors.get(i);
if(check.remove) {
trash.add(check);
}
}
for(int i = 0; i < actors.size(); i++) {
for(int n = 0; n < actors.size(); n++) {
if(i != n) {
s1 = actors.elementAt(i);
s2 = actors.elementAt(n);
s1.collidedWith(s2);
}
}
}
if(trash.size() > 0) {
actors.removeAll(trash);
trash.clear();
}
}
private void moveObjects() {
for(int i = 0; i < actors.size(); i++) {
actors.get(i).move(delta);
}
}
private void checkKeys() {
if(drop1) {
dropBomb(player1);
drop1 = false;
}
if(up1) {
player1.setVerticalSpeed(-player1.getSpeed());
player1.setDirection('d');
}
if(down1) {
player1.setVerticalSpeed(player1.getSpeed());
player1.setDirection('u');
}
if(right1) {
player1.setHorizontalSpeed(player1.getSpeed());
player1.setDirection('l');
}
if(left1) {
player1.setHorizontalSpeed(-player1.getSpeed());
player1.setDirection('r');
}
if(left1 && up1) {
player1.setDirection('a');
}
if(right1 && up1) {
player1.setDirection('b');
}
if(left1 && down1) {
player1.setDirection('c');
}
if(right1 && down1) {
player1.setDirection('e');
}
if(!up1 && !down1) {
player1.setVerticalSpeed(0);
}
if(!left1 && !right1) {
player1.setHorizontalSpeed(0);
}
if(drop2) {
dropBomb(player2);
drop2 = false;
}
if(up2) {
player2.setVerticalSpeed(-player2.getSpeed());
player2.setDirection('d');
}
if(down2) {
player2.setVerticalSpeed(player2.getSpeed());
player2.setDirection('u');
}
if(right2) {
player2.setHorizontalSpeed(player2.getSpeed());
player2.setDirection('l');
}
if(left2) {
player2.setHorizontalSpeed(-player2.getSpeed());
player2.setDirection('r');
}
if(left2 && up2) {
player2.setDirection('a');
}
if(right2 && up2) {
player2.setDirection('b');
}
if(left2 && down2) {
player2.setDirection('c');
}
if(right2 && down2) {
player2.setDirection('e');
}
if(!up2 && !down2) {
player2.setVerticalSpeed(0);
}
if(!left2 && !right2) {
player2.setHorizontalSpeed(0);
}
}
public void run() {
while(game_running) {
computeDelta();
if(isStarted()) {
checkKeys();
doLogic();
moveObjects();
}
repaint();
try {
Thread.sleep(10);
}
catch (InterruptedException e) {}
}
}
public static void main(String[] args) {
new GamePanel(825,675);
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W) {
up1 = true;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 1) {
player1.setLoop(4, 7);
h1 = 1;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_S) {
down1 = true;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 2) {
player1.setLoop(0, 3);
h1 = 2;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_A) {
left1 = true;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 3) {
player1.setLoop(12, 15);
h1 = 3;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_D) {
right1 = true;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 4) {
player1.setLoop(8, 11);
h1 = 4;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up2 = true;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 1) {
player2.setLoop(4, 7);
h2 = 1;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down2 = true;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 2) {
player2.setLoop(0, 3);
h2 = 2;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left2 = true;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 3) {
player2.setLoop(12, 15);
h2 = 3;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right2 = true;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 4) {
player2.setLoop(8, 11);
h2 = 4;
}
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
setStarted(!isStarted());
repaint();
}
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
drop1 = true;
}
if(e.getKeyCode() == KeyEvent.VK_W) {
up1 = false;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 0) {
player1.setLoop(1,1);
h1 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_S) {
down1 = false;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 0) {
player1.setLoop(1,1);
h1 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_A) {
left1 = false;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 0) {
player1.setLoop(1,1);
h1 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_D) {
right1 = false;
if(!player1.getFlying() && !player1.getInvincible() && !player1.getDeath()) {
if(h1 != 0) {
player1.setLoop(1,1);
h1 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
drop2 = true;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up2 = false;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 0) {
player2.setLoop(1,1);
h2 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down2 = false;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 0) {
player2.setLoop(1,1);
h2 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left2 = false;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 0) {
player2.setLoop(1,1);
h2 = 0;
}
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right2 = false;
if(!player2.getFlying() && !player2.getInvincible() && !player2.getDeath()) {
if(h2 != 0) {
player2.setLoop(1,1);
h2 = 0;
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
}