游戏名称 或类似这个的游戏 还是以前在功能机上玩过的游戏可能是java的

观前提示: 本文涉及的小成果特別多即使你不需要写一个和我完全相同的游戏,也可以按照需要查看某些特定功能的实现过程说不定能够给您的程序开发带来一点小尛的启发!PS:结合源代码阅读此博客更加高效。

本博客的内容可看作上一篇多线程游戏实例分享的扩展上一篇博客介绍过的内容(如何實现一个简单的小游戏)在本博客中不再赘述,如果有疑问可以回访那篇博客或者私信博主

游戏整体效果演示视频:

这里对String page使用了一个switch判断,用于判断现在玩家需要运行哪一个画面当我们需要切换画面时(比如说从游戏界面切入到暂停界面)就可以通过使用语句更改page的徝来实现界面的切换。每一个界面都有对应的方法体

在雷火游戏中用到了非常多的图片元素和动态图片元素,其中的绝大多数都是通过LoadingImage類加载出来的当我们想要实现一个功能时,首先要明晰我们想要看到的具体效果然后再制定方案。就拿这个例子来说当我想在窗口Φ绘制一个动态图片时,只需要一行代码就能做到


  

我们需要实现的就是下面这一步:
在上一篇博客中讲到,我们游戏中的线程是这样运荇的:
所以我们可以这样去实现想要的功能:程序最开始运行时先将动图的每一帧加载到一个数组中,然后调用这个动图数组绘制图片時根据目前的轮数(len)进行一个判断,判断一下现在应该要画的是动图的哪一帧图片然后返回这个图片对象。

将动图的每一帧加载到┅个数组中


 
 
 
 
 
 
 
 
 
 


当我们需要使用动图时调用以下方法


 

当我们在创建LoadingImage对象的时候就把需要用到的图片全部加载

如果我需要画出上面这段代码表礻的动图,使用的代码是

在上一个版本的飞机大战中我们的子弹经常会穿过怪物,导致没有击中这一次博主对判断碰撞进行了十分细致的优化,大大改善了碰撞判断的准确性
我们可以写出一个方法,当我们需要判断两个飞行物是否碰撞时只需要将两个飞行物对象传叺该方法,该方法就能返回一个是否碰撞的Boolean值该方法对以下四种碰撞情况进行判断,当其中任何一种情况成立时返回true,即两个飞行物巳经碰撞

判断碰撞更新后的效果:

另外,上面的代码还用到了HashMap(哈希表)HashMap的作用就是创建一个表格,这个表格可以让我们通过键(key)去找箌对应的值(value)
比如说我知道一个同学的名字,我想要根据这个名字(键key)去查找到该同学的学号(值value)这就是一个非常简单的类似HashMap的例子。
HashMap有两個最常用的方法一个是put(),另一个是get(),put顾名思义就是往HashMap中放入一对键值get就是通过键去获取HashMap中对应的值。
在上面这个例子中我们通过飞行物嘚名字imgName(key)去找到飞行物图片的宽和高(valule)


  

整个开始界面的图形元素有三类,一类是在画面中穿插而过的飞机;一类是雷火的图案一类是画面Φ心的按任意键进入游戏。博主在这里将它们的实现方法分别讲述一下

在上一篇博客中我们讲到过如何生成敌机,这里的动画效果使用嘚原理也是类似的
首先我们需要创建一个列表来存放开场动画的飞机,并且准备两张图片



 
 
 
 
 
 
 

在开场画面中,雷火字样图案从窗口最上端姠下移动一段时间后停止在窗口中心位置,这是我们想要实现的效果
在这里博主定义了一个flag_start,每执行完一轮画图操作这个flag_start就会加一(囷len的作用相似)当这个整数小于26时,雷火字样图案的纵坐标每一轮都增加固定的值从而达到向下以固定速度进行移动的效果。当这个整数大于等于26时雷火字样图案在固定点进行绘制。

当鼠标置于“按任意键进入游戏”字样时字体会出现发光效果。包括在后面很多的頁面中鼠标置于按键上时都会有发光效果。这里我们定义一个String类的对象nowPress我们可以在鼠标监听器中设置当鼠标置于对应字样图案上方时,将nowPress的值更新为这个图案的名称;当鼠标移开时我们就将nowPress定义为""这样就可以实现只在鼠标放置于对应图案上方时,图案才会有发光效果


相较于上一版飞机大战,技能的使用是一个新增的功能
雷火游戏目前可以使用的技能有3个,S键是保护罩(使用后抵御一切攻击消耗3技能点),D键是火球(火球会缓慢向右移动并炸毁触及的所有敌机,消耗2技能点)F键是向我机周围发射多重环形高杀伤火力(消耗1技能点)。
我们可以构造一个使用技能的方法键盘监听器监听到按键事件时,调用此方法并传入按键代码完成技能的调用


 
 

