今天完成了部分图片截取:战场图片截取成Gif,主家截成Gif,坦克无敌状态2个Gif 。
另外根据map文件生成战场区域,效果还不错,哈哈!
就是游戏的时候CPU占用过高!总是在不断的刷新战场地图,循环一个26×26的地图信息数组(char型),后期应该改成需要的时候repaint地图。
截的图片有:









地图文件内容:
00000000000000000000000000
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
22222234511111111111111111
22222111111111111111111111
33333111111111111111111111
33333111111111111111111111
44444411111111111111111111
44444411111111111111111111
55555511111111111111111111
55555511111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111
11111111110000001111111111
11111111110111101111111111
11111111000199100011111111
11111111000199100011111111
11111111111111111111
显示的地图为:

MainFrame.java
import
java.awt.Color;
import
java.awt.Graphics;
import
java.awt.Graphics2D;
import
java.awt.Image;
import
java.awt.Toolkit;
import
java.awt.event.KeyEvent;
import
java.awt.event.KeyListener;
import
java.awt.event.WindowAdapter;
import
java.awt.event.WindowEvent;
import
java.awt.image.BufferStrategy;
import
java.io.BufferedReader;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileReader;
import
java.io.IOException;
import
java.io.StringReader;

import
javax.swing.ImageIcon;
import
javax.swing.JFrame;


/** */
/**
* @author WS
* @created at 2006-5-3 21:03:20
*/


public
class
MainFrame
extends
JFrame
implements
KeyListener
...
{


/**//* 开始从下网上番的大图片 */
private Image startImage;


/**//* 游戏坦克状态1 */
private Image tankImage1;


/**//* 游戏坦克状态2 */
private Image tankImage2;


/**//* 0-1 */
public int tankStatus = 0;


/**//* 无敌状态的白框1 */
private Image super1Image;


/**//* 无敌状态的白框2 */
private Image super2Image;

private Image stageImage;

private Image tankLetImage;

private Image p1LifeImage;

private Image p2LifeImage;

private Image flagImage;

private Image num[] = new Image[10];

private Image mapImage[] = new Image[5];

private int tankX = 140;

private int tankY = 265;


/**//* Frames状态机 0-开始 1-选择 2-幕 3-开始显示level 4-游戏中 5-Win 6-地图编辑 …… */
public int frames = 0;

public boolean gameRunning = true;

public int startY = 466;


/**//* 0-单人游戏 1-双人游戏 3-地图编辑 */
public int selectGame = 0;

private int p1Life = 2;

private int p2Life = 2;


/**//* 1-n */
public int level = 1;


/**//* 刷新频率 20毫秒 */
private long fresh = 20;

public int mask = 0;

public int leftTank = 20;

public char map[][] = new char[27][26];


public MainFrame(String title) ...{
super(title);
loadImages();
initFrame();
Thread engine = new OperatorThread(this);
engine.start();

this.addWindowListener(new WindowAdapter() ...{

public void windowClosing(WindowEvent e) ...{
System.exit(0);
}
});
}


private void initFrame() ...{
setSize(520, 486);
setVisible(true);
setBackground(Color.BLACK);
createBufferStrategy(2);
addKeyListener(this);
}


private void loadImages() ...{
startImage = loadImage("D:/eclipse/workspace/Tank/bin/start.gif");
tankImage1 = loadImage("D:/eclipse/workspace/Tank/bin/tank1.gif");
tankImage2 = loadImage("D:/eclipse/workspace/Tank/bin/tank2.gif");
stageImage = loadImage("D:/eclipse/workspace/Tank/bin/stage.gif");
tankLetImage = loadImage("D:/eclipse/workspace/Tank/bin/tankLet.gif");
p1LifeImage = loadImage("D:/eclipse/workspace/Tank/bin/1plife.gif");
p2LifeImage = loadImage("D:/eclipse/workspace/Tank/bin/2plife.gif");
flagImage = loadImage("D:/eclipse/workspace/Tank/bin/flag.gif");

/**//* 1-砖 2-冰 3-丛林 4-水 5-石头 */
mapImage[0] = loadImage("D:/eclipse/workspace/Tank/bin/zhuan.gif");
mapImage[1] = loadImage("D:/eclipse/workspace/Tank/bin/ice.gif");
mapImage[2] = loadImage("D:/eclipse/workspace/Tank/bin/tree.gif");
mapImage[3] = loadImage("D:/eclipse/workspace/Tank/bin/water.gif");
mapImage[4] = loadImage("D:/eclipse/workspace/Tank/bin/stone.gif");

for (int i = 0; i < 10; i++) ...{
num[i] = loadImage("D:/eclipse/workspace/Tank/bin/" + i + ".gif");
}

if (startImage == null) ...{
System.out.println("Null");
}
}


private Image loadImage(String fileName) ...{
return new ImageIcon(fileName).getImage();
}


public Graphics2D getDoubleGraphics() ...{
BufferStrategy strategy = this.getBufferStrategy();
return (Graphics2D) strategy.getDrawGraphics();
}


private void update() ...{
BufferStrategy strategy = this.getBufferStrategy();

if (!strategy.contentsLost()) ...{
strategy.show();
}
Toolkit.getDefaultToolkit().sync();
}

// 0-开始 1-选择 2-开始显示level 3-游戏中 4-Win 5-地图编辑

public void Start() throws Exception ...{
long startTime;
long tmp = 0;

while (gameRunning) ...{
startTime = System.currentTimeMillis();
repaint();
tmp = System.currentTimeMillis() - startTime;
// System.out.println(fresh - tmp);
Thread.sleep((fresh - tmp) < 0 ? 0 : fresh - tmp);
}
}

private void drawTank(Graphics2D g2, int direct, int posX, int posY,

int tankStatus) throws Exception ...{
g2.drawImage(startImage, 0, startY, null);

if (tankStatus == 0) ...{
g2.drawImage(tankImage1, posX, posY, null);

} else ...{
g2.drawImage(tankImage2, posX, posY, null);
}
}


private void drawLevelMask(Graphics2D g2) throws Exception ...{
g2.setColor(Color.GRAY);
g2.fillRect(0, 20, 532, mask);
g2.fillRect(0, 486 - mask, 532, 486);
}


private void drawLevel(Graphics2D g2) ...{
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, 532, 486);
g2.drawImage(stageImage, 200, 220, null);

if (level < 10) ...{
g2.drawImage(num[level], 300, 220, null);

} else ...{
String tmp = level + "";
g2.drawImage(num[Integer.parseInt(tmp.substring(0, 1))], 285, 220,
null);
g2.drawImage(num[Integer.parseInt(tmp.substring(1, 2))], 300, 220,
null);
}
}


