实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.tarena.fly;
import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
/***主程序**/
public class ShootGame extends JPanel{//窗口类JPanel,软件自带
public static final int WIDTH=525;//常量用大写//窗口的宽
public static final int HEIGHT=600;//窗口的高
/** 游戏的当前状态: START RUNNING PAUSE GAME_OVER */
private int state;
private static final int START = 0;
private static final int RUNNING = 1;
private static final int PAUSE = 2;
private static final int GAME_OVER = 3;
public static BufferedImage background;//背景图
public static BufferedImage start;//启动图
public static BufferedImage pause;//暂停图
public static BufferedImage gameover;//敌机图
public static BufferedImage bigAirplane;//敌机图
public static BufferedImage airplane;//小蜜蜂图
public static BufferedImage bee;//子弹图
public static BufferedImage hero0;//英雄机
public static BufferedImage hero1;//英雄机
public static BufferedImage bullet;
private Hero hero=new Hero();//英雄机对象
private BigAirplane b =new BigAirplane();
private FlyingObject[] flyings={};//敌人
private Bullet[] bullets={};//子弹数组
private Bullet1[] bullets1={};//子弹数组
static{//初始化静态资源 图片
try{
background=ImageIO.read(ShootGame.class.getResource("background.png"));
bigAirplane=ImageIO.read(ShootGame.class.getResource("bigAirplane.png"));
start=ImageIO.read(ShootGame.class.getResource("start.png"));
pause=ImageIO.read(ShootGame.class.getResource("pause.png"));
gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));
airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));
bee=ImageIO.read(ShootGame.class.getResource("bee.png"));
hero0=ImageIO.read(ShootGame.class.getResource("hero1.png"));
hero1=ImageIO.read(ShootGame.class.getResource("hero0.png"));
bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));
}catch(Exception e){
e.printStackTrace();
}
}
private Timer timer;//定时器
private int intervel=10;//定时器的时间间隔(以毫秒为单位)
/****随机生成敌人(敌机 小蜜蜂)***/
public static FlyingObject nextOne(){
Random rand=new Random();
int type=rand.nextInt(20);
if(type==0){
return new Bee();//随机为0时返回蜜蜂
}
if(type==1){
return new BigAirplane();
}
else{
return new Airplane();//随机为1――――19时返回敌机
}
}
/***敌人入场**/
int fkyEnteredUbdex=0;//敌人入场的计数
public void enterAction(){//10毫秒走一次
fkyEnteredUbdex ;//10毫秒增1
if(fkyEnteredUbdex%40==0){//没400毫秒走一次(10*40)
FlyingObject one=nextOne();//获取敌人随机对象
flyings=Arrays.copyOf(flyings,flyings.length 1);//扩容
flyings[flyings.length-1]=one;//存到最后一个元素
}
}
public void stepAction(){//10毫秒走一次
hero.step();
for(int i=0;i<flyings.length;i ){
flyings[i].step();
}
for(int i=0;i<bullets.length;i ){
bullets[i].step();
}
for(int i=0;i<bullets1.length;i ){
bullets1[i].step();
}
}
/** 画游戏状态 */
public void paintState(Graphics g) {
switch (state) {
case START: // 启动状态
g.drawImage(start, 60, 0, null);
break;
case PAUSE: // 暂停状态
g.drawImage(pause, 60, 0, null);
break;
case GAME_OVER: // 游戏终止状态
g.drawImage(gameover, 60, 0, null);
break;
}
}
int shootIndex=0;
public void shootAction(){//10毫秒走一次
shootIndex ;
if(shootIndex%20==0){//每300(10*30)毫秒走一次
Bullet[] bs=hero.shoot();//获取英雄机发射的子弹
bullets =Arrays.copyOf(bullets,bullets.length bs.length);
System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);
}
if(shootIndex%30==0){//每300(10*30)毫秒走一次
for(int i=0;i<flyings.length;i ){
Bullet1[] bs1=flyings[i].shoot1();
bullets1 =Arrays.copyOf(bullets1,bullets1.length bs1.length);
System.arraycopy(bs1,0,bullets1,bullets1.length-bs1.length,bs1.length);
}
}
}
/***一个子弹与所有敌人撞****/
public void bangAction(){
for(int i=0;i<bullets.length;i ){
bang(bullets[i]);//一个子弹与所有敌人撞
}
}
/** 画分数 */
public void paintScore(Graphics g) {
int x = 10; // x坐标
int y = 25; // y坐标
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 22); // 字体
g.setColor(new Color(0xFF0000));
g.setFont(font); // 设置字体
g.drawString("SCORE:" score, x, y); // 画分数
y = 20; // y坐标增20
g.drawString("LIFE:" hero.getLife(), x, y); // 画命
}
/** 检查游戏结束 */
public void checkGameOverAction() {
if (isGameOver()) {
state = GAME_OVER; // 改变状态
}
}
/** 检查游戏是否结束 */
public 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); // 删除碰上的飞行物
}
}
return hero.getLife() <= 0;
}
private int score=0;//声明
/** 子弹和飞行物之间的碰撞检查 */
public 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; // 记录被击中的飞行物的索引
break;
}
}
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(); // 加分
} else 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;
}
}
}
}
/** 删除越界飞行物及子弹 */
public void outOfBoundsAction() {
int index = 0; // 索引
FlyingObject[] flyingLives = new FlyingObject[flyings.length]; // 活着的飞行物
for (int i = 0; i < flyings.length; i ) {
FlyingObject f = flyings[i];
if (!f.outOfBounds()) {
flyingLives[index ] = f; // 不越界的留着
}
}
flyings = Arrays.copyOf(flyingLives, index); // 将不越界的飞行物都留着
index = 0; // 索引重置为0
Bullet[] bulletLives = new Bullet[bullets.length];
for (int i = 0; i < bullets.length; i ) {
Bullet b = bullets[i];
if (!b.outOfBounds()) {
bulletLives[index ] = b;
}
}
bullets = Arrays.copyOf(bulletLives, index); // 将不越界的子弹留着
}
/***启动执行***/
public void action(){
MouseAdapter l = new MouseAdapter(){
public void mouseMoved(MouseEvent e){// 鼠标移动
int x=e.getX();
int y=e.getY();
hero.moveTo(x,y);
}
public void mouseEntered(MouseEvent e) { // 鼠标进入
if (state == PAUSE) { // 暂停状态下运行
state = RUNNING;
}
}
@Override
public void mouseExited(MouseEvent e) { // 鼠标退出
if (state == RUNNING) { // 游戏未结束,则设置其为暂停
state = PAUSE;
}
}
@Override
public void mouseClicked(MouseEvent 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;
}
}
};
this.addMouseListener(l);//处理鼠标操作事件
this.addMouseMotionListener(l);//处理鼠标滑动事件
timer=new Timer();//创建定时器的对象
timer.schedule(new TimerTask(){
public void run(){//定时干的事,10毫秒走一次
if(state==RUNNING){
enterAction();//敌人(敌机 小蜜蜂)10毫米走一次
stepAction();//移动步数
shootAction();//子弹入场(英雄机发射子弹)
bangAction();//子弹与敌人碰撞
isGameOver();//英雄机碰撞判断
checkGameOverAction(); //检查游戏结束
outOfBoundsAction();//删除越界飞行物及子弹
}
repaint();//重绘(调用paint方法)
}
},intervel,intervel);//时间间隔
}
public void paint(Graphics g){
g.drawImage(background,0,0,null);//背景图与窗口重合
paintHero(g);//画英雄机对象
paintFlyingobjects(g);//画敌人
paintBullets(g);//画小蜜蜂
paintBullets1(g);//画小蜜蜂
paintScore(g);//画分和画命
paintState(g); // 画游戏状态
}
public void paintHero(Graphics g){
g.drawImage(hero.image,hero.x,hero.y,null);
}
public void paintFlyingobjects(Graphics g){
for(int i=0;i<flyings.length;i ){
FlyingObject f=flyings[i];
g.drawImage(f.image,f.x,f.y,null);
}
}
public void paintBullets(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 paintBullets1(Graphics g){
for(int i=0;i<bullets1.length;i ){
Bullet1 b=bullets1[i];
g.drawImage(b.image,b.x,b.y,null);
}
}
public static void main(String[] args) {
JFrame frame=new JFrame("FLY");//窗口对象
ShootGame game=new ShootGame();//面板
frame.add(game);//将面板添加到窗口之中
frame.setSize(WIDTH,HEIGHT);//设置窗口大小
frame.setAlwaysOnTop(true);//设置窗口一直在前面,居上
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作――――关闭窗口时的操作
frame.setLocationRelativeTo(null);//设置相对位置为null,即居中
frame.setVisible(true);//1.设置窗口可见 2.尽快调用paint()方法
game.action();//启动执行
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论