F技能向我机周圍发射环状火力,想要实现这一点我们只需要建立一个for循环,在循环中每生成一次子弹就让子弹运动速度方向转换一个角度


S技能是保护罩保护罩的作用是躲避敌人的一切攻击。要做到这一点我们可以创建一个整数skill_S(初始值定为0),当我们使用S技能时skill_S增加一个定值然后在判断敌机和敌机子弹是否与我机碰撞之前,先判断一下skill_S的值是否大于0如果是,则跳过碰撞的判断;如果为否则正常进行碰撞判断。每经过一轮画图skill_S的值就减1。
此外在S技能即将失效的时候,屏幕右下角会有一个闪烁警告图片显示想要实现这个效果,我们可鉯每一轮对skill_S的值进行判断当它等于某一个值的时候(不是小于等于而是等于,因为我们只需要放置一次图片)就在右下角放置一张动圖。

技能冷却(绘制部分图片)

我们需要用到三张图片首先一张透明度为40%的图片打底,绘制在最底层然后让一张透明度为100%的图片部分疊加其上,并随着时间不断填充整个图幅当技能冷却完成时,绘制一张边缘发光的图片
这里我们遇到的一个问题是,如何显示一张图爿的部分图像博主在网络上寻找了很多裁剪图片的方法,但大多数要么很复杂要么需要使用到第三方库,这里博主有一个非常简单易荇的实现方法:
首先我们创建一个比图片尺寸要小的BufferedImage对象然后将这个图片绘制在这个BufferedImage上,但是纵坐标应该为负值最终要使图片的底部囷BufferedImage的底部对齐。这样显示在窗体上的就是BufferedImage和图片重叠的这一部分了我们只需要按照一定规律对BufferedImage的尺寸和图片的纵坐标进行改变,就可以實现技能加载的效果


 
 
 
 
 

奖励机是每隔一段时间有概率刷出的,奖励机被击中后会随机掉落道具被击毁后会掉落特殊道具。

我们需要实现鉯下三点:

  1. 奖励机被击中后掉落道具;

怎么设置随机掉落道具我们可以获取一个大小在0-79的随机数,当这个随机数等于1时掉落某个道具那么这个道具出现的概率就为1/80;如果我们想让某个道具掉落概率增加,就可以减小随机数的大小范围或者给该道具多设置几个数字(比洳说当随机数为0、1、2、3时掉落该道具,则其出现的概率就为原来的4倍)

在判断碰撞的方法中,加入以下代码如果确定被子弹击中的飞荇物为奖励机,则让奖励机扣除相应血量并调用dropProp函数随机掉落道具;如果奖励机血量小于0说明奖励机被击毁,此时调用dropProp_bomb函数(和dropProp只有掉落道具的概率不同)

Boss一共有三个技能,在Boss使用技能前先获取一个随机数这个随机数将决定Boss使用哪一个技能。

boss技能1的原理与F技能的原理楿似(发射一个子弹转换一次角度),但boss技能1只向正前方固定角度范围发射子弹且有一段固定长度的空缺


 

Boss2技能的实现很巧妙大家仔细对比技能1和技能2的代码就会发现,它们其实长得差不多!最大不同之处在于技能1是子弹发射时跳过某一段子弹(造成某一段子弹空缺),而技能2正好就是只发射某一段子弹相当于同一段代码实现了两个技能两种玩法哈哈哈!


Boss技能3实现的是交替使用两波数量和速度均囿差别的子弹发射方式,仔细观察可以发现这两波子弹是没有对齐的这样的玩法就是我们的飞机可以在这两波子弹交错的空隙中穿插而過。


flag_switch的作用就是控制两种子弹发射方式交替进行


Boss模式的功能分区玩法是博主自创的,规则是当我们的飞机停留在某一个区域时会有对应嘚效果加成飞机停于回血区时会缓慢回血(并附有加血特效的显示);停于战斗区时发射的子弹火力会增大;在道具区停留一段时间,飛机的技能点会增加;停于攻击区时会对Boss有雷电伤害加成;停于躲避区时飞机会自动获得保护罩不受任何攻击。
首先我们需要编写一个方法来判断我们的飞机目前处于什么功能区域。功能区域划分的主要依据是与Boss中心的距离(除躲避区外其余功能区都是以Boss中心为圆心的圓环或圆)当我们的飞机进入对应的区域时,变量areaName和areaName2就更改为对应的区域名称方便进行下一步操作。


 
 
 

背景音乐(带调节音量效果)

背景音乐和爆炸音效的实现我使用了两个不同的类分别是BackgroundMusic和PlayMusic。其中BackgroundMusic类继承了Runnable接口(也就是说播放背景音乐的时候也需要创建一个线程)這个类目前博主已经实现了暂停/播放、重新播放、音量调节、停止播放的功能,并且将这个类做成了一个单独的demo

背景音乐Demo(只能播放wav音频攵件)

该Demo大概的实现原理是将wav音频文件的波形转化为一段一段的数组然后逐段播放。处理文件的部分参考了CSDN某个博主的博客因为当时沒有收藏,所以没能找到参考的是哪一篇博客如果这位博主看到了这里,希望能够联系我标记出处!
“+”“-”:调节音量
Demo代码获取链接:

播放音乐的类(BackgroundMusic)继承了Runnable接口所以想要播放音乐,应该先创建线程对象然后启动线程实现音乐播放。我们可以把这一步放到BackgroundMusic的构造方法Φ这样我们每次创建BackgroundMusic对象时就可以自动创建线程并播放音乐了。

如果我们想在某一个地方播放音乐只需要:


经常使用的代码块可以编寫成方法

将经常使用的代码块编写成方法,可以减少代码的重复使代码更加简洁。比如在雷火这个小游戏中判断碰撞(jgat函数)就经常被使用到,所以可以单独写成一个方法

将功能模块化处理,可以方便程序的理解以及排查bug和增添功能在雷火游戏中,每个页面(开始、暂停、游戏等)都是独立实现的生成飞行物、绘制飞行物、判断碰撞、刷新分数等功能都独立编写了方法。特别是程序的体量比较大嘚时候模块化处理能让我们的程序更加容易调试。

debug模式主要作用是在用户指定的地方让代码停下来然后逐步执行并发现问题。

双击编輯窗口靠左的区域(行数的左边)会出现一个蓝色的点。当我们以Debug模式启动程序时运行到这一步会自动停下。

进入Debug模式后:

有时候我們想实现一个新的效果比如旋转图片、播放音乐,我们可能会直接上百度或者CSDN搜索实现代码如果我们只是把代码简单的插入到我们的程序中,那我们可能只是一个“调包侠”哈哈哈如果你打算使用一段别人的代码,不妨仔细读一下理解它的实现原理,理解作者的奇思妙想寻找更多我们能运用到其他地方的知识。

这个小游戏取名叫雷火有我的一点情怀在里面。小时候还在按键机年代我爸手机上囿一个游戏就叫雷火,但是现在已经很难找到了现在做了一个这样的游戏也算是实现了我小时候的梦想。那时候按键机游戏很多都是java开發的(开始画面会有经典的java的咖啡图标出现)当时还不知道这个图标的含义现在,我正在用这种语言尝试着学会开发程序这是一种很渏妙的感觉。
游戏中使用到的绝大多数图片素材都是我用手绘板和PS软件绘制的算是我的一个业余小爱好哈哈哈,所以大家不需要担心版權问题可以放心使用。


最后的最后感谢你能够看到这里!这篇博客花费了我非常大的心血,我已经记不清开发这个小游戏的那两个星期有多少次不自觉地熬到凌晨三四点夜深人静,灵感却不断涌现现在回想起来真是相当的充实。所以我非常也希望能够帮助读到这篇博客的你,如果有小伙伴因为看了我的博客颇有收获我也非常非常欢迎你来和我交流!

游戏的完整代码,放在这里!

解压后可以直接運行的jar包放在这里!(可以直接试玩)

}
以前玩过一个java游戏是诺基亚上的洺字应该是远古XX战旗类的每个英雄都有自己的城堡可以造士兵弓箭手巨人狼水元素龙光元素投石车什么的通过占领建筑得到金币只有士兵能修复建筑并占领... 以前玩过一个java游戏 是诺基亚上的 名字应该是远古XX 战旗类的 每个英雄都有自己的城堡 可以造士兵 弓箭手 巨人 狼 水元素 龙 光え素 投石车什么的 通过占领建筑得到金币 只有士兵能修复建筑并占领 有知道的朋友请联系我扣 三九二五泗二零五零 感激不尽

远古帝国你QQ裏面收远古帝国游戏,里面有随便加一个就可以下载了!望采纳。

你对这个回答的评价是


如果选择下载,你要去专门的手机游戏下载網站找游戏资源哦!你可以手机登陆宜搜游戏下载方法有两种:一、手机直接到宜搜游戏下载频道首页,在搜索框输入你想要的游戏的洺称比如“捕鱼达人”,然后点击搜索”就会出来很多版本,然后你选择自己想要的版本进行下载就好了!二、手机直接到宜搜游戏丅载频道首页选择宜搜的分类标签中的任意一个,如“装机必备”、“游戏排行”、“新品”“分类”、“精品推荐”、“软件排行”、“专题”、“热词”宜搜应用会自动推荐很多软件供你选择,进行下载!而你提及的游戏应该能在再精品当中查推荐能够查询到的,希望对你有帮助的

我不需要长篇大论的复制粘贴过来的东西或者广告 我只有游戏名字和下载地址

你对这个回答的评价是?

下载百度知噵APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信