private void drawStartMask(Graphics2D g2) ...{
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, (int) this.size().getWidth(), (int) this.size()
.getHeight());
g2.setColor(Color.BLACK);
g2.fillRect(30, 50, 416, 416);

if (mask > 0) ...{
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, 532, mask);
g2.fillRect(0, 486 - mask, 532, 486);
}
}


private void play(Graphics2D g2) ...{
drawRightBar(g2);
drawMap(g2);
// drawPlayer();
// drawEnemy();
// drawBoom&Star();
}


private void drawRightBar(Graphics2D g2) ...{
int startX = 466;
int startY = 70;
boolean left = true;

for (int i = 0; i < leftTank; i++) ...{
g2.drawImage(tankLetImage, startX, startY, null);

if (left) ...{
startX += 16;

} else ...{
startX -= 16;
startY += 16;
}
left = !left;
}
// 画出敌人坦克数量,当前level和life
g2.drawImage(p1LifeImage, 466, 270, null);
g2.drawImage(num[p1Life], 482, 287, null);
// System.out.println("P1Life");

if (selectGame == 1) ...{
g2.drawImage(p2LifeImage, 466, 320, null);
g2.drawImage(num[p1Life], 482, 337, null);
}
g2.drawImage(flagImage, 466, 380, null);

if (level < 10) ...{
g2.drawImage(num[level], 482, 412, null);

} else ...{
String tmp = level + "";
g2.drawImage(num[Integer.parseInt(tmp.substring(0, 1))], 466, 412,
null);
g2.drawImage(num[Integer.parseInt(tmp.substring(1, 2))], 482, 412,
null);
}
}


