package com.cp.tankGamePanel;
import java.awt.Color;
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.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.cp.tankGameControl.TankGameControl;
import com.cp.tankGameMap.Map;
import com.cp.tankGameMap.Map2;
import com.cp.tankGameMap.Map3;
import com.cp.tankGameMap.Map4;
import com.cp.tankGameMap.Map5;
import com.cp.tankGameMap.Map1;
import com.cp.tankGameObject.Bomb;
import com.cp.tankGameObject.EnemyTank;
import com.cp.tankGameObject.MyTank;
import com.cp.tankGameObject.Tank;
import com.cp.tankGameObject.TankGameImages;
import com.cp.tankGameObject.TankGamePen;
/**
* 游戏面板,继承自JPanel,实现KeyListener,Runnable,ActionListener接口
* <p>
* 游戏主要类,坦克游戏就在该面板上进行
* @author 1052067939
*
*/
public class TankGamePanel extends JPanel implements KeyListener,Runnable,ActionListener{
private static final long serialVersionUID = 1L;
/**
* 游戏面板的宽度
*/
public final static int WIDTH=600;
/**
* 游戏面板的高度
*/
public final static int HEIGHT=600;
/**
* 是否已经开始
*/
private boolean isStart = false;
/**
* 是否按了向上的方向键
*/
private boolean up=false;
/**
* 是否按了向下的方向键
*/
private boolean down=false;
/**
* 是否按了向左的方向键
*/
private boolean left=false;
/**
* 是否按了向右的方向键
*/
private boolean right=false;
/**
* 游戏关卡
*/
private int level=1;
/**
* 我的坦克容量
*/
private Vector<MyTank> myTanks;
/**
*敌人坦克容量
*/
private Vector<EnemyTank> enemys; //敌人坦克组
/**
* 炸弹容量
*/
private Vector<Bomb> bombs; //炸弹集合
/**
* 坦克游戏画笔对象
*/
private TankGamePen pen; //一只坦克游戏画笔
/**
* 坦克游戏地图对象
*/
private Map map;
/**
* 游戏开始的那个欢迎图片标签
*/
private JLabel startImage;
/**
* 坦克游戏控制对象
*/
private TankGameControl tgc;
/**
* 游戏失败或成功时的图片的y坐标
*/
private int dy=600;
/**
* 是否暂停
*/
private boolean isStop=false;
private Thread thread;
private int k=0;
private int ky=600;
private int kx=0;
/**
* 构造方法
*/
public TankGamePanel() {
this.initGame();
thread=new Thread(this);
thread.start();
}
/*
* 重新paint
*/
@Override
public void paint(Graphics g) {
super.paint(g);
if(this.isStart==true){
g.setColor(Color.black);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.fillRect(280, 600, 40, 40);
pen.drawMap(g, map,this);
pen.drawMyTank(g, myTanks,this); //画出我的坦克(包括子弹)
pen.drawEnemyTank(g, enemys,this); //画出敌人坦克(包括子弹)
pen.drawBomb(g, bombs, this); //画出爆炸
pen.drawRight(g, this);
if(this.tgc.getMyTankNum()==0){ //如果我的坦克数量为0
g.drawImage(TankGameImages.gameOver,250, dy, 100, 100, this);
}
if(this.tgc.getEnemyTankNum()==0){ //如果敌人坦克的数量为0
g.drawImage(TankGameImages.gameWin,250, dy, 100, 100, this);
}
if(dy==250){
g.fillRect(0, 0, 800, 600);
g.setColor(Color.BLUE);
if(this.tgc.getMyTankNum()==0){
g.drawString("很遗憾,你的技术太菜了!!!", 300, 220);
}else{
g.drawString("不错啊,请稍等,更艰巨的任务即将到来", 300, 220);
}
g.drawString(("这关敌人坦克死亡数量:"+(8-this.tgc.getEnemyTankNum())), 300, 260);
g.drawString("我的坦克死亡总数量:"+this.tgc.getBeKilled(), 300, 280);
g.drawString("我的炮弹消耗总数量:"+(TankGameControl.STARTBULLETNUM-this.tgc.getMyBulletNum()), 300, 300);
g.drawString("这关敌人坦克剩余数量:"+this.tgc.getEnemyTankNum(), 300, 320);
g.drawString("我的坦克剩余总数量:"+this.tgc.getMyTankNum(), 300, 340);
g.drawString("我的炮弹剩余总数量:"+this.tgc.getMyBulletNum(), 300, 360);
}
}else{
g.drawImage(TankGameImages.startImage, 0, 0, 800, 700, this);
g.drawImage(TankGameImages.font, 0, ky, this);
if(k==0){
g.drawImage(TankGameImages.yct_smile1, kx, 45, this);
k=1;
}else{
g.drawImage(TankGameImages.yct_smile2, kx, 45, this);
k=0;
}
}
}
@Override
public void keyPressed(KeyEvent e) {
for(int i=0;i<myTanks.size();i++){
MyTank myTank=myTanks.get(i);
if(myTank.isLive()==false) up=down=left=right=false;
if((e.getKeyCode()==KeyEvent.VK_UP)&&myTank.isLive()){
myTank.setDirect(Tank.NORTH);
up=true;
down=false;
left=false;
right=false;
}else if((e.getKeyCode()==KeyEvent.VK_DOWN)&&myTank.isLive()){
myTank.setDirect(Tank.SOUTH);
down=true;
up=false;
left=false;
right=false;
}else if((e.getKeyCode()==KeyEvent.VK_LEFT)&&myTank.isLive()&&myTank.getY()<=580){
myTank.setDirect(Tank.WEST);
left=true;
up=false;
down=false;
right=false;
}else if((e.getKeyCode()==KeyEvent.VK_RIGHT)&&myTank.isLive()&&myTank.getY()<=580){
myTank.setDirect(Tank.EAST);
right=true;
up=false;
down=false;
left=false;
}
if(e.getKeyCode()==KeyEvent.VK_X&&myTank.isLive()&&myTank.getY()<=580){
if(myTank.getBullets().size()<=1&&this.tgc.getMyBulletNum()>0){ //最多颗子弹
this.tgc.setMyBulletNum(this.tgc.getMyBulletNum()-1);
myTank.shot(myTank); //这时才会往容器中添加子弹对象
}
}
if(e.getKeyCode()==KeyEvent.VK_P){ //暂停
this.gameEventStop(myTanks, enemys);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP){
up=false;
}else if(e.getKeyCode()==KeyEvent.VK_DOWN){
down=false;
}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
left=false;
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
right=false;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void run() {
//每隔30毫秒重画
while(true){
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(this.isStart==true){
if((this.tgc.getMyTankNum()==0||this.tgc.getEnemyTankNum()==0)&&dy>250){
dy=dy-2;
}
if(dy==250){
this.repaint();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(this.level==5){
this.level=0;
}
if(this.tgc.getMyTankNum()>=1&&this.level<=4){
this.level++;
dy=600;
this.nextGame();
}
}
if(this.isStop==false&&dy==600){
tgc.cleanAndCreat(myTanks, enemys,map,bombs); //从容器中移除死亡的对象
tgc.judge(myTanks, enemys,map, bombs); //判断子弹是否击中坦克
tgc.judgeOverlap(myTanks, enemys,map); //判断坦克间是否出现重叠
this.myTankEvent(myTanks);
}
}else{
if(ky==21&&kx<=654) kx=kx+2;
this.fontMove();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.repaint();
}
}
/**
* 我的坦克事件,观察我按了什么键
* @param myTanks 我的坦克容量
*/
public void myTankEvent(Vector<MyTank> myTanks){
for(int i=0;i<myTanks.size();i++){
MyTank myTank=myTanks.get(i);
if(up==true&&myTank.isOverlapNo()==false&&myTank.isOverlapYes()==false){
myTank.goNorth();
}else if(down==true&&myTank.isOverlapNo()==false&&myTank.isOverlapYes()==false){
myTank.goSouth();
}else if(left==true&&myTank.isOverlapNo()==false&&myTank.isOverlapYes()==false){
myTank.goWest();
}else if(right==true&&myTank.isOverlapNo()==false&&myTank.isOverlapYes()==false){
myTank.goEast();
}
}
}
/**
* 游戏初始化
*/
public void initGame(){
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
gameTank.rar (92个子文件)
gameTank
.project 384B
bin
com
cp
tankGameMain
GameStart.class 4KB
tankGamePanel
TankGamePanel.class 14KB
tankGameObject
EnemyTank.class 7KB
Water.class 434B
Bullet.class 2KB
Brick.class 434B
MyTimerTask.class 699B
TankGamePen.class 6KB
Bomb.class 1KB
TankGameImages.class 2KB
Iron.class 431B
MyTank.class 1KB
Stuff.class 2KB
Tank.class 5KB
tankGameMap
Map5.class 695B
Map4.class 2KB
Map2.class 1KB
Map1.class 2KB
Map3.class 2KB
Map.class 2KB
tankGameControl
TankGameControl.class 9KB
images
bomb_2.png 10KB
bomb_5.png 35KB
DTank.gif 684B
UTank.gif 374B
LTank_.gif 2KB
font.png 7KB
LTank.gif 666B
RTank_.gif 2KB
bomb_4.png 30KB
gameWin.gif 3KB
RTank.gif 663B
gameStart.gif 236KB
brick.gif 139B
water.gif 80B
gameOver.gif 5KB
iron.gif 930B
bomb_3.png 20KB
UTank_.gif 2KB
bomb_1.png 6KB
yct1.png 4KB
gameStart.png 1.04MB
bullet.gif 437B
yct2.png 4KB
DTank_.gif 2KB
.settings
org.eclipse.jdt.core.prefs 629B
src
com
cp
tankGameMain
GameStart.java 4KB
tankGamePanel
TankGamePanel.java 19KB
tankGameObject
Bomb.java 1KB
TankGamePen.java 11KB
Bullet.java 3KB
Brick.java 391B
MyTank.java 806B
Tank.java 6KB
EnemyTank.java 11KB
TankGameImages.java 3KB
Stuff.java 2KB
Water.java 359B
Iron.java 348B
tankGameMap
Map4.java 1KB
Map.java 1017B
Map1.java 2KB
Map3.java 1KB
Map5.java 394B
Map2.java 1KB
tankGameControl
TankGameControl.java 11KB
images
bomb_2.png 10KB
bomb_5.png 35KB
DTank.gif 684B
UTank.gif 374B
LTank_.gif 2KB
font.png 7KB
LTank.gif 666B
RTank_.gif 2KB
bomb_4.png 30KB
gameWin.gif 3KB
RTank.gif 663B
gameStart.gif 236KB
brick.gif 139B
water.gif 80B
gameOver.gif 5KB
iron.gif 930B
bomb_3.png 20KB
UTank_.gif 2KB
bomb_1.png 6KB
yct1.png 4KB
gameStart.png 1.04MB
bullet.gif 437B
yct2.png 4KB
DTank_.gif 2KB
.classpath 397B
共 92 条
- 1
资源评论
- 风吹过的卫星2012-06-12挺好的,就是有点小错误
- Bbecks2012-11-27不错 可以学习下
疯一样的码农
- 粉丝: 7
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功