import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;
public class GamePanel extends JPanel implements Runnable, KeyListener, ActionListener{
private static final long serialVersionUID = 1L;
boolean game_running = true;
boolean started = false;
boolean once = false;
long delta = 0;
long last = 0;
long fps = 0;
long gameover = 0;
long timepass;
int level = 1;
int rdel = 1500;
int x = 1;
Heli copter;
Vector<Sprite> actors;
boolean up = false;
boolean down = false;
boolean left = false;
boolean right = false;
int speed = 400;
Timer timer;
Timer rtime;
BufferedImage[] rocket;
BufferedImage background;
BufferedImage[] explosion;
SoundLib slib;
public static void main(String[] args){
new GamePanel(1000,600);
}
public GamePanel(int w, int h)
{
this.setPreferredSize(new Dimension(970, 570));
this.setBackground(Color.DARK_GRAY);
JFrame frame = new JFrame("GameDemo");
frame.setLocation(100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(this);
frame.add(this);
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
doInitializations();
}
private void doInitializations(){
BufferedImage[] heli = this.loadPics("pics/jet.png", 4);
rocket = loadPics("pics/rocket2.png",8);
background = loadPics("pics/background.jpeg",1)[0];
explosion = loadPics("Pics/explosion.gif",5);
slib = new SoundLib();
slib.loadSound("heli","sound/heli.wav");
slib.loadSound("bumm","sound/boom.wav");
slib.loadSound("rocket", "sound/rocket_start.wav");
last = System.nanoTime();
gameover = 0;
actors = new Vector<Sprite>();
Background1();
copter = new Heli(heli,400,300,100,this);
actors.add(copter);
if(isStarted()){
slib.loopSound("heli");
}
createClouds();
timer = new Timer(3000,this);
timer.start();
rtime = new Timer(10000,this);
rtime.start();
if(!once){
once = true;
Thread t = new Thread(this);
t.start();
}
}
private void createClouds(){
BufferedImage[] ci = this.loadPics("pics/cloudr.png", 1);
for(int y=10;y<getHeight();y+=50){
int x = (int)(Math.random()*getWidth());
Cloud cloud = new Cloud(ci,x,y,1000,this);
actors.add(cloud);
}
}
private void Background1(){
BufferedImage[] bg1 = this.loadPics("pics/Cityraw.jpg", 1);
int x = 0;
int y = 0;
Rockleft rokl = new Rockleft(bg1,x,y,1000,this);
actors.add(rokl);
Rockleft rokl2 = new Rockleft(bg1,x+1594,y,1000,this);
actors.add(rokl2);
Rockleft rokl3 = new Rockleft(bg1,x+3188,y,1000,this);
actors.add(rokl3);
Rockleft rokl4 = new Rockleft(bg1,x+4782,y,1000,this);
actors.add(rokl4);
}
/*private void RockDown(){
BufferedImage[] rd = this.loadPics("pics/Rockdown.png", 1);
int x = 200;
int y = 0;
Rockleft2 rokd = new Rockleft2(rd,x,y,1000,this);
actors.add(rokd);
}*/
public void createExplosion(int x, int y){
Explosion ex = new Explosion(explosion,x,y,100,this);
actors.add(ex);
slib.playSound("bumm");
}
public void run(){
while(game_running){
computeDelta();
if(isStarted()){
checkKeys();
doLogic();
moveObjects();
}
repaint ();
try {
Thread.sleep(10);
}catch (InterruptedException e) {}
}
}
private void checkKeys(){
if(up){
copter.setVerticalSpeed(-speed);
}
if(down){
copter.setVerticalSpeed(speed);
}
if(right){
copter.setHorizontalSpeed(speed);
}
if(left){
copter.setHorizontalSpeed(-speed);
}
if(!up&&!down){
copter.setVerticalSpeed(0);
}
if(!left&&!right){
copter.setHorizontalSpeed(0);
}
}
private void doLogic(){
Vector<Sprite> trash = new Vector<Sprite>();
/* for(Movable mov:actors){
mov.doLogic(delta);
Sprite check = (Sprite)mov;
if(check.remove){
trash.add(check);
}
}
*/
for(int i=0;i<actors.size() ; i++) {
actors.get(i).doLogic(delta);
Sprite check = (Sprite)actors.get(i);
if(check.remove){
trash.add(check);
}
}
for(int i = 0;i < actors.size();i++){
for(int n = i+1; n<actors.size(); n++){
Sprite s1 = actors.elementAt(i);
Sprite s2 = actors.elementAt(n);
s1.collidedWith(s2);
}
}
if(trash.size()>0){
for(Sprite s: trash){
actors.remove(s);
}
}
if(gameover>0){
if(System.currentTimeMillis()-gameover>3000){
stopGame();
}
}
}
private void stopGame(){
timer.stop();
rtime.stop();
slib.stopLoopingSound();
setStarted(false);
}
private void moveObjects(){
/*for(Movable mov:actors){
mov.move(delta);
}
*/
for(int i=0;i<actors.size() ; i++) {
actors.get(i).move(delta);
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
if(!isStarted()){
return;
}
if(actors !=null){
/*for(Drawable draw:actors){
draw.drawObjects(g);
} */
for(int i=0;i<actors.size();i++){
actors.get(i).drawObjects(g);
}
}
g.setColor(Color.DARK_GRAY);
g.setFont( new Font( "Trebuchet MS", Font.BOLD, 14 ) );
g.drawString("FPS: " + Long.toString(fps), 20, 10);
g.drawString("Level " + level, 850, 10);
}
private void computeDelta(){
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9)/delta;
}
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;
}
public boolean isStarted() {
return started;
}
public void setStarted(boolean started) {
this.started = started;
}
private void createRocket(){
int x = 0;
int y = (int)(Math.random()*getHeight());
int hori = (int)(Math.random()*2);
if(hori==0){
x = -30;
}else{
x = getWidth()+30;
}
Rocket rock = new Rocket(rocket,x,y,100,this);
if(x<0){
rock.setHorizontalSpeed(500);
}else{
rock.setHorizontalSpeed(-700);
}
actors.add(rock);
//slib.playSound("rocket");
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP){
up = true;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN){
down = true;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT){
left = true;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
right = true;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP){
up = false;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN){
down = false;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT){
left = false;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
right = false;
}
if(e.getKeyCode()==KeyEvent.VK_ENTER){
if(!isStarted()){
doInitializations();
setStarted(true);
level = 1;
}
}
if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
if(isStarted()){
stopGame();
}else{
setStarted(false);
System.exit(0);
}
}
}
public void actionPerformed(ActionEvent e){
if(isStarted() && e.getSource().equals(timer)){
createRocket();
}
if(isStarted() && e.getSource().equals(rtime)){
level++;
timer.setDelay(3000/level);
}
}
}