实例介绍
【实例简介】
【实例截图】
【核心代码】
package cn.ucai.war;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
//import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;
// JPanel 理解为画布
public class ShootGame extends JPanel {
public static final int WIDTH = 400; // 宽
public static final int HEIGHT = 654; // 高
public static BufferedImage background; //生成的图片在内存里有一个图像缓冲区
public static BufferedImage start;
public static BufferedImage gameover;
public static BufferedImage airplane;
public static BufferedImage pause;
public static BufferedImage bee;
public static BufferedImage bullet;
public static BufferedImage hero0;
public static BufferedImage hero1;
public Hero hero = new Hero();//声明主机对象
public Bullet[] bullets = {};//子弹对象的数组
public FlyingObject[] flyings = {}; //敌机和小蜜蜂
// 静态代码块,在类加载的时候就执行,只执行一次
static{
//加载图片资源
try {
background = ImageIO.read(ShootGame.class.getResource("background.png"));
start = ImageIO.read(ShootGame.class.getResource("start.png"));
gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));
airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));
pause = ImageIO.read(ShootGame.class.getResource("pause.png"));
bee = ImageIO.read(ShootGame.class.getResource("bee.png"));
bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));
hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));
hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("飞机大战"); //创建窗体并未窗体设置标题
ShootGame game = new ShootGame();
frame.add(game);
frame.setSize(WIDTH, HEIGHT);//设置窗体的宽高
frame.setIconImage(new ImageIcon("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\icon.jpg").getImage());//设置图标
frame.setLocationRelativeTo(null);//默认显示在屏幕的中间
// 点击关闭窗口,小红点消失,表示程序停止,避免资源的浪费
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //将窗体显示出来
game.action();
// 里面放入音乐的绝对路径
playMusic("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\BinaryRainMusic.wav");
}
// 添加播放音乐的方法
static void playMusic(String strUrl){//背景音乐播放
try {
// 引入音乐文件所在的路径
File file = new File(strUrl);
URL url = file.toURL();
AudioClip aClip = Applet.newAudioClip(url);
// aau.play();//播放一遍
aClip.loop();//循环播放
// 循环播放 aau.play()
//单曲 aau.stop()停止播放
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
// 导入java util这个包
private Timer timer; //定时器
private int intervel = 10; //时间间隔(毫秒)
private int state;//游戏状态
public static final int START = 0;
public static final int RUNNING = 1;
public static final int PAUSE = 2;
public static final int GAME_OVER =3;
// 创建方法,处理逻辑
private void action() {
// 创建鼠标适配器对象,监听鼠标事件,并且重写鼠标点击、移动的方法
MouseAdapter mAdapter = new MouseAdapter() {
//重写鼠标点击
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseClicked(e);
switch (state) {
case START:
state = RUNNING;
break;
case GAME_OVER: //游戏结束,清理现场
flyings = new FlyingObject[0]; //清理敌机和小蜜蜂
bullets = new Bullet[0]; //清理子弹
hero = new Hero(); //主机显示出来
score = 0;
state = START; //游戏的状态改为起始状态
break;
default:
break;
}
}
//重写鼠标移动
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseMoved(e);
if (state == RUNNING) {
int x = e.getX();
int y = e.getY();
hero.moveTo(x, y);
System.out.println(x);
System.out.println(y);
System.out.println();
}
}
};
this.addMouseListener(mAdapter); //添加鼠标点击事件的监听
this.addMouseMotionListener(mAdapter); //添加鼠标移动事件的监听
timer = new Timer();
// 给定时器设置进度
/*
* 参数一:被定时器执行的任务
* 参数二:延时多少毫秒去执行run()里面的内容
* 参数三:定时器执行的周期
*/
/*
* 没有名字的内部类:
* new 父类构造器(){
* 匿名内部类的类体部分
* }
* 不能反复使用
* 消除坠余代码
*/
timer.schedule(new TimerTask() {
@Override
public void run() {
if (state == RUNNING) {
enterAction(); //在定时器中,如果游戏处于运行,
stepAction();
shootAction();
bangAction();
checkGameOverAction();
}
repaint(); //重新绘制(提供的)
}
}, intervel,intervel);
}
//检查游戏是否结束
public void checkGameOverAction() {
if (isGameOver()) {
state = GAME_OVER;
}
}
private boolean isGameOver() {
for (int i = 0; i < flyings.length; i ) {
int index =-1;
FlyingObject obj = flyings[i];
if (hero.hit(obj)) { //检查主机是否碰撞
hero.subtractLife();//主机减生命
hero.setDoubleFire(0); //去掉双倍火力
index = i;
}
// 主机碰撞到敌机
if(index != -1){
//重设敌人对象数组
FlyingObject t = flyings[index];
flyings[index]= flyings[flyings.length-1];
flyings[flyings.length -1] = t;
flyings = Arrays.copyOf(flyings, flyings.length-1);
}
}
//当主机的生命 <0的时候,游戏结束
return hero.getLife()<0;
}
//验证碰撞
//子弹与敌人碰撞
protected void bangAction() {
for (int i = 0; i < bullets.length; i ) {
bang(bullets[i]); //创建此方法
}
}
//处理碰撞逻辑
private void bang(Bullet bullet) {
int index = -1; //集中的飞行物的索引
for (int i = 0; i < flyings.length; i ) {
FlyingObject obj =flyings[i];
//判断是否被子弹集中
if (obj.shootBy(bullet)) {
index=i;
}
}
//被击中
if (index!=-1) {
FlyingObject one = flyings[index];//记录被击中飞行物
//将击中的飞行物与最后一个飞行物交换
FlyingObject temp = flyings[index];
flyings[index] = flyings[flyings.length -1];
flyings[flyings.length-1] =temp;
//删除最后一个飞行物(被击中的),飞行物数组的长度减一
flyings = Arrays.copyOf(flyings, flyings.length-1);
// 检查飞行物的类型(one)
if (one instanceof Enemy) { //检查是否是敌机类型,如果是需要得分
Enemy e = (Enemy) one;
score = e.getScore(); //消灭一个敌机 5
}
if (one instanceof Award) { //检查是否是小蜜蜂
Award a = (Award) one;
int type = a.getType(); //获取奖励的类型
switch (type) {
case Award.DOUBLE_FIRE:
hero.addDoubleFire(); //给主机获取到双倍火力
break;
case Award.LIFE:
hero.addLife(); //给主机添加一条生命
break;
default:
break;
}
}
}
}
int shootIndex = 0; //射击计数
//子弹入场
protected void shootAction() {
shootIndex ;
// 没30毫秒发射一颗子弹
// 每20毫秒计时器调用一次 shootAction()方法,射击次数 1
if (shootIndex %10 ==0) {
Bullet[] bs = hero.shoot(); //主机发射的子弹
//bs的长度 1 ,新增的子弹个数,每10毫秒新增一个
bullets = Arrays.copyOf(bullets, bullets.length bs.length);
/*
* 复制数组,返回数组原来的长度
* 参数一:源数组
* 参数二:源数组要复制的起始位置
* 参数三:目的数组
* 参数四:目的数组放置的起始位置
* 参数五:复制的长度
*/
System.arraycopy(bs, 0, bullets, bullets.length-bs.length, bs.length);
System.out.println("bs的长度" bs.length);
System.out.println(bullets.length);
}
}
// 飞行物动起来
public void stepAction() {
//敌人走一步
for(int i =0;i<flyings.length;i ){
flyings[i].step();
}
//子弹走一步
for(int i =0; i<bullets.length;i ){
bullets[i].step();
}
//主机走步
hero.step();
}
//实例化 一个入场倒计时变量
int flyEnteredIndex = 0;
//飞行物入场的方法,进入画面
public void enterAction() {
flyEnteredIndex ;
//到40毫秒,生成一个敌人
if (flyEnteredIndex %40 == 0) {
FlyingObject obj = nextOne();
/*
* 参数一:被copy的数组
* 参数二:新数组的长度,因为要添加敌人对象,所以长度加1
*/
flyings = Arrays.copyOf(flyings, flyings.length 1);
flyings[flyings.length-1] = obj; //将敌人加入到flyings数组中
}
}
//生成飞行物对象
public static FlyingObject nextOne(){
Random random = new Random();
int type = random.nextInt(20); // 0 --19
if (type == 0 ) {
return new Bee(); //5%的概率去生成小蜜蜂
}else{
return new Airplane(); //95% 的概率生成敌机
}
}
// 重写paint 方法 ,并且传入画笔参数(提供的)
@Override
public void paint(Graphics g ){
g.drawImage(background, 0, 0, null); //绘制背景
paintScore(g);
paintHero(g);
paintState(g);
paintBullet(g);
paintFlyingObject(g);
}
// 533835728 山东农大 优才实践课
private int score = 0;//声明变量得分
// 绘制得分和生命
public void paintScore(Graphics g){
// 得分的x , y坐标
int x = 10;
int y = 25;
Font font = new Font(Font.SANS_SERIF,Font.BOLD,14);//设置字体类型
g.setColor(Color.blue);//设置字体颜色
g.setFont(font);//将字体设置到画笔上
g.drawString("Score:" score, x, y); //在画笔上绘制
y = 20; //修改y的坐标
//绘制主机的生命数
g.drawString("Lift:" hero.getLife(), x, y);
}
//绘制主机
private void paintHero(Graphics g){
g.drawImage(hero.image, hero.x, hero.y, null);
}
// 绘制游戏状态
private void paintState(Graphics g){
switch (state) {
//开始状态
case START:
g.drawImage(start, 0, 0, null);
break;
//暂停状态
case PAUSE:
g.drawImage(pause, 0, 0, null);
//结束
case GAME_OVER:
g.drawImage(gameover, 0, 0, null);
default:
break;
}
}
//绘制子弹
public void paintBullet(Graphics g){
//循环获取每一个子弹对象
for(int i = 0; i< bullets.length; i ){
Bullet b = bullets[i];
//将子弹对象绘制出来
g.drawImage(b.image, b.x, b.y, null);
}
}
//绘制敌人
public void paintFlyingObject(Graphics g){
for(int i = 0;i<flyings.length;i ){
g.drawImage(flyings[i].image, flyings[i].x, flyings[i].y, null);
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论