Java多线程游戏 - 雷霆战斗机
先从疗效图开始(末尾附有源码地址,欢迎交流)。
文章目录
一、概述
你们小时候都玩过飞机大战,在前三天了解了线程后,我决定写一个关于多线程雷霆战斗机(单机)的游戏。这里用的有很多与线程、图像处理、音乐等相关的技术,我刚用了半年Java,就偶然发现了这个游戏。这花了很多时间,最后还是出现了一些缺陷。该材料是从另一位博主那里下载的。
资料下载地址:
地址
二、相关技术了解哪些是线程、进程、多线程、并发线程了解线程寿命和线程控制了解线程安全问题,处理游戏中的线程安全问题了解 Java 中的列表类及其读取和播放音乐文件的底层实现了解按键窃听缓冲区(解决屏幕闪烁问题) 三、功能介绍与说明
(1) 功能介绍
1. 加载页面
2. 菜单页面
3. 弹出提示
4.多层次(四个层次)。
5、各种客机(8种)。
6. 音质
7.动态滚动地图,引爆GIF
8. 客机升级达到一定水平
9. 时间安排
10. 暂停恢复游戏(线程控制)。
11. 开始一个新游戏(清空旧数据并加载新数据)。
13.关卡老板
(2)功能说明
1. 加载页面的准备
关键点:进度条的使用
加载接口
无非是一个界面,重要的可能是加载栏的那种。你可以自己制作这个加载器,也可以使用Java中的加载器,这里我使用Java附带的加载器。
JProgressBar bar = new JProgressBar(1, 100);
bar.setStringPainted(true); //描绘文字
bar.setString("加载飞机和子弹中,请稍候,精彩马上开始"); //设置显示文字
bar.setBackground(Color.ORANGE); //设置背景色
bar.setBounds(100, 800, 1000, 100);//设置大小和位置
bar.setValue(20); //设置进度条值
2. 创建菜单页面
它是提供一些功能按钮和弹出窗口,以实现每个功能的有序进行。
关键点:弹窗、按钮窃听、焦点获取
弹出窗口只不过是一个界面,要么自己制作一个窗口,要么使用 Java 附带的弹出类
JDialog cs=new JDialog();
弹出窗口的操作与 JFrame 类的形式一致。
这里需要注意的是,既然关键窃听要在前面实现,那么重点就要注意自己的位置。并注意获得焦点。
3. 多层次
这没什么好说的,我只是找了四张地图。
4.各种客机
这就比较麻烦了,在设计类的时候,可以用私有数据初始化各类客机的不同属性。创建乘客对象时,只需将数据传输到其中即可。
以下是我的乘客等级代码;
英雄机器
public class MyHeroPlane {
private int Blood;
private int speed;
private ImageIcon image;
public MyHeroPlane(int blood, int speed, ImageIcon image) {
super();
Blood = blood;
this.speed = speed;
this.image = image;
}
public int getBlood() {
return Blood;
}
public int getSpeed() {
return speed;
}
public ImageIcon getImage() {
return image;
}
public void setBlood(int blood) {
Blood = blood;
}
}
大炮类
public class EnemyPlane extends Thread{
private int blood;
private int x,y;
private ImageIcon image;
private int speed;
private boolean islive;
private int sore;
private boolean suspend=false;
public EnemyPlane(int blood, int x, int y, ImageIcon image,int speed,int sore) {
super();
this.blood = blood;
this.x = x;
this.y = y;
this.image = image;
this.speed=speed;
this.islive=true;
this.sore=sore;
}
public void run()
{
while(blood>=0&&islive)
{
while(suspend)
{
//暂停功能
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
y+=speed;
}
}
public int getBlood() {
return blood;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public ImageIcon getImage() {
return image;
}
public int getSpeed() {
return speed;
}
public boolean isIslive() {
return islive;
}
public void setIslive(boolean islive) {
this.islive = islive;
}
public void setBlood(int blood) {
this.blood = blood;
}
public int getSore() {
return sore;
}
public boolean isSuspend() {
return suspend;
}
public void setSuspend(boolean suspend) {
this.suspend = suspend;
}
}
炮
弹类(敌方、敌方炮弹)。
一、处方炸弹
public class MyHeroBullets extends Thread{
private boolean islive=true;
private int x;
private int y;
private int atk;
private ImageIcon image;
private int speed;
private boolean suspend=false;
public MyHeroBullets(int x, int y, int atk, ImageIcon image, int speed) {
super();
this.x = x;
this.y = y;
this.atk = atk;
this.image = image;
this.speed = speed;
}
public void run() {
while(islive)
{
while(suspend)
{
//暂停功能
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
y-=speed;
}
}
public boolean isIslive() {
return islive;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getAtk() {
return atk;
}
public ImageIcon getImage() {
return image;
}
public int getSpeed() {
return speed;
}
public void setIslive(boolean islive) {
this.islive = islive;
}
public boolean isSuspend() {
return suspend;
}
public void setSuspend(boolean suspend) {
this.suspend = suspend;
}
}
敌方炮弹类
public class EnemyBullets extends Thread{
private int atk;
private ImageIcon image;
private int speed;
private boolean islive=true;
private int x,y;
private boolean suspend=false;
public EnemyBullets(int atk, ImageIcon image, int speed, int x, int y) {
super();
this.atk = atk;
this.image = image;
this.speed = speed;
this.x = x;
this.y = y;
}
public void run() {
while(islive)
{
while(suspend)
{
//暂停功能
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
y+=speed;
}
}
public boolean isIslive() {
return islive;
}
public void setIslive(boolean islive) {
this.islive = islive;
}
public int getAtk() {
return atk;
}
public ImageIcon getImage() {
return image;
}
public int getSpeed() {
return speed;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isSuspend() {
return suspend;
}
public void setSuspend(boolean suspend) {
this.suspend = suspend;
}
}
这里我没有用客机包装外壳,这不是很方便,你可以通过封装在一起来做到这一点。
5. 音质
事不宜迟,阅读文件后,播放并直接进入代码。
public class GetMusic extends Thread{
private String path;
private boolean flag=true;
private boolean whileplay;
private double value ;
public GetMusic(String path,boolean whileplay,double value) {
super();
this.path = path;
this.whileplay=whileplay;
this.value=value;
}
public void run()
{
if(whileplay)
{
while(flag)
{
playMusic();
}
}
else
playMusic();
}
public void playMusic() {// 背景音乐播放
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("music\"+path));
AudioFormat aif = ais.getFormat();
final SourceDataLine sdl;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, aif);
sdl = (SourceDataLine) AudioSystem.getLine(info);
sdl.open(aif);
sdl.start();
FloatControl fc = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN);
// value可以用来设置音量,从0-2.0
double value = 2;
float dB = (float) (Math.log(value == 0.0 ? 0.0001 : value) / Math.log(10.0) * 20.0);
fc.setValue(dB);
int nByte = 0;
int writeByte = 0;
final int SIZE = 1024 * 64;
byte[] buffer = new byte[SIZE];
while (nByte != -1) {
if(flag) {
sdl.write(buffer, 0, nByte);
nByte = ais.read(buffer, 0, SIZE);
}else {
nByte = ais.read(buffer, 0, 0);
}
}
sdl.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
6. 客机升级
这很容易实现,您可以在形成外壳的线程中再形成两个外壳。其实,如果你有什么更好的意见,欢迎交流。
功效图:(最高4000点升级)。
7. 暂停重新启动
我在这里使用的是在线程运行模式中添加一个无限循环,当它暂停时,所有线程都会进入无限循环。其实这样也有缺点,那就是占用了更高的笔记本资源。它也可以通过休眠和唤醒线程来实现飞机游戏 源码,这在我的程序中比较麻烦并且没有使用。
8. 开始新游戏
您可以通过重新创建对象来执行此操作,如果您之前使用静态创建了对象,则需要自动擦除所有数据。不幸的是,我的一些对象是静态的,所以有点麻烦。
9. 道具的使用
为了降低游戏的可玩性,可以降低一些道具,比如血色道具、盾牌道具、僚机、助推器炮弹......
您可以自己设计。您可以通过我的源代码阅读如何设计它,所以我不会详细介绍。前两个功效图表。
盾牌
僚机
强化贝壳
10.关卡老板
这与设计大炮相同,只是您可以增加BOSS生命值并调整发射炮弹的形式。
(3) 关键算法
碰撞判定
让我们从一张图片开始
碰撞无非是前四种情况,所以我们可以通过多种方式来实现,可以确定两张图的中心点之间的距离,也可以穿过敌机的四个点,无论一个点是在敌机还是炮弹的射程内。
四、
我的项目的主要缺点是我所有的处方炮弹、敌方客机和敌方炮弹都是一个新线程,并且在游戏过程中数百个线程同时运行。导致笔记本卡顿和资源浪费。解决方案是,连接的线程不需要在每次创建外壳和客机时启动线程,并且连接的线程可以控制它。因为图片是四四方方的图片,有一部分留白飞机游戏 源码,所以在写碰撞功能的时候,并没有所有的图片,有一定的视觉偏差(明明被击中却通过,或者明明看起来没打,但实际上却击中了)游戏难度设置不合理(啊哈哈哈哈, 因为我没有考虑玩家的经验,所以在扮演BOSS的时候尝试过,基本上很伤感)。游戏程序的稳定性不好,一些不容易出现的bug会死机。存在一定的闪烁问题(我添加了缓冲功能,并且由于程序占用太多资源,执行时仍然有一定的闪烁)。
最后,链接到我的源代码:
源代码
翻译”:[{“文本”:”
兴力手机钓鱼正版兴力手机钓鱼最新稳定版n
n
星利平台下载新闻(兴利平台下载):家庭社交系统,升级友谊,家庭可以获得很多奖励。
n一款治愈风格的休闲游戏,游戏中与甜美可爱的宠物一起玩,在游戏中精心照顾可爱的小动物,
和他们一起玩,快乐成长,还会有很多游戏奖励带给玩家轻松有趣的玩游戏,各种可爱的小动物等着玩家去收集,让你的宠物店显得更加热闹,塑造一个温馨的小家,游戏中还有可爱的小动物。
n
n
不同的地图有不同的障碍和一些很棒的道具。 >
n一款特别有趣的休闲练级游戏,简单有趣
休闲玩法,指挥你的橡皮人团队战斗,拖拽你的人把敌军推开,努力打败你的对手,赢得这场比赛的战斗胜利 许多有趣的挑战在这里开放,游戏内容丰富有趣,玩家可以自由尝试不同的玩法,游戏体验也非常刺激, 玩家通过这种方式可以获得无限的乐趣趣味和趣味挑战,各种道具可以帮助玩家,让你赢起来更轻松的星力平台下载。
n
n火柴人风格的画线游戏,游戏设置了多个游戏关卡,玩起来
不会觉得很无聊,多种不同的游戏副本,在挑战中玩家可以随时解锁,感受有趣的通关过程星力捕鱼游戏源码,采用最先进的画线效果,通过破关的形式,让整个游戏玩起来更让人上瘾,解锁不同的素描关卡,控制不同的摩托车火柴人前进, 在操作上,整体没有任何难度,新手也可以控制。
n
n
小排量车购税减免年底到期,精神马努假传真铸就了两部狼王戏。
n
n
星力平台下载一款特别经典的休闲跑酷游戏,游戏到神秘的古都长安城轻松奔跑比赛,新角色二胡美女来袭,玩家可以随便收集各种龙轮滑进行跑酷体验,各种任务比赛可以前来体验,地铁跑酷梦回长安一场更加丰富精彩的盛宴, 玩家可以随意体验不同的游戏乐趣,也可以开发自己的头像框架哦。
n
n
一款非常凄美的小型秀真竞技手游,丰富多样的职业,带来更加诱人的血脉情结,让我们体验这场血腥绝世的武侠大战,感受前所未有的吴族成就,精彩愉快的冒险对战,实时在线刺激的热战,引领精彩的协同作战,沉浸在真实刺激的战场中,还可以体验这种超高自由度的竞技情结, 联合精彩的战斗,让我们享受无尽的精彩战斗。
n
n
玩家需要根据图片中的情况做出适当的选择。
n
nyi 风格农场冒险德通过营养程类你玩,玩家在你玩钟灿
通过不断完成FÚ的各种挑战任务获得丰厚的De奖励,你玩钟有非挂真IDE种植花田园生活德恢复,你玩中德无忧无虑的田园生活就是这样,可玩性非昌强德育种玩法是爆棚的,玩家在养成德钟的路上也可以自由体验田园生活德在农场悠闲的乐趣, 有兴趣的德玩家来体验一下易接下来。“,”to“:”en“,”sentLen“:{”srcSentLen“:[27,1,1,43,5,142,5,14,23,6,167,5,14,158,5,14,30,5,14,145,5,14,157,5,14,22,5,14,202,1,4],”transSentLen“:[94,0,1,136,5,432,5,14,69,6,569,5,14,539,5,14,147,5,14,513,5,14,
563,5,14星力捕鱼游戏源码,87,5,13,552,1,4]}}]}]