package cn.itcast.game;
import java.awt.List;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.security.auth.x500.X500Principal;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledEditorKit.ForegroundAction;
import org.itcast.game.Window;
import org.itcast.game.utils.DrawUtils;
import org.itcast.game.utils.SoundUtils;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import cn.itcast.game.business.Blockable;
import cn.itcast.game.business.Destroyable;
import cn.itcast.game.business.Hitable;
import cn.itcast.game.business.Moveable;
import cn.itcast.game.domain.Blast;
import cn.itcast.game.domain.Bullet;
import cn.itcast.game.domain.Direction;
import cn.itcast.game.domain.Element;
import cn.itcast.game.domain.EnemyTank;
import cn.itcast.game.domain.Grass;
import cn.itcast.game.domain.MyTank;
import cn.itcast.game.domain.Steel;
import cn.itcast.game.domain.Wall;
import cn.itcast.game.domain.Water;
public class GameWindow extends Window {
public GameWindow(String title, int width, int height, int fps) {
super(title, width, height, fps);
// TODO Auto-generated constructor stub
}
CopyOnWriteArrayList<Element> list=new CopyOnWriteArrayList<Element>();
MyTank myTank;
EnemyTank emTank1;
EnemyTank emTank2;
/**
* 创建时调用(只执行一次)
*/
@Override
protected void onCreate() {
for(int i=0;i<Config.WIDTH/64-1;i++){
Wall wall=new Wall(64*i, 64);
addElement(wall);
}
for(int i=1;i<Config.WIDTH/64-1;i++){
Water water=new Water(64*i+64, 64*3);
addElement(water);
}
for(int i=0;i<Config.WIDTH/64-1;i++){
Steel steel=new Steel(64*i, 64*5);
addElement(steel);
}
for(int i=0;i<Config.WIDTH/64-1;i++){
Grass grass=new Grass(64*i+64, 64*7);
addElement(grass);
}
myTank=new MyTank( Config.WIDTH/2-32, Config.HEIGHT-64);
addElement(myTank);
emTank1=new EnemyTank(0, 0);
addElement(emTank1);
emTank2=new EnemyTank(Config.WIDTH-64, 0);
addElement(emTank2);
//
try {
//
SoundUtils.play("res//snd//start.wav");
//
} catch (IOException e1) {
//
// TODO Auto-generated catch block
//
e1.printStackTrace();
//
}
}
/**
* 鼠标点击事件
*/
@Override
protected void onMouseEvent(int key, int x, int y) {
}
/**
* 键盘点击事件
*/
@Override
protected void onKeyEvent(int key) {
// TODO Auto-generated method stub
switch (key) {
case Keyboard.KEY_UP:
myTank.move(Direction.UP);
break;
case Keyboard.KEY_LEFT:
myTank.move(Direction.LEFT);
break;
case Keyboard.KEY_DOWN:
myTank.move(Direction.DOWN);
break;
case Keyboard.KEY_RIGHT:
myTank.move(Direction.RIGHT);
break;
case Keyboard.KEY_SPACE:
Bullet bullet=myTank.shot();
if(bullet!=null)
addElement(bullet);
break;
default:
break;
}
}
/**
* 实时刷新
*/
@Override
protected void onDisplayUpdate() {
if(myTank.isDestroy()||(emTank1.isDestroy()&&emTank2.isDestroy()))
{
list.clear();
try {
DrawUtils.draw("res//img//gameover.gif", (Config.WIDTH-96)/2,(Config.HEIGHT-96)/2);
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
SoundUtils.stop("res//snd//fire.wav");
}
for(Element li:list){
li.draw();
}
for(Element ee :list){
if(ee instanceof Destroyable){
Destroyable destroyable=(Destroyable)ee;
if (destroyable.isDestroy()) {
Blast blast= destroyable.showDestroy();
if(blast!=null){
addElement(blast);
}
list.remove(ee);
}
}
}
for (Element e1 : list) {
for (Element e2 : list) {
if ( e1!= e2&&e1 instanceof Moveable && e2 instanceof Blockable) {
boolean flag = ((Moveable)e1).checkHit((Blockable)e2);
if (flag) { //flag = true,
break;
}
}
}
}
for (Element e1 : list) {
for (Element e2 : list) {
if (e1 != e2 && e1 instanceof Bullet && e2 instanceof Hitable) {
boolean flag = ((Bullet)e1).checkHit((Hitable)e2);
if (flag) { //flag = true,
if (((Bullet)e1).getTank() == e2) {
continue;
}
if (((Bullet)e1).getTank().getClass() == e2.getClass()) {
continue;
}
list.remove(e1);
Blast blast = ((Hitable)e2).showAttack();
addElement(blast);
}
}
}
}
for(Element e :list){
if(e instanceof Blast){
boolean flag=((Blast)e).isDestroy();
if(flag){
list.remove(e);
}
}
}
for(Element ee :list){
if(ee instanceof Blast){
Blast bullet=(Blast)ee;
if (bullet.isDestroy()) {
list.remove(ee);
}
}
}
for(Element e :list){
if(e instanceof EnemyTank){
((EnemyTank)e).move();
Bullet shot = ((EnemyTank)e).shot();
if (shot != null) {
addElement(shot);
}
}
}
}
public void addElement(Element e) {
list.add(e);
list.sort(new Comparator<Element>() {
public int compare(Element e1, Element e2) {
return e1.getOrder() - e2.getOrder();
}
});
}
}