Java设计模式之外观模式示例详解
284
2022-07-31
目录整体思路代码实现英雄战机类敌机类子弹类图片工具类游戏窗体类启动游戏类运行效果图
本文实例为大家分享了java实现简易飞机大战的具体代码,供大家参考,具体内容如下
整体思路
1.创建游戏窗体,添加面板JPanel,重写JPanel中的paint方法,遍历所有飞机和子弹绘制,用定时器进行重绘,实现动画效果2.添加敌机和发射子弹用的是多线程3.碰撞检测采用的是矩形类Rectangle中的intersects方法
代码实现
用手机查看代码好像只显示62行
英雄战机类
package com.cml.model;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import com.cml.util.ImageUtil;
public class Hero {
private int x, y;// 坐标
private int width, height; //宽高
private Image heroImage; // 图片
private boolean isAlive = true;
private ArrayList
public Hero() {
this.x = 180;
this.y = 600;
this.heroImage = ImageUtil.hero;
width = heroImage.getWidth(null);
height = heroImage.getHeight(null);
initBullets();
}
private void initBullets() {
//用线程发射子弹
new Thread() {
@Override
public void run() {
while (isAlive) {
bullets.add(new Bullet(Hero.this));
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
public Hero(int x, int y, Image heroImage) {
super();
this.x = x;
this.y = y;
this.heroImage = heroImage;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Image getHeroImage() {
return heroImage;
}
public void setHeroImage(Image heroImage) {
this.heroImage = heroImage;
}
//绘制英雄战机
public void paint(Graphics g) {
if (!isAlive) {
heroImage = ImageUtil.hero_destory;
}
g.drawImage(heroImage, x, y, null);
for (int i = 0; i < bullets.size(); i++) {
Bullet bullet = bullets.get(i);
if (bullet.getY() < 0) {
bullets.remove(bullet);
}
bullet.paint(g);
}
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//鼠标拖拽移动
public void mouseDragged(MouseEvent e) {
if (isAlive) {
int x0 = e.getX();
int y0 = e.getY();
if (isInScopePanel(x0, y0)) {
if (isInScopeImageWidth(x0) && isInScopeImageheigth(y0)) {
this.x = x0 - width / 2;
this.y = y0 - height / 2;
}
} else {
if (isInScopeImageWidth(x0)) {
this.x = x0 - width / 2;
}
if (isInScopeImageheigth(y0)) {
this.y = y0 - height / 2;
}
}
}
}
private boolean isInScopePanel(int x0, int y0) {
if (x0 > 10 && x0 < 460 && y0 > 140 && y0 < 730) {
return true;
}
return false;
}
private boolean isInScopeImageheigth(int y0) {
if (y0 >= y && y0 <= y + height) {
if (y0 > 140 && y0 < 730) {
return true;
}
}
return false;
}
private boolean isInScopeImageWidth(int x0) {
if (x0 >= x && x0<= x + width) {
if (x0 > 10 && x0 < 460) {
return true;
}
}
return false;
}
public ArrayList
return bullets;
}
public void setAlive(boolean isAlive) {
this.isAlive = isAlive;
}
public boolean isAlive() {
return isAlive;
}
}
敌机类
package com.cml.model;
import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;
import com.cml.util.ImageUtil;
public class Enemy {
private Random random = new Random();
private int x, y;// 坐标
private int width, height; // 宽高
private boolean isAlive = true;
private static final int SPEED = 4;
private Image enemyImage; // 图片
public Enemy() {
RandomEnemyXY();
enemyImage = ImageUtil.enemy;
width = enemyImage.getWidth(null);
height = enemyImage.getHeight(null);
}
private void RandomEnemyXY() {
x = random.nextInt(430);
y = 0;
}
public void paint(Graphics g) {
if (!isAlive) {
enemyImage = ImageUtil.bomb;
}
g.drawImage(enemyImage, x, y, null);
move();
}
public boolean isAlive() {
return isAlive;
}
public void setAlive(boolean isAlive) {
this.isAlive = isAlive;
}
private void move() {
if (isAlive) {
y += SPEED;
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
子弹类
package com.cml.model;
import java.awt.Graphics;
import java.awt.Image;
import com.cml.util.ImageUtil;
public class Bullet {
private int x, y;// 坐标
private int width, height; // 宽高
private static final int SPEED = 10; // 速度
private Image bulletImage; // 图片
public Bullet(Hero hero) {
bulletImage = ImageUtil.bullet;
width = bulletImage.getWidth(null);
height = bulletImage.getHeight(null);
this.x = hero.getX() + hero.getWidth() / 2 - width / 2;
this.y = hero.getY();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public void paint(Graphics g) {
g.drawImage(bulletImage, x, y, null);
move();
}
private void move() {
y -= SPEED;
}
}
图片工具类
package com.cml.util;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageUtil {
public static BufferedImage hero;
public static BufferedImage enemy;
public static BufferedImage bullet;
public static BufferedImage bg;
public static BufferedImage bomb;
public static BufferedImage hero_destory;
public static BufferedImage login;
static {
try {
hero = ImageIO.read(ImageUtil.class.getResource("/img/hero.png"));
enemy = ImageIO.read(ImageUtil.class.getResource("/img/enemy.png"));
bullet = ImageIO.read(ImageUtil.class.getResource("/img/bullet.png"));
bg = ImageIO.read(ImageUtil.class.getResource("/img/bg.png"));
bomb = ImageIO.read(ImageUtil.class.getResource("/img/bomb.png"));
hero_destory = ImageIO.read(ImageUtil.class.getResource("/img/hero_destory.png"));
// login = ImageIO.read(new File("img/login.png"));
} cpenzPatch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
游戏窗体类
package com.cml.frame;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.cml.model.Bullet;
import com.cml.model.Enemy;
import com.cml.model.Hero;
import com.cml.util.ImageUpenzPtil;
import com.sun.java.swing.plaf.windows.resources.windows;
public class GameFrame extends JFrame {
private JPanel gamePanel;
private Hero hero;
private ArrayList
private ArrayList
private Timer timer;
public GameFrame() {
// 初始化游戏窗体
initGameFrame();
// 初始化英雄战机
initHero();
// 初始化游戏面板
initGamePanel();
// 初始化定时器
initTimer();
// 初始化敌军战机
initEnemies();
}
private void initEnemies() {
new Thread() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
enemies.add(new Enemy());
}
}
}.start();
}
private void initTimer() {
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
gamePanel.repaint();
}
};
timer.scheduleAtFixedRate(task, 0, 20);
}
private void initHero() {
hero = new Hero();
hero_bullet = hero.getBullets();
}
private void initGameFrame() {
setTitle("打飞机");
setSize(480, 800);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
}
private void initGamePanel() {
gamePanel = new JPanel() {
private int score = 0;
/**
* 判断敌机与子弹相撞
* @param enemy
* @param bullet
* @return
*/
public boolean isHit(Enemy enemy, Bullet bullet) {
Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
Rectangle r2 = new Rectangle(bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight());
return r1.intersects(r2);
}
/**
* 判断英雄战机与敌机相撞
* @param enemy
* @param hero
* @return
*/
public boolean isHithttp://(Enemy enemy, Hero hero) {
Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
Rectangle r2 = new Rectangle(hero.getX() + hero.getWidth() / 3, hero.getY() + hero.getHeight() / 3,
hero.getWidth() / 3, hero.getHeight() / 3);
return r1.intersects(r2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(ImageUtil.bg, 0, 0, 480, 800, null);
for (int i = 0; i < enemies.size(); i++) {
Enemy enemy = enemies.get(i);
for (int j = 0; j < hero_bullet.size(); j++) {
Bullet bullet = hero_bullet.get(j);
if (isHit(enemy, bullet) && enemy.isAlive()) {
enemy.setAlive(false);
hero_bullet.remove(bullet);
new Thread() {
public void run() {
score += 10;
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
enemies.remove(enemy);
};
}.start();
break;
}
}
if (isHit(enemy, hero)) {
timer.cancel();
hero.setAlive(false);
enemy.setAlive(false);
JOptionPane.showMessageDialog(this, "游戏结束,您的得分是:" + score);
System.exit(0);
}
if (enemy.getY() > 800) {
enemies.remove(enemy);
}
enemy.paint(g);
}
if (hero != null) {
hero.paint(g);
}
g.setFont(new Font("宋体", Font.BOLD, 24));
g.drawString("得分:" + score, 350, 30);
}
};
add(gamePanel);
// 设置拖拽监听事件
gamePanel.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (hero != null) {
hero.mouseDragged(e);
}
}
});
}
}
启动游戏类
package com.cml.main;
import com.cml.frame.GameFrame;
public class Start {
public static void main(String[] args) {
/**
* 初始化窗体
*/
new GameFrame().setVisible(true);
}
}
运行效果图
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~