package tom.tanke;
import com.sun.deploy.net.MessageHeader;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class GamePanel extends JFrame {
/*
定义双缓存图片
*/
private Image offScreenImage = null;
/*
游戏状态 0 游戏未开始,1 单人模式,2 双人模式, 3 游戏暂停, 4 游戏失败,5 游戏成功
*/
public int state= 0;
/*
临时变量
*/
private int a = 1;
/*
重绘次数
*/
public int count = 0;
/*
窗口长宽
*/
private int width = 800;
private int height = 610;
/*
敌人数量
*/
private int enemyCount = 0;
/*
高度
*/
private int y = 150;
/*
是否开始
*/
private boolean start = false;
/*
物体集合
*/
public List<Bullet> bulletList = new ArrayList<>();
public List<Bot> botList = new ArrayList<>();
public List<Tank> tankList = new ArrayList<>();
public List<Wall> wallList = new ArrayList<>();
public List<Bullet> removeList = new ArrayList<>();
public List<Base> baseList = new ArrayList<>();
public List<BlastObj> blastList = new ArrayList<>();
/*
背景图片
*/
public Image background = Toolkit.getDefaultToolkit().getImage("images/background.jpg");
/*
指针图片
*/
private Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
/*
基地
*/
private Base base = new Base("images/star.gif", 365, 560, this);
/*
玩家
*/
private PlayerOne playerOne = new PlayerOne("images/player1/p1tankU.gif", 125, 510,
"images/player1/p1tankU.gif","images/player1/p1tankD.gif",
"images/player1/p1tankL.gif","images/player1/p1tankR.gif", this);
private PlayerTwo playerTwo = new PlayerTwo("images/player2/p2tankU.gif", 625, 510,
"images/player2/p2tankU.gif","images/player2/p2tankD.gif",
"images/player2/p2tankL.gif","images/player2/p2tankR.gif", this);
/*
窗口的启动方法
*/
public void launch(){
/*
标题
*/
setTitle("坦克大战");
/*
窗口初始大小
*/
setSize(width, height);
/*
用户不能调整大小
*/
setResizable(false);
/*
使窗口可见
*/
setVisible(true);
/*
获取屏幕分辨率,使窗口生成时居中
*/
setLocationRelativeTo(null);
/*
添加关闭事件
*/
setDefaultCloseOperation(3);
/*
添加键盘事件
*/
this.addKeyListener(new GamePanel.KeyMonitor());
/*
添加围墙
*/
for(int i = 0; i< 14; i ++){
wallList.add(new Wall("images/walls.gif", i*60 ,170, this ));
}
wallList.add(new Wall("images/walls.gif", 305 ,560,this ));
wallList.add(new Wall("images/walls.gif", 305 ,500,this ));
wallList.add(new Wall("images/walls.gif", 365 ,500,this ));
wallList.add(new Wall("images/walls.gif", 425 ,500,this ));
wallList.add(new Wall("images/walls.gif", 425 ,560,this ));
/*
添加基地
*/
baseList.add(base);
while (true){
if(botList.size() == 0 && enemyCount == 10){
state = 5;
}
if(tankList.size() == 0 && (state == 1 || state == 2)){
state = 4;
}
if(state == 1 || state == 2){
if (count % 100 == 1 && enemyCount < 10) {
Random r = new Random();
int rnum =r.nextInt(800);
botList.add(new Bot("images/enemy/enemy1U.gif", rnum, 110,
"images/enemy/enemy1U.gif","images/enemy/enemy1D.gif",
"images/enemy/enemy1L.gif","images/enemy/enemy1R.gif", this));
enemyCount++;
}
}
repaint();
try {
/*
线程休眠 1秒 = 1000毫秒
*/
Thread.sleep(25);
}catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public void paint(Graphics g) {
/*
创建和容器一样大小的Image图片
*/
if(offScreenImage ==null){
offScreenImage=this.createImage(width, height);
}
/*
获得该图片的画布
*/
Graphics gImage= offScreenImage.getGraphics();
/*
设置背景颜色
*/
gImage.setColor(Color.gray);
/*
填充整个画布
*/
gImage.fillRect(0, 0, width, height);
/*
改变画笔的颜色
*/
gImage.setColor(Color.yellow);
/*
改变文字大小和样式
*/
gImage.setFont(new Font("仿宋",Font.BOLD,50));
if(state == 0){
/*
添加文字
*/
gImage.drawString("选择游戏模式",220,100);
gImage.drawString("单人游戏",220,200);
gImage.drawString("双人游戏",220,300);
gImage.drawString("按1,2选择模式,按回车开始游戏",0,400);
gImage.drawImage(select,160,y,null);
}
else if(state == 1||state == 2){
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.BOLD,20));
gImage.drawString("WASD控制移动",0,510);
gImage.drawString("空格射击",0,550);
if(state == 2){
gImage.drawString("方向键控制移动",575,510);
gImage.drawString("K射击",575,550);
}
/*
paint重绘游戏元素
*/
for(Tank tank : tankList){
tank.paintSelf(gImage);
}
for(Bullet bullet: bulletList){
bullet.paintSelf(gImage);
}
bulletList.removeAll(removeList);
for(Bot bot: botList){
bot.paintSelf(gImage);
}
for (Wall wall: wallList){
wall.paintSelf(gImage);
}
for(Base base : baseList){
base.paintSelf(gImage);
}
for(BlastObj blast : blastList){
blast.paintSelf(gImage);
}
/*
重绘次数+1
*/
count++;
}
else if(state == 3){
gImage.drawString("游戏暂停",220,200);
}
else if(state == 4){
gImage.drawString("游戏失败",220,200);
}
else if(state == 5){
gImage.drawString("游戏胜利",220,200);
}
/*
将缓冲区绘制好的图形整个绘制到容器的画布中
*/
g.drawImage(offScreenImage, 0, 0, null);
}
private class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
//super.keyPressed(e);
int key = e.getKeyCode();
switch (key){
case KeyEvent.VK_1:
y = 150;
a = 1;
break;
case KeyEvent.VK_2:
y = 250;
a = 2;
break;
case KeyEvent.VK_ENTER:
state = a;
/*
添加玩家
*/
if(state == 1 && !start){
tankList.add(playerOne);
}else{
tankList.add(playerOne);
tankList.add(playerTwo);
}
start = true;
break;
case KeyEvent.VK_P:
if(state != 3){
a = state;
state = 3;
}
else{
state = a;
if(a == 0) {
a = 1;
}
}
break;
default:
playerOne.keyPressed(e);
playerTwo.keyPressed(e);
break;
}
}
@Override
public void keyReleased(KeyEvent e){
playerOne.keyReleased(e);
playerTwo.keyReleased(e);
}
}
public static void main(String[] args) {
GamePanel gamePanel = new GamePanel();
gamePanel.launch();
}
}
package tom.tanke;
import java.awt.Graphics;
import java.awt.Rectangle;
/*
基地类
*/
public class Base extends GameObject {
/*
基地的宽度与高度
*/
int width=60;
int height=60;
/*
构造方法,初始化基地的位置和图像
*/
public Base(String img, int x, int y, GamePanel gamePanel) {
super(img,x, y, gamePanel);
// TODO Auto-generated constructor stub
}
/*
重写构造方法,用于绘制基地
*/
@Override
public void paintSelf(Graphics g) {
g.drawImage(img,x, y, null);
}
/*
重写获取碰撞的方法,用于检测碰撞
*/
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
/*
返回表示基地的矩形对象,用于碰撞检测
*/
return new Rectangle(x, y,width,height);
}
}
package tom.tanke;
import java.awt.*;
/*
爆炸效果
*/
public class BlastObj extends GameObject {
/*
静态数组,用于存储爆炸效果的图片
*/
static Image[] imgs = new Image[8];
/*
爆炸效果当前帧数
*/
int explodeCount = 0;
/*
静态代码块,在类加载时执行,加载爆炸效果的图片
*/
static {
for (int i = 0; i < 8; i++) {
imgs[i] = Toolkit.getDefaultToolkit().getImage("images/blast/blast" +(i + 1)+".gif");
}
}
/*
无参构造方法,调用父类的构造方法
*/
public BlastObj() {
super();
}
/*
带参构造方法,初始化爆炸效果的位置
*/
public BlastObj(int x, int y) {
this.x = x;
this.y = y;
}
/*
重写绘制方法,用于绘制爆炸效果
*/
@Override
public void paintSelf(Graphics g) {
/*
如果爆炸效果的帧数小于8,则绘制当前帧的图片
*/
if (explodeCount < 8){
g.drawImage(imgs[explodeCount],x,y,null);
/*
帧数加一,显示下一帧图片
*/
explodeCount++;
}
}
/*
重写获取碰撞的方法,对于爆炸效果返回null
*/
@Override
public Rectangle getRec() {
return null;
}
}