发布时间:2024-02-24 14:00
整个项目,完全使用JAVA语言,从零开始,从游戏框架设计到游戏渲染,融合了Java语言的主要技术要点,对于初学者,有很大的帮助作用,作为初学者的快速提升项目恰到好处。
目录
效果展示
项目架构
功能阐述
关键代码
源码获取
注:红色的是自己,使用方向键来控制移动,ctrl键控制发出炮弹!
本程序是一个简单的坦克游戏程序,用java语言编写,在jdk 环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,直到消灭所有敌人就可以过关。本程序包括7个类,近千行代码,和一张背景图片,背景音乐构成。
背景音乐获取地址:https://music.y444.cn/#/
随心所欲下载所有歌曲,可以更换为自己喜欢的背景音乐
1、通过键盘控制我方坦克移动,及发射子弹
2、敌方英雄随机移动及发射子弹
3、使用对象池存储敌方英雄
4、碰撞检测
5、敌方英雄被我方子弹打中检测,我方英雄被敌方子弹打中检测,我方英雄与敌方英雄碰撞检测,子弹打中碰撞块的检测并移除碰撞块,子弹打中子弹碰撞检测,我方与道具碰撞检测
6、随机敌方生成
7、道具生成
8、多条生命控制
9、爆炸动画、移动动画、玩家初始化动画、敌方特殊敌机动画
10、控制控制不同的敌方类型、子弹的级别、道具类型来实现对不同敌机的操作
此程序运行背景音乐即刻播放,战争的快感一触即发!
Tankclient
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImageOp;
import java.io.File;
import java.nio.channels.FileLock;
import java.util.List;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.filechooser.FileView;
public class Tankclient extends Frame {
public static final int GAME_WIDTH = 800;//定义新的常量
public static final int GAME_HEIGHT = 600;
Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);//定义Tank
Wall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);
List explodes = new ArrayList();
List missiles = new ArrayList();//利用容器加多发子弹
List tanks = new ArrayList();
Image offScreenImage = null;//定义屏幕背后背景图片
Blood b = new Blood();
private File file;
public void paint(Graphics g) { //重写paint方法
Object bg = null;
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage(\"data\\\\bg.jpeg\");
g.drawImage(image, 0, 0, null);//背景图片
g.drawString(\"missiles count:\" + missiles.size(), 10, 50);
g.drawString(\"explodes count:\" + explodes.size(), 10, 70);
g.drawString(\"tanks count:\" + tanks.size(), 10, 90);
g.drawString(\"tanks life:\" + myTank.getLife(), 10, 110);
if (tanks.size() <= 0) {
for (int i = 0; i < 5; i++) {
tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this));
}
}
for (int i = 0; i < missiles.size(); i++) {
Missile m = missiles.get(i);
m.hitTanks(tanks);
m.hitTank(myTank);
m.hitWall(w1);
m.hitWall(w2);
m.draw(g);
//if(!m.isLive()) missiles.remove(m);//出界后去除这个子弹
//else m.draw(g);
}
for (int i = 0; i < explodes.size(); i++) {
Explode e = explodes.get(i);
e.draw(g);
}
for (int i = 0; i < tanks.size(); i++) {
Tank t = tanks.get(i);
t.collidesWithWall(w1);
t.collidesWithWall(w2);
t.collidesWithTanks(tanks);
t.draw(g);
}
myTank.draw(g);
myTank.eat(b);
w1.draw(g);
w2.draw(g);
b.draw(g);
}
public void update(Graphics g) {//调用update方法
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);//创建creatImage
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);//新的颜色
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);//用背景颜色画一个方块
gOffScreen.setColor(c);//设回原来的颜色
paint(gOffScreen);//调用paint方法
g.drawImage(offScreenImage, 0, 0, null);//图片一次性画到前面
}
public void lauchFrame() {
for (int i = 0; i < 10; i++) {
tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this));
}
this.setLocation(400, 300);//左上角点出现的位置
this.setSize(GAME_WIDTH, GAME_HEIGHT);//宽800高600
this.setTitle(\"TankWar\");//设置标题
this.addWindowListener(new WindowAdapter() { //匿名类监听类
public void windowClosing(WindowEvent e) { //重写父类
System.exit(0); //正常退出
}
});
this.setResizable(false);//不改变窗口大小
this.setBackground(Color.GREEN);//设置背景色
this.addKeyListener(new KeyMonitor());//键盘监听器
setVisible(true);
new Thread(new PaintThread()).start();//启动线程
new Thread(new Runnable() {
@Override
public void run() {
new Music().playmusic();
}
}).start();
}
public static void main(String[] args) {
Tankclient tc = new Tankclient();
tc.lauchFrame();
}
private class PaintThread implements Runnable { //内部类
public void run() {
while (true) {//不停顿循环
repaint();//调用外部包装类
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private class KeyMonitor extends KeyAdapter { //键盘监听器类 键盘按下键
public void keyReleased(KeyEvent e) { //键盘抬起来的键
myTank.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
myTank.keyPressed(e);
}
}
}
Music
import javax.sound.sampled.*;
import java.applet.*;
import javax.swing.JFrame;
import java.io.File;
import java.net.URL;
import java.net.URI;
public class Music extends JFrame { // 此处Music类继承GameWindow
File f;
URL url;
URI uri;
Music() {
try {
f = new File(\"data\\\\坦克大战-战斗5.wav\");
uri = f.toURI();
url = f.toURL();
AudioClip aau;
aau = Applet.newAudioClip(url);
aau.loop();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void playmusic() {
new Music();
}
}
主程序中调用
new Thread(new Runnable() {
@Override
public void run() {
new Music().playmusic();
}
}).start();
注:MP3格式的音乐实现起来貌似不是很理想,转换为wav格式就好啦。
格式工厂官方网址:http://www.pcfreetime.com/formatfactory/CN/index.html
你会爱上这个工具的!!!
https://tuomasi.lanzouu.com/i4N9F05k4xud
提取码:0000
GIS技术在医疗行业的应用:利用切片地图发布技术解决dmetrix数字病理切片在线浏览
android 架构师jd,在京东,做架构师是一种什么样的体验?
oracle字符串生成唯一数字,在C#中生成唯一的字符串和数字【GUID】转
React Hooks与setInterval的踩坑问题小结
分布式锁用 Redis 还是 Zookeeper?看完你就明白了
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
全国大学生数学建模竞赛(CUMCM)历年试题(查看超级方便)
Pandas 写入 Excel 的几种情形与方式,覆盖,新增,追加,对齐
最详细的JavaScript教程(高级篇),深入学习JavaScript