private void drawMap(Graphics2D g2) ...{
// 根据map文件画出战场
// 左30上20右62下16共512*446 战场:417*406
// 1块34*34 13*34=442 442*442
// 32*32=416

for (int i = 0; i < 26; i++) ...{

for (int j = 0; j < 26; j++) ...{

/**//* 1-砖 2-冰 3-丛林 4-水 5-石头 */
if (map[j][i] == '0')
continue;

if (map[j][i] == '1') ...{
g2.drawImage(mapImage[0], 30 + 16 * i, 50 + 16 * j, null);
continue;

} else if (map[j][i] == '2') ...{
g2.drawImage(mapImage[1], 30 + 16 * i, 50 + 16 * j, null);
continue;

} else if (map[j][i] == '3') ...{
g2.drawImage(mapImage[2], 30 + 16 * i, 50 + 16 * j, null);
continue;

} else if (map[j][i] == '4') ...{
g2.drawImage(mapImage[3], 30 + 16 * i, 50 + 16 * j, null);
continue;

} else if (map[j][i] == '5') ...{
g2.drawImage(mapImage[4], 30 + 16 * i, 50 + 16 * j, null);
continue;
}
}
}
}


public void paint(Graphics g) ...{

try ...{

switch (frames) ...{
case 0:
getDoubleGraphics().drawImage(startImage, 0, startY, null);
break;
case 1:
drawTank(getDoubleGraphics(), 4, tankX, tankY, tankStatus);
break;
case 2:
drawLevelMask(getDoubleGraphics());
break;
case 3:
drawLevel(getDoubleGraphics());
break;
case 4:// StartMask
drawStartMask(getDoubleGraphics());
break;
case 5:// StartGame
play(getDoubleGraphics());
break;
case 6:
break;
}
update();

} catch (Exception e) ...{

}
}


private void mapInit() ...{
File mapFile = new File("D:/eclipse/workspace/Tank/bin/level.txt");
BufferedReader br = null;

try ...{
br = new BufferedReader(new FileReader(mapFile));
String tmp = null;
int i = 0;

while ((tmp = br.readLine()) != null) ...{
tmp.toCharArray();
map[i++] = tmp.toCharArray();
}
// System.out.println("Map Inited!");

} catch (FileNotFoundException e) ...{

} catch (IOException e) ...{
}
}


public void keyPressed(KeyEvent e) ...{
// System.out.println("Key:" + e.getKeyCode());

switch (e.getKeyCode()) ...{
case KeyEvent.VK_G:

if (frames == 1) ...{
selectGame++;

if (selectGame == 3) ...{
selectGame = 0;
}

if (selectGame == 0) ...{
tankY = 265;

} else if (selectGame == 1) ...{
tankY = 297;

} else if (selectGame == 2) ...{
tankY = 330;
}
}
break;
case KeyEvent.VK_H:

if (frames == 1) ...{
frames = 2;// 幕

} else if (frames == 3) ...{
// init Map & Course
mapInit();
// PlaySound();Sleep 4sec;
frames = 4;
}
break;
case KeyEvent.VK_U:
// 显示LevelFrame

if (frames == 3) ...{

if (level > 1) ...{
level--;
}
}
break;
case KeyEvent.VK_I:

if (frames == 3) ...{

if (level < 35) ...{
level++;
}
}
break;
case KeyEvent.VK_J:

if (frames == 3) ...{

if (level > 1) ...{
level--;
}
}
break;
case KeyEvent.VK_K:

if (frames == 3) ...{

if (level < 35) ...{
level++;
}
}
break;
}
}


public void keyReleased(KeyEvent e) ...{

}


public void keyTyped(KeyEvent e) ...{

}
}
OperatorThread.java
public
class
OperatorThread
extends
Thread
...
{
private MainFrame mainFrame = null;


public OperatorThread(MainFrame mainFrame) ...{
this.mainFrame = mainFrame;
}


public void run() ...{

try ...{

while (mainFrame.gameRunning) ...{

switch (mainFrame.frames) ...{
case 0:

for (int i = 0; i < 446; i++) ...{
mainFrame.startY--;
Thread.sleep(10);
}
mainFrame.frames = 1;
break;
case 1:

while (mainFrame.frames == 1) ...{

if (mainFrame.tankStatus == 0) ...{
mainFrame.tankStatus = 1;

} else ...{
mainFrame.tankStatus = 0;
}
Thread.sleep(100);
}
break;
case 2:

for (int i = 0; i <= 233; i++) ...{
mainFrame.mask = i;
Thread.sleep(1);
}
mainFrame.frames = 3;
break;
case 4:

if (mainFrame.mask > 0) ...{
mainFrame.mask--;
Thread.sleep(1);

} else ...{
mainFrame.frames = 5;
Thread.sleep(10);
}
break;
case 5:
Thread.sleep(100);
// startGame
break;
default:
Thread.sleep(100);
}
}

} catch (Exception e) ...{
System.out.println(e.getMessage());
}
}
}