当下疫情严重,让笔者出不了门,哪都去不了,实在是太无聊了,想想女朋友想想寝室的那帮逗比,退一步,越想越气,那个吃蝙蝠的哥们是不是该反思一下,哎,生气之余,我开发了一款以消灭蝙蝠为背景,以飞机大战样式来实现的一款Java程序,开放所有资源以及源代码供想写java游戏的同学参考。全套的设计思路以及设计方法都会详细的展示出来,部分笔者催我没有更新Python的学习,我在这里给大家道个歉,疫情原因,我要在家上课,上课阶段,可能会更新较慢,见谅~嘻嘻嘻嘻
注意奥!要看懂此源码你需要掌握java IO,java 多线程,javaGUI,java 集合类,java基础,java流程结构,java循环结构知识
======================================================================
好了,废话不多说,直接上图上代码:
这里详细介绍了飞机大战的流程处理细节的注意问题:
这是界面布局效果图示:
看到这里大家还是一脸懵逼?没事,我来介绍一下,其实,整个项目应该使用面向对象的思路去开发,我这里给出的源码并不是真正意思以上的面向对象开发,而是基于内部类实现的简单程序。也仅仅只是为了给大家参考一下写的过程以及思路,好的,首先来看源码第一个:About.java:(关于本软件页面):
代码:
package com.fntp.mainFrame;
import java.util.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class About {
//在这里创建一个初始化变量Image的对象,用于后续程序的赋值
private static Image image;
//这块的版本号可要可不要
private static final long serialVersionUID=-1588458291133087637L;
public static void main(String[] args) {
//调用下面的about()方法
about();
}
public static void about() {
//创建新窗口并且设置标题
JFrame yuFrame = new JFrame("关于蝠式战机");
//设置窗口大小
yuFrame.setSize(498,900);
//设置软件图像
ImageIcon icon = new ImageIcon("images/logoZS.png");
yuFrame.setIconImage(icon.getImage());
// 控制面板======画图板(容器)
JPanel contentPane=new JPanel(){
public void paint(Graphics g) {
//画背景
ImageIcon icon=new ImageIcon("images/about.png");
image=icon.getImage();
//绘图位置
g.drawImage(image, 0,0,null);
// TODO Auto-generated method stub
}
};
// 最后设置窗口关闭事件:
yuFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
super.windowClosing(e);}});
yuFrame.add(contentPane);
// ==============立即设置窗口可见
yuFrame.setVisible(true);}}
这里给大家展示一下一个简单的随机数生成算法,用来随机飞机的出现位置:
代码:
package com.fntp.mainFrame;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;
public class diRen_Random {
public static void main(String[] args) {
System.out.println(suijishu().toString());
}
static ArrayList<Integer> suijishu() {
ArrayList<Integer> GD=new ArrayList<Integer>();
ArrayList<Integer> SCX=new ArrayList<Integer>();
for(int a=0;a<11;a++){
GD.add(a);
System.out.print(a+" ");
}
System.out.println();
for(int b=0;b<4;b++){
Random r=new Random();
int a=r.nextInt(GD.size());
// [0,11)个伪随机数
System.out.print(GD.get(a)+",");
SCX.add(GD.get(a));
GD.remove(a);
}
System.out.println();
return SCX;
}
}
我来解释一下这个随机数生成算法吧,很简单的,就是第一步,创建了两个ArrayList对象,根据这个ArrayList对象也就是两个集合对象,来存储和提取数据。
1.创建对象
2.使用for循环遍历生成并且添加数据进ArrayList的一个对象中去
3.另一个对象使用for循环遍历,使用Random类来创建对象
4.将生成的数据添加进ArrayList的另一个对象,并且使用remove方法,将原有数据剔除重复数据
5.循环后换行打印出来
注意奥,这个方法返回的是一个ArrayList对象,所以上面的才有suijishu.toString()这一写法,目的就是将返回的数据打印输出
以下为完整的项目主程序代码:
package com.fntp.mainFrame;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;
import com.fntp.mainFrame.*;
import java.awt.Robot;
import java.util.Date;
public class Game1
{
//TODO:变量“声明”在此
PlayMusic p=new PlayMusic();
String gameBg ="bg";
String feijitu="hero0";
int dzh_diren_X0,dzh_diren_X1,dzh_diren_X2,dzh_diren_X3,dzh_diren_Y0,dzh_diren_Y1,dzh_diren_Y2,dzh_diren_Y3;
int feijiqihuan_zidanxianzaiweizhi_X1;
int feijibaozhanumber[]= new int []{
0,1,2,3};
String diRen0 = "airplane"+feijibaozhanumber[0];
String diRen1 = "airplane"+feijibaozhanumber[0];
String diRen2 = "airplane"+feijibaozhanumber[0];
String diRen3 = "airplane"+feijibaozhanumber[0];
// 所以这里出问题了,不应该创建数组,多此一举,注释掉
// String diRen[]= new String[] {"airplane0","airplane0","airplane0","airplane0","airplane0","airplane0","airplane0"};
// 测试项目时候使用一个敌人作为测试样例,实际需要使用数组进行for遍历添加,
// 同时使用Random()随机数产生不同坐标位置的敌人
String ziDan_SRC;
boolean baozhahouzidan = false;
boolean jianpanbukeyong= true;
// 子弹爆炸有四种情况
boolean zidanjizhongdiren_0 = false;
boolean zidanjizhongdiren_1 = false;
boolean zidanjizhongdiren_2 = false;
boolean zidanjizhongdiren_3 = false;
int beiJing1X = 0;
int beiJing2X = 0;
int beiJing1Y= 0;
int beiJing2Y = -852;
int ziDan_KaishiWeiZhi_X=244;
int ziDan_KaishiWeiZhi_Y=723;
int feiJiWeiZhi_X = 198;
int feiJiWeiZhi_Y = 732;
int diRen_X0,diRen_X1,diRen_X2,diRen_X3,diRen_Y0,diRen_Y1,diRen_Y2,diRen_Y3=0;
// boolean处理
boolean kaishi_zanting = false;
窗口 ck = null;
定时器 ds1 = null;
String player[] = new String [] {
"player01","player02","player03","player04","player05","player06","player07","player08","player09","players10"};
boolean yingXiongQieHuan = false;
int index = 0;
int ranDomNumber = 0;
Game1()
{
//TODO:程序初始化在此
p.play();
ck = new 窗口();
//窗口 宽+2*立体边, 高+2*立体边+标题栏
ck.setSize(498,923);
ck.setLocation(400,40);
ck.setTitle("消灭蝙蝠 ");
//设定窗口可见性setVisible true/fGDse
ck.setVisible(true);
//延时的毫秒
// TODO:设置图像
ImageIcon icon1 = new ImageIcon("images/logoZS.png");
ck.setIconImage(icon1.getImage());
ds1 = new 定时器(80);
}
class 窗口 extends JFrame
{
菜单 cd = null;
面板 mb = null;
窗口监听器 exit = null;
键盘监听器 jp = null;
窗口()
{
jp = new 键盘监听器();
this.addKeyListener(jp);
cd = new 菜单();
this.setJMenuBar(cd);
mb = new 面板();
this.add(mb);
exit = new 窗口监听器();
this.addWindowListener(exit);
this.repaint();
}
//==========================内部类:菜单类
class 菜单 extends JMenuBar
{
JMenu dan; //菜单
JMenuItem xiang1; //菜单项
菜单监听器 cdjtq;
菜单()
{
dan = new JMenu("关于游戏"); //菜单
xiang1 = new JMenuItem("声明"); //菜单项
this.add(dan);
dan.add(xiang1);
cdjtq = new 菜单监听器();
xiang1.addActionListener(cdjtq);
}
//===============菜单监听
class 菜单监听器 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//TODO:菜单事件处理
if (e.getSource() == xiang1)
{
About yuAbout= new About();
yuAbout.about();
}
}
}
}
//================窗口监听
class 窗口监听器 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
ds1.xc.stop();
System.exit(0);
}
}
class 键盘监听器 implements KeyListener
{
//TODO:键盘处理,可加入KeyEvent.VK_XXX
public void keyPressed(KeyEvent e)
{
switch (e.getKeyCode())
{
// 开始写控制蝠式战机移动:
// 抽取蝠式战机的X_Y坐标变量,抽取子弹的X_Y坐标变量:
case KeyEvent.VK_LEFT://左
if (jianpanbukeyong) {
feiJiWeiZhi_X-=5;
ziDan_KaishiWeiZhi_X-=5;
}
break;
case KeyEvent.VK_RIGHT://右
if (jianpanbukeyong) {
feiJiWeiZhi_X+=5;
ziDan_KaishiWeiZhi_X+=5;
}
break;
case KeyEvent.VK_UP://上
if (jianpanbukeyong) {
feiJiWeiZhi_Y-=5;
ziDan_KaishiWeiZhi_Y-=5;
}
break;
case KeyEvent.VK_DOWN://下
if (jianpanbukeyong) {
feiJiWeiZhi_Y+=5;
ziDan_KaishiWeiZhi_Y+=5;
}
break;
case KeyEvent.VK_SPACE:
if (jianpanbukeyong) {
kaishi_zanting = !kaishi_zanting;
if (kaishi_zanting) {
gameBg = "background";
}else {
gameBg = "pause";
}
}
break;
case KeyEvent.VK_ENTER://上
// 按下Enter切换战飞机
yingXiongQieHuan = !yingXiongQieHuan;
break;
case KeyEvent.VK_ESCAPE:
System.exit(0);
break;
}
repaint();
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
}
class 面板 extends JPanel
{
鼠标监听器 sb = null;
面板()
{
sb = new 鼠标监听器();
this.addMouseListener(sb);
this.addMouseMotionListener(sb);
}
class 鼠标监听器 extends MouseAdapter implements MouseMotionListener
{
public void mousePressed(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)//鼠标单击
{
//mx my鼠标的位置
int mx = e.getX();
int my = e.getY();
//鼠标左键 BUTTON1、右键BUTTON3
if (e.getButton() == MouseEvent.BUTTON1)
{
//TODO:鼠标左键单击
}
repaint();
}
}
public void paint(Graphics g)
{
//g.setColor(Color.BLUE); //设定颜色:RED GREEN BLUE ORANGE WHITE GRAY BLACK PINK
//g.drawRect(左,上,宽,高); //矩形
//g.fillRect(左,上,宽,高); //实心矩形
//g.drawOvGD(左,上,宽,高); //椭圆
//g.fillOvGD(左,上,宽,高); //实心椭圆
//Image tu=(new ImageIcon( 路径 )).getImage(); //路径:图片-右键-属性-路径src/
//g.drawImage(tu,x,y,null);
//((Graphics2D)g).setStroke(new BasicStroke(线粗));//设置线的粗细
//g.drawLine(点1X, 点1y, 点2X, 点2y);//画线
//g.setFont(new Font("华文新魏", Font.BOLD, 22));//设置字体
//g.drawString("文字", x, y);//设置文字
//TODO:绘图在此
// 设置软件背景
Image background1=(new ImageIcon( "images/"+gameBg+".png" )).getImage(); //路径:图片-右键-属性-路径src/
g.drawImage(background1,0,beiJing1Y,null);
Image background2=(new ImageIcon( "images/"+gameBg+".png" )).getImage(); //路径:图片-右键-属性-路径src/
g.drawImage(background2,0,beiJing2Y,null);
// 使用开始游戏讯号:boolean
// 开始游戏,可以,切换战斗机,开始发射弹药,添加战斗机(diren:敌人)
Image bianFuImage=(new ImageIcon( "images/"+feijitu+".png" )).getImage(); //路径:图片-右键-属性-路径src/
Image ZIDAN=(new ImageIcon( "images/"+ziDan_SRC+".png" )).getImage(); //路径:图片-右键-属性-路径src/
if (zidanjizhongdiren_0) {
System.out.println("敌人1未击中!");
}else {
Image diren0=(new ImageIcon( "images/"+diRen0+".png" )).getImage();
g.drawImage(diren0,diRen_X0,diRen_Y0,null);
}
if (zidanjizhongdiren_1) {
System.out.println("敌人2未击中!");
}else {
Image diren1=(new ImageIcon( "images/"+diRen0+".png" )).getImage();
g.drawImage(diren1,diRen_X1,diRen_Y1,null);
}
if (zidanjizhongdiren_2) {
System.out.println("敌人3未击中!");
}else {
Image diren2=(new ImageIcon( "images/"+diRen0+".png" )).getImage();
g.drawImage(diren2,diRen_X2,diRen_Y2,null);
}
if (zidanjizhongdiren_3) {
System.out.println("敌人2未击中!");
}else {
Image diren3=(new ImageIcon( "images/"+diRen0+".png" )).getImage();
g.drawImage(diren3,diRen_X3,diRen_Y3,null);
}
if (kaishi_zanting) {
ziDan_SRC = "bullet";
// 当判断游戏是否暂停还是继续的时候,利用boolean变量控制是否绘制战机
// 在这里抽取战机的X_Y坐标变量
// 198,732,
g.drawImage(bianFuImage,feiJiWeiZhi_X,feiJiWeiZhi_Y,null);
g.drawImage(ZIDAN,ziDan_KaishiWeiZhi_X,ziDan_KaishiWeiZhi_Y,null);
// 在这里直接写出现的敌人:为了让游戏逼真,使用数组遍历random随机一下:
// for循环遍历只是限定敌人个数,random才是令x,y坐标位置随机的算法
}
}
}
}
class 定时器 implements Runnable//实现Runnable接口
{
Thread xc = null;
long jianGe;
定时器(long jianGe)
{
this.jianGe = jianGe;
xc = new Thread(this);
xc.start();
}
public void run()
{
while (true)
{
try
{
xc.sleep(jianGe);
if (this == ds1)
{
//TODO:定时处理
if (yingXiongQieHuan) {
feijiqihuan_zidanxianzaiweizhi_X1 = feiJiWeiZhi_X;
if (index<9) {
feijitu=player[index];
index++;
}else if ( index==9 ) {
feijitu=player[index];
index=0;
// 这里必须加上,不然会有图片切换的卡顿
feijitu=player[index];
}
}else {
feijitu = "hero0";
}
if (yingXiongQieHuan) {
// 子单位置跟着换
}
// ======================
// ======================
if (kaishi_zanting) {
if (beiJing1Y<850&&beiJing2Y<850) {
beiJing1Y+=2;
beiJing2Y+=2;
}else if (beiJing1Y==850&&beiJing2Y<850) {
beiJing2Y+=2;
beiJing1Y = -850;
}else if(beiJing1Y<850 && beiJing2Y==850) {
beiJing1Y+=2;
beiJing2Y = -850;
}
}
//================================
// 开始写子弹的自动移动:
if (kaishi_zanting||yingXiongQieHuan) {
// 问题在这:不能一直小于,否则一直减下去
int zidanweizhi_X = feiJiWeiZhi_X;
if (yingXiongQieHuan) {
ziDan_KaishiWeiZhi_X = zidanweizhi_X+98;
if (ziDan_KaishiWeiZhi_Y <= 723 && ziDan_KaishiWeiZhi_Y>0) {
ziDan_KaishiWeiZhi_Y-=10;
}else if(ziDan_KaishiWeiZhi_Y<0){
ziDan_KaishiWeiZhi_Y=723;
ziDan_KaishiWeiZhi_Y-=10;
System.out.println("测试提醒:子弹已经返回原处");
}
}else {
if (ziDan_KaishiWeiZhi_Y <= 723 && ziDan_KaishiWeiZhi_Y>0) {
ziDan_KaishiWeiZhi_Y-=10;
}else if(ziDan_KaishiWeiZhi_Y<0){
ziDan_KaishiWeiZhi_Y=723;
ziDan_KaishiWeiZhi_Y-=10;
System.out.println("测试提醒:子弹已经返回原处");
}
}
}
// ===========================================
// 写敌人坐标
if (kaishi_zanting) {
diRen_X0 = diRen_X0*4;
diRen_X1 = diRen_X0+49;
diRen_X2 = diRen_X1+98*2;
diRen_X3 = diRen_X1+98*3;
// 坐标缓存:
dzh_diren_X0=diRen_X0;
dzh_diren_X1=diRen_X1;
dzh_diren_X2=diRen_X2;
dzh_diren_X3=diRen_X3;
dzh_diren_Y0 = diRen_Y0;
dzh_diren_Y1 = diRen_Y1;
dzh_diren_Y2 = diRen_Y2;
dzh_diren_Y3 = diRen_Y3;
// 第一个飞机
if (diRen_Y0>=0&&diRen_Y0<852) {
diRen_Y0+=5;
}else if (diRen_Y0>852) {
diRen_Y0 = 0;
diRen_X0 = diRen_X0*4;
}
// 第二个飞机
if (diRen_Y1>=0&&diRen_Y1<852) {
diRen_Y1+=6;
}else if (diRen_Y1>852) {
diRen_Y1 = 0;
diRen_X1 = diRen_X0+49;
}
// 第三个飞机
if (diRen_Y2>=0&&diRen_Y2<852) {
diRen_Y2+=11;
}else if (diRen_Y2>852) {
diRen_Y2 = 0;
diRen_X2 = diRen_X1+49;
}
// 第四个飞机
if (diRen_Y3>=0&&diRen_Y3<852) {
diRen_Y3+=8;
}else if (diRen_Y3>852) {
diRen_Y3 = 0;
diRen_X3 = diRen_X1+98;
}
}
// 打死
Rectangle DIRen0 = new Rectangle(diRen_X0,diRen_Y0,40,40);
Rectangle DIRen1 = new Rectangle(diRen_X1,diRen_Y1,40,40);
Rectangle DIRen2 = new Rectangle(diRen_X2,diRen_Y2,40,40);
Rectangle DIRen3 = new Rectangle(diRen_X3,diRen_Y3,40,40);
Rectangle ZiDan = new Rectangle(ziDan_KaishiWeiZhi_X,ziDan_KaishiWeiZhi_Y,8,14);
Rectangle Hreo = new Rectangle(feiJiWeiZhi_X,feiJiWeiZhi_Y,97,124);
//==========================================
// 子弹打中了敌人4
if (kaishi_zanting) {
if (DIRen3.intersects(ZiDan)) {
int i;
// 局部变量:获取子弹的位置
baozhahouzidan=true;
zidanjizhongdiren_3 = !zidanjizhongdiren_3;
int zidanxianzaiweizhi_X = feiJiWeiZhi_X;
for ( i = 0; i < 4; i++) {
diRen3 = "airplane"+feijibaozhanumber[i];
if (i==3) {
// 只需要不绘制就可以
diRen3 = null;
ziDan_KaishiWeiZhi_X=zidanxianzaiweizhi_X+46;
ziDan_KaishiWeiZhi_Y=723;
diRen_Y3 = 0;
break;}}}}
//==========================================
// 子弹打中了敌人1
if (kaishi_zanting) {
if (DIRen0.intersects(ZiDan)) {
int i;
// 局部变量:获取子弹的位置
baozhahouzidan=true;
zidanjizhongdiren_0 = !zidanjizhongdiren_0;
int zidanxianzaiweizhi_X = feiJiWeiZhi_X;
for ( i = 0; i < 4; i++) {
diRen0 = "airplane"+feijibaozhanumber[i];
if (i==3) {
diRen0 = null;
ziDan_KaishiWeiZhi_X=zidanxianzaiweizhi_X+46;
ziDan_KaishiWeiZhi_Y=723;
diRen_Y0 = 0;
break;
}}}}
// ============================
//==========================================
// 子弹打中了敌人2
if (kaishi_zanting) {
if (DIRen1.intersects(ZiDan)) {
int i;
// 局部变量:获取子弹的位置
baozhahouzidan=true;
zidanjizhongdiren_1 = !zidanjizhongdiren_1;
int zidanxianzaiweizhi_X = feiJiWeiZhi_X;
for ( i = 0; i < 4; i++) {
diRen1 = "airplane"+feijibaozhanumber[i];
if (i==3) {
diRen1 = null;
ziDan_KaishiWeiZhi_X=zidanxianzaiweizhi_X+46;
ziDan_KaishiWeiZhi_Y=723;
diRen_Y1 = 0;
break;
}}}}
// ============================
//==========================================
// 子弹打中了敌人3
if (kaishi_zanting) {
if (DIRen2.intersects(ZiDan)) {
int i;
// 局部变量:获取子弹的位置
baozhahouzidan=true;
zidanjizhongdiren_2 = !zidanjizhongdiren_2;
int zidanxianzaiweizhi_X = feiJiWeiZhi_X;
for ( i = 0; i < 4; i++) {
diRen2 = "airplane"+feijibaozhanumber[i];
if (i==3) {
diRen2 = null;
ziDan_KaishiWeiZhi_X=zidanxianzaiweizhi_X+46;
ziDan_KaishiWeiZhi_Y=723;
diRen_Y2 = 0;
break;
}}}}
// ============================
// 战机碰上了敌人
if (kaishi_zanting) {
if (Hreo.intersects(DIRen0)||Hreo.intersects(DIRen1)||Hreo.intersects(DIRen2)||Hreo.intersects(DIRen3)) {
gameBg = "gameover";
jianpanbukeyong = false;
break;
}
}
//
if (baozhahouzidan) {
if (ziDan_KaishiWeiZhi_Y <= 723 && ziDan_KaishiWeiZhi_Y>0) {
ziDan_KaishiWeiZhi_Y-=10;
}else if(ziDan_KaishiWeiZhi_Y<0){
ziDan_KaishiWeiZhi_Y=723;
ziDan_KaishiWeiZhi_Y-=10;
System.out.println("测试提醒:子弹已经返回原处");
}
if (diRen_Y3>=0&&diRen_Y3<852) {
diRen_Y3+=7;
}else if (diRen_Y3>852) {
diRen_Y3 = 0;
diRen_X3 = diRen_X1+98;
}
}
// ==================================
// 子弹击中3事件:
if (zidanjizhongdiren_3&&kaishi_zanting) {
if (diRen_Y0>=0&&diRen_Y0<852) {
diRen_Y0+=6;
}else if (diRen_Y0>852) {
diRen_Y0 = 0;
diRen_X0 = diRen_X0*4;
}
// 第二个飞机
if (diRen_Y1>=0&&diRen_Y1<852) {
diRen_Y1+=8;
}else if (diRen_Y1>852) {
diRen_Y1 = 0;
diRen_X1 = diRen_X0+49;
}
// 第三个飞机
if (diRen_Y2>=0&&diRen_Y2<852) {
diRen_Y2+=9;
}else if (diRen_Y2>852) {
diRen_Y2 = 0;
diRen_X2 = diRen_X1+49;
}
zidanjizhongdiren_3 = !zidanjizhongdiren_3;
}
//================================================
// zidanjizhongdiren_0 子弹击中敌人1
if (zidanjizhongdiren_0&&kaishi_zanting) {
if (diRen_Y3>=0&&diRen_Y3<852) {
diRen_Y3+=6;
}else if (diRen_Y3>852) {
diRen_Y3 = 0;
diRen_X3 = diRen_X3*4;
}
// 第二个飞机
if (diRen_Y1>=0&&diRen_Y1<852) {
diRen_Y1+=8;
}else if (diRen_Y1>852) {
diRen_Y1 = 0;
diRen_X1 = diRen_X0+49;
}
// 第三个飞机
if (diRen_Y2>=0&&diRen_Y2<852) {
diRen_Y2+=9;
}else if (diRen_Y2>852) {
diRen_Y2 = 0;
diRen_X2 = diRen_X1+49;
}
}
//===================================================
//================================================
// zidanjizhongdiren_1 子弹击中敌人2
if (zidanjizhongdiren_1&&kaishi_zanting) {
if (diRen_Y0>=0&&diRen_Y0<852) {
diRen_Y0+=6;
}else if (diRen_Y0>852) {
diRen_Y0 = 0;
diRen_X0 = diRen_X0*4;
}
// 第4个飞机
if (diRen_Y3>=0&&diRen_Y3<852) {
diRen_Y3+=8;
}else if (diRen_Y3>852) {
diRen_Y3 = 0;
diRen_X3 = diRen_X3+49;
}
// 第三个飞机
if (diRen_Y2>=0&&diRen_Y2<852) {
diRen_Y2+=9;
}else if (diRen_Y2>852) {
diRen_Y2 = 0;
diRen_X2 = diRen_X1+49;
}
}
//===================================================
//================================================
// zidanjizhongdiren_2 子弹击中敌人3
if (zidanjizhongdiren_2&&kaishi_zanting) {
if (diRen_Y0>=0&&diRen_Y0<852) {
diRen_Y0+=6;
}else if (diRen_Y0>852) {
diRen_Y0 = 0;
diRen_X0 = diRen_X0*4;
}
// 第二个飞机
if (diRen_Y1>=0&&diRen_Y1<852) {
diRen_Y1+=8;
}else if (diRen_Y1>852) {
diRen_Y1 = 0;
diRen_X1 = diRen_X0+49;
}
// 第4个飞机
if (diRen_Y3>=0&&diRen_Y3<852) {
diRen_Y3+=9;
}else if (diRen_Y3>852) {
diRen_Y3 = 0;
diRen_X3 = diRen_X3+49;
}
}
//===================================================
//================================================
// zidanjizhongdiren_0 子弹击中敌人4
//===================================================
ck.repaint();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
//main主方法 ,主类的“入口方法”
public static void main(String[] args)
{
new Game1();
}
}
好了,程序写完了,但是美中不足,缺了啥?对,缺了BGM,背景音乐,好了,上背景音乐的源码:
package com.fntp.mainFrame;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JApplet;
public class PlayMusic {
public static AudioClip loadSound(String filename) {
URL url = null;
try {
url = new URL("file:" + filename);
} catch (MalformedURLException e) {
}
return JApplet.newAudioClip(url);
}
public void play() {
AudioClip christmas = loadSound("music/bjmusic.mp3");
christmas.loop();
christmas.play();
}
}
(这块也很简单,我就不过多赘述了,大家看代码就好了)
除此之外,我给大家提供一个另一种,面向对象的写法:
给大家提供一个面向对象的写法,并且给出面向对象的
附带面向对象版下载链接:
点击此处下载面向对象版本的飞机大战(半成品)