欢迎光临散文网 会员登陆 & 注册

Java原创创意,自制素材,加音效坦克大战,原创up主游戏,较完整简单版2【诗书画唱】

2020-09-25 08:47 作者:诗书画唱  | 我要投稿

含部分自己写的注释,让你更容易看懂代码!求三连关注!制作不易!

package img;


import java.awt.image.BufferedImage;

import java.io.File;


import javax.imageio.ImageIO;


public class img {

// 如果文件在别的文件夹里,就把别的文件夹的名字

// 写在下面的英文的双引号""里面

private static final String RESOURCE_PATH = "";


/** 读取图片 */

public static BufferedImage loadImage(String fileName) {

try {

// 同包之内的图片读取

BufferedImage img = ImageIO.read

(new File(RESOURCE_PATH+fileName));

return img;

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException();

}

}

}

package mains;



import img.img;


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.util.Arrays;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;


import javax.swing.JFrame;

import javax.swing.JPanel;


import duiXiang.*;



/**

 * 主函数的类:

 */

public class mains extends JPanel {


private static final long serialVersionUID 

= 2547093170915849250L;

// 下面设置一个可以全局通过"mains.quanJvWidth"等就可调用的宽度:

public static final int quanJvWidth = 400;

// 下面设置一个可以全局通过"mains.quanJvHeigh"等就可调用的高度:

public static final int quanJvHeight = 700;


/*

* 鼠标点击事件:

* 开始--运行   结束---开始

* 鼠标移动事件:

* 启动状态:结束----启动

* 暂停状态:鼠标从屏幕里划到外

* 运行状态:从外到内的时候

* 结束状态:英雄机的生命为0

*/

// 开始状态

public static final int START = 0;

public static BufferedImage start;

// 运行状态

public static final int RUNNING = 1;

// 暂停状体

public static final int PAUSE = 2;

public static BufferedImage pause;

// 结束状态

public static final int GAME_OVER = 3;

public static BufferedImage gameover;

//默认状态

public int state = START;


//静态代码块

static{

start = img.loadImage("开始的图片.png");

pause = img.loadImage("时间静止之术.png");

gameover = img.loadImage("没电了.png");

}


private 背景 sky = new 背景();

private lex hero = new lex();

private duiXiangFuLeiFangFa[] duiXiangArray = {};

private 闪电[] bullets = {};


/**

* 随机数产生目标对象

* @return 目标对象

*/

public duiXiangFuLeiFangFa nextOne() {

Random rand = new Random();

int type = rand.nextInt(20);

if (type < 15) {

return new 封茗囧茵();

} else if (type < 18) {

return new Warma();

} else {

return new 双笙();

}

}


/** 实现敌人入场 */

int enterIndex = 0;

public void enterAction() {

enterIndex++;

if (enterIndex % 40 == 0) {

// 获取到敌人:

duiXiangFuLeiFangFa f = nextOne();

// 敌人添加到数组的最后一位上:

duiXiangArray = Arrays.copyOf

(duiXiangArray, duiXiangArray.length + 1);

duiXiangArray[duiXiangArray.length - 1] = f;

}

}


/** 子弹入场 */

int shootIndex = 0;

public void shootAction() {

shootIndex++;

if (shootIndex % 40 == 0) {

闪电[] bs = hero.shoot();// 获取子弹数组

bullets = Arrays.copyOf(bullets, bullets.length + bs.length);

// 将产生的子弹数组放到源数组中的最后一个元素

System.arraycopy(bs, 0, bullets, bullets.length - bs.length,

bs.length);

}

}


// 对象移动方法:

public void duiXiangYiDongFangFa() {

sky.yiDongFangFa();

for (int i = 0; i < duiXiangArray.length; i++) {

duiXiangArray[i].yiDongFangFa();

}

for (int i = 0; i < bullets.length; i++) {

bullets[i].yiDongFangFa();

}

}


/**删除移除越过页面边界的飞行物:*/

public void outOfBoundsAction(){

int index = 0;//存放不越界数组的下标,个数

//新建不越界的敌人数组

duiXiangFuLeiFangFa[] flysLive = new 

duiXiangFuLeiFangFa

[duiXiangArray.length];

for (int i = 0; i < duiXiangArray.length; i++) {

//获取到每一个敌人

duiXiangFuLeiFangFa f = duiXiangArray[i];

//判断敌人是否不越界

if (!f.outOfBounds()) {//如果不越界,

flysLive[index] = f;

index++;

}

//将不越界的敌人存放到不越界的数组中

}

duiXiangArray = Arrays.copyOf(flysLive, index);

//System.out.println("index == " + index);

index = 0;

闪电[] bulletLive = new 闪电[bullets.length];

for (int i = 0; i < bullets.length; i++) {

闪电 b = bullets[i];

if (!b.outOfBounds()) {

bulletLive[index] = b;

index++;

}

}

bullets = Arrays.copyOf(bulletLive, index);

}


/**闪电与敌人的碰撞*/

int score = 0;//玩家的得分记录

public void bulletBangAction(){



for (int i = 0; i < bullets.length; i++) {


闪电 b = bullets[i];

//遍历所有的敌人

for (int j = 0; j < duiXiangArray.length; 

j++) {

//获取每一个敌人

duiXiangFuLeiFangFa f = duiXiangArray[j];

//判断碰撞

if (f.panDuanLife() && b.panDuanLife() 

&& f.hit(b)) {

f.goDead();//敌人over

b.goDead();//子弹over


if (f instanceof diRen) {

//如果撞上的是敌人,能得分

diRen e = (diRen)f;

score += e.getScoreFangFa();

}

//如果撞上的是奖励:

if (f instanceof jiangLi) {

jiangLi a = (jiangLi)f;

int type = a.getAwardType();

System.out.println(type);

switch (type) {

case 0://火力

hero.addDoubleFire();

break;

case 1://生命

hero.addLife();

break;

}

}

}

}

}

}



public void heroBangAction(){


for (int i = 0; i < duiXiangArray.length; i++) {

//获取每一个敌人

duiXiangFuLeiFangFa f = duiXiangArray[i];

if (hero.panDuanLife() && f.panDuanLife()

&& f.hit(hero)) {

f.goDead();

new Thread(new shengyin( "hit.wav")).start() ;

hero.substractLife();//减少生命

hero.clearDoubleFire();//清空火力

}

}

}


/**检测游戏是否结束*/

public void checkGameOverAction(){

//判断LEX的电力值,

//如果小于0的话,游戏结束,修改状态

if(hero.getLife() <= 0){

state = GAME_OVER;

}

}


/** 测试方法 */

public void action() {// 数组越界、数组空指针异常

//鼠标适配器

MouseAdapter mouseAdapter = new MouseAdapter() {

/**重写鼠标的移动事件*/

public void mouseMoved(MouseEvent e){

int x = e.getX();

int y = e.getY();

hero.movedTo(x, y);

}


/**重写鼠标的点击事件*/

@Override

public void mouseClicked(MouseEvent e) {

//根据当前状态的不同,进行相应的处理

new Thread(new shengyin( "start.wav"))

.start() ;

switch (state) {

case START:

state = RUNNING;

break;

case GAME_OVER:

score = 0;

sky = new 背景();

hero = new lex();

duiXiangArray = new 

duiXiangFuLeiFangFa[0];

bullets = new 闪电[0];

state = START;//修改状态为开始状态

break;

}

}

/**重写鼠标的移入事件*/

@Override

public void mouseEntered(MouseEvent e) {

if (state == PAUSE) {

state = RUNNING;

}

}

/**重写鼠标的移出事件*/

@Override

public void mouseExited(MouseEvent e) {

if (state == RUNNING) {

state = PAUSE;

}

}

};

this.addMouseListener(mouseAdapter);

//处理鼠标的操作事件

this.addMouseMotionListener(mouseAdapter);

//处理鼠标的移动事件

// 定时器对象

Timer timer = new Timer();

int inters = 10;

timer.schedule(new TimerTask() {

@Override

public void run() {

if (state == RUNNING) {

enterAction();// 敌人入场

shootAction();// 子弹入场

duiXiangYiDongFangFa();// 飞行物移动

outOfBoundsAction();//删除越界的飞行物

bulletBangAction();//闪电与敌人的碰撞

heroBangAction();//LEX与敌人发生碰撞

checkGameOverAction();//检测游戏是都结束

}

repaint();// 重绘,调用paint方法

}

}, inters, inters);// 计划任务

/* 7.30 20 第一次 10 第一次---第二次

*/

}


/** 画对象 */

@Override

public void paint(Graphics g) {

super.paint(g);

// g.setColor(Color.blue);(这里没效果)

// g.fill3DRect(0, 0, 10, 10,true);(这里没效果)

sky.paintObjectDuiXiangFangFa(g);


hero.paintObjectDuiXiangFangFa(g);

// 画敌人

for (int i = 0; i < duiXiangArray.length; i++) {

duiXiangArray[i].paintObjectDuiXiangFangFa(g);

}

for (int i = 0; i < bullets.length; i++) {

bullets[i].paintObjectDuiXiangFangFa(g);

}

g.setColor(Color.red);

g.setFont(new Font("微软雅黑",Font.BOLD,20));

g.drawString("分数:" + score, 20, 60);

g.setColor(Color.blue);

g.setFont(new Font("楷体",Font.BOLD,20));

g.drawString("电力值:" + hero.getLife()+"千瓦",

20, 80);


switch (state) {//根据不同状态画不同的状态图

case START://开始状态的启动图

g.drawImage(start, 0, 0, null);

break;

case PAUSE://暂停状态的图

g.drawImage(pause, 0, 0, null);

break;

case GAME_OVER://游戏结束的时候状态图

g.drawImage(gameover, 0, 0, null);

break;

}

}


/**在 主函数里实例化这个文件的本身的mains类,

* 之后实例化JFrame类,把mains类添加到JFrame类里,

* 再去设置JFrame的大小等。

* 也可用mains类继承JFrame类的方法*/

public static void main(String[] args) {

mains mainsClass = new mains();

JFrame JFrame = new JFrame();

JFrame.add(mainsClass);// 将画布装在窗体上

// JFrame.setSize(quanJvWidth, quanJvHeight);

// (也可以这样写,有效果)

// JFrame.setBackground(Color.blue);(这里没效果)

JFrame.setSize(400,720);// 窗体的大小


JFrame.setDefaultCloseOperation

(JFrame.EXIT_ON_CLOSE);

JFrame.setLocationRelativeTo(null);// 居中显示

JFrame.setVisible(true);

mainsClass.action();

}


}



Java原创创意,自制素材,加音效坦克大战,原创up主游戏,较完整简单版2【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律