import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
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;
long delta = 0;
long last = 0;
long fps = 0;
boolean up = false;
boolean down = false;
boolean left = false;
boolean right = false;
boolean drop = false;
int speed = 50;
int h = 0;
Sprite player, bomb;
Sprite blocks[];
Vector<Sprite> actors;
BufferedImage[] bombpics;
public GamePanel(int w, int h) {
this.setPreferredSize(new Dimension(w,h));
JFrame frame = new JFrame("BomberMJ");
frame.setLocation(100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(this);
frame.add(this);
frame.pack();
frame.setVisible(true);
doInitializations();
}
private void doInitializations() {
int k = 0;
last = System.nanoTime();
actors = new Vector<Sprite>();
BufferedImage[] mjpics = this.loadPics("pics/MJ.gif", 36);
BufferedImage[] blockpics = this.loadPics("pics/Block.gif", 1);
bombpics = this.loadPics("pics/Bomb.gif", 2);
player = new Player(mjpics, 0, 0, 100, this);
player.setLoop(1,1);
blocks = new Sprite[20];
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]);
System.out.println(j*75 + "," + i*75 + "," + k);
k++;
}
}
}
actors.add(player);
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 dropBomb() {
bomb = new Bomb(bombpics, player.getX() , player.getY() + 25, 100, this);
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.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
if(actors != null) {
for(Drawable draw : actors) {
draw.drawObjects(g);
}
}
}
private void doLogic() {
Vector<Sprite> trash = new Vector<Sprite>();
Sprite check, s1, s2;
for(Movable mov : actors) {
mov.doLogic(delta);
check = (Sprite) mov;
if(check.remove) {
trash.add(check);
}
}
for(int i = 0; i < actors.size(); i++) {
for(int n = i + 1; n < actors.size(); 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(Movable mov : actors) {
mov.move(delta);
}
}
private void checkKeys() {
if(drop) {
dropBomb();
}
if(up) {
player.setVerticalSpeed(-speed);
}
if(down) {
player.setVerticalSpeed(speed);
}
if(right) {
player.setHorizontalSpeed(speed);
}
if(left) {
player.setHorizontalSpeed(-speed);
}
if(!up && !down) {
player.setVerticalSpeed(0);
}
if(!left && !right) {
player.setHorizontalSpeed(0);
}
}
public void run() {
while(game_running) {
computeDelta();
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) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
drop = true;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up = true;
if(h != 1) {
player.setLoop(4, 7);
h = 1;
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down = true;
if(h != 2) {
player.setLoop(0, 3);
h = 2;
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left = true;
if(h != 3) {
player.setLoop(12, 15);
h = 3;
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = true;
if(h != 4) {
player.setLoop(8, 11);
h = 4;
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
drop = false;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up = false;
if(h != 0) {
player.setLoop(1,1);
h = 0;
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down = false;
if(h != 0) {
player.setLoop(1,1);
h = 0;
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left = false;
if(h != 0) {
player.setLoop(1,1);
h = 0;
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = false;
if(h != 0) {
player.setLoop(1,1);
h = 0;
}
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}