今天完成了部分图片截取:战场图片截取成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());
}
}
}
本文介绍了一个基于Java的坦克大战游戏开发过程,包括游戏界面的设计、地图的生成与绘制、游戏状态机的实现等内容。游戏使用了双缓冲技术来提高画面流畅度,并通过键盘监听实现了玩家操作。
177

被折叠的 条评论
为什么被折叠?



