利用JavaSE编写简单的小游戏—飞机大战
- 运行效果:
- 项目结构:
- Background类
package com.lhd.base;
import com.lhd.util.ImageUtils;
import java.awt.*;
public class Background extends Sprite {
private Image image = ImageUtils.get("bg1");
public Background() {
init();
}
private void init() {
image = ImageUtils.get("bg1");
setX(0);
setY(0);
setWidth(image.getWidth(null));
setHeight(image.getHeight(null));
}
@Override
public void draw(Graphics g) {
move();
g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
}
@Override
public void move() {
this.setY(getY()-2);
outOfBounds();
}
//边缘判断
public void outOfBounds(){
if(getY()<=Constant.FRAME_HEIGHT-getHeight() ){
setY(0);
}
}
}
- Constant 类
package com.lhd.base;
public class Constant {
public static final int FRAME_WIDTH = 600;
public static final int FRAME_HEIGHT = 800;
public static PlaneFrame PLANE_FRAME;
}
- EnemyPlane 类
package com.lhd.base;
import com.lhd.util.ImageUtils;
import java.awt.*;
public class EnemyPlane extends Sprite {
private Image image;
private int speed = 2;
public EnemyPlane(int x, int y) {
init(x, y);
}
public void init(int x, int y) {
image = ImageUtils.get("my1");
setX(x);
setY(y);
setWidth(image.getWidth(null));
setHeight(image.getHeight(null));
}
@Override
public void draw(Graphics g) {
move();
g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
}
@Override
public void move() {
setY(getY() + speed);
if (getY() >= Constant.FRAME_HEIGHT) {
Constant.PLANE_FRAME.enemyPlaneList.remove(this);
}
}
}
- Explode 类
package com.lhd.base;
import com.lhd.util.ImageUtils;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class Explode extends Sprite {
private List<Image> imageList = new ArrayList<>();
private double index;
public Explode(int x, int y) {
init(x, y);
}
private void init(int x, int y) {
imageList.add(ImageUtils.get("e1"));
imageList.add(ImageUtils.get("e2"));
imageList.add(ImageUtils.get("e3"));
imageList.add(ImageUtils.get("e4"));
// imageList.add(ImageUtils.get(""));
// imageList.add(ImageUtils.get(""));
setX(x);
setY(y);
setWidth(ImageUtils.get("e1").getWidth(null));
setHeight(ImageUtils.get("e1").getHeight(null));
}
@Override
public void draw(Graphics g) {
index += 0.2;
if (index >= 2) {
Constant.PLANE_FRAME.explodes.remove(this);
return;
}
g.drawImage(imageList.get((int) Math.floor(index)), getX(), getY(), getWidth(), getHeight(), null);
}
}
- MyBullet 类
package com.lhd.base;
import com.lhd.util.ImageUtils;
import com.sun.xml.internal.ws.api.pipe.ClientPipeAssemblerContext;
import javafx.scene.shape.ClosePathBuilder;
import java.awt.*;
import java.util.List;
public class MyBullet extends Sprite {
Image image;
public MyBullet(int x,int y) {
init(x,y);
}
public void init(int x,int y) {
image = ImageUtils.get("myb1");
setX(x);
setY(y);
setWidth(image.getWidth(null));
setHeight(image.getHeight(null));
}
//
@Override
public void draw(Graphics g) {
move();
outOfBounds();
g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
}
public void outOfBounds(){
if(getY()<0-getHeight()){
//从集合中移除自己
Constant.PLANE_FRAME.myBulletList.remove(this);
}
}
@Override
public void move() {
setY(getY()-10);
}
public void collisionDetection(List<EnemyPlane > enemyPlaneList){
for (EnemyPlane enemyPlane : enemyPlaneList) {
if (this.creatRectangle().intersects(enemyPlane.creatRectangle())){
Constant.PLANE_FRAME.myBulletList.remove(this);
Constant.PLANE_FRAME.enemyPlaneList.remove(enemyPlane);
Constant.PLANE_FRAME.explodes.add(new Explode(enemyPlane.getX(),enemyPlane.getY()));
Constant.PLANE_FRAME.score++;
}
}
}
}
- Plane 类
package com.lhd.base;
import com.lhd.util.ImageUtils;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.List;
public class Plane extends Sprite {
private Image image;
private boolean up, right, down, left, fire;
private int fireFrequency ;
private int speed = 5;
public Plane() {
init();
}
public void init() {
image = ImageUtils.get("my1");
setX(Constant.FRAME_WIDTH / 2 - image.getWidth(null) / 2);
setY(Constant.FRAME_HEIGHT - image.getHeight(null));
setWidth(image.getWidth(null));
setHeight(image.getHeight(null));
}
@Override
public void draw(Graphics g) {
move();
outOfBounds();
g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
attack();
fireFrequency++;
}
public void attack() {
if (fire && fireFrequency >= 10) {
Constant.PLANE_FRAME.myBulletList.add(new MyBullet(getX() + getWidth() / 2 - (ImageUtils.get("myb1").getWidth(null) / 2),
getY() - ImageUtils.get("myb1").getHeight(null)));
fireFrequency = 0;
}
}
public void outOfBounds() {
if (getY() < 30) {
setY(30);
}
if (getY() >= Constant.FRAME_HEIGHT - getHeight()) {
setY(Constant.FRAME_HEIGHT - getHeight());
}
if (getX() < 0) {
setX(0);
}
if (getX() >= Constant.FRAME_WIDTH - getWidth()) {
setX(Constant.FRAME_WIDTH - getWidth());
}
}
public void move() {
if (up) {
setY(getY() - speed);
}
if (right) {
setX(getX() + speed);
}
if (down) {
setY(getY() + speed);
}
if (left) {
setX(getX() - speed);
}
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W) {
up = true;
}
if (e.getKeyCode() == KeyEvent.VK_D) {
right = true;
}
if (e.getKeyCode() == KeyEvent.VK_S) {
down = true;
}
if (e.getKeyCode() == KeyEvent.VK_A) {
left = true;
}
if (e.getKeyCode() == KeyEvent.VK_J) {
fire = true;
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W) {
up = false;
}
if (e.getKeyCode() == KeyEvent.VK_D) {
right = false;
}
if (e.getKeyCode() == KeyEvent.VK_S) {
down = false;
}
if (e.getKeyCode() == KeyEvent.VK_A) {
left = false;
}
if (e.getKeyCode() == KeyEvent.VK_J) {
fire = false;
}
}
}
- PlaneFrame 类
package com.lhd.base;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
public class PlaneFrame extends Frame {
Random random = new Random();
public PlaneFrame() {
this.init();
}
private void init() {
setSize(Constant.FRAME_WIDTH, Constant.FRAME_HEIGHT);
//设置居中
setLocationRelativeTo(null);
//屏蔽输入法
enableInputMethods(false);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//设置显示
setVisible(true);
new Thread() {
@Override
public void run() {
while (true) {
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
plane.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
plane.keyReleased(e);
}
});
//初始化敌机
enemyPlaneList.add(new EnemyPlane(0,0));
enemyPlaneList.add(new EnemyPlane(200,0));
enemyPlaneList.add(new EnemyPlane(400,0));
}
Background background = new Background();
Plane plane = new Plane();
// MyBullet myBullet = new MyBullet(100,100);
List<MyBullet> myBulletList = new CopyOnWriteArrayList<>();
//EnemyPlane enemyPlane = new EnemyPlane(300,300);
public List<EnemyPlane> enemyPlaneList = new CopyOnWriteArrayList<>();
public List<Explode> explodes = new CopyOnWriteArrayList<>();
// Explode explode = new Explode(100,100);
int score;
//绘制
@Override
public void paint(Graphics g) {
background.draw(g);
plane.draw(g);
for (MyBullet myBullet : myBulletList) {
myBullet.draw(g);
myBullet.collisionDetection(enemyPlaneList);
}
// myBullet.draw(g);
for (EnemyPlane enemyPlane : enemyPlaneList) {
enemyPlane.draw(g);
}
// explode.draw(g);
for (Explode explode : explodes) {
explode.draw(g);
}
// //碰撞检测
// for (EnemyPlane enemyPlane : enemyPlaneList) {
// for (MyBullet myBullet : myBulletList) {
// if(enemyPlane.creatRectangle().intersects(myBullet.creatRectangle()));
// enemyPlaneList.remove(enemyPlane);
// myBulletList.remove(myBullet);
// }
// }
if (enemyPlaneList.size()<=2){
int count = random.nextInt(3)+3;
for (int i = 0; i < count; i++) {
enemyPlaneList.add(new EnemyPlane(random.nextInt(400),random.nextInt(300)-300));
}
}
g.setColor(Color.red);
g.setFont(new Font("黑体",Font.BOLD,36));
g.drawString("分数:"+score,100,100);
//
}
//双缓冲,解决画面闪烁
Image offScreenImage = null;
@Override
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(600, 800);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.WHITE);
gOffScreen.fillRect(0, 0, 600, 800);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
}
- Sprite 类
package com.lhd.base;
import java.awt.*;
//抽象类所有元素的基类
public abstract class Sprite {
private int x;
private int y;
private int width;
private int height;
public abstract void draw(Graphics g);
public void move() {
}
public Rectangle creatRectangle(){
return new Rectangle(x,y,width,height);
}
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;
}
}
- ImageUtils 工具类
package com.lhd.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ImageUtils {
private static Map<String,Image> imageMap = new HashMap<>();
static {
imageMap.put("bg1",readImage("com/lhd/img/bg/bj1.jpg"));
imageMap.put("my1",readImage("com/lhd/img/plant/my1.png"));
imageMap.put("myb1",readImage("com/lhd/img/bullet/myb1.png"));
imageMap.put("e1",readImage("com/lhd/img/explode/e1.png"));
imageMap.put("e2",readImage("com/lhd/img/explode/e2.png"));
imageMap.put("e3",readImage("com/lhd/img/explode/e3.png"));
imageMap.put("e4",readImage("com/lhd/img/explode/e4.png"));
}
public static Image get(String key){
return imageMap.get(key);
}
public static Image readImage(String path){
Image image = null;
try {
image = ImageIO.read(ImageUtils.class.getClassLoader().getResourceAsStream(path));
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
}
- Start 启动类
package com.lhd;
import com.lhd.base.Constant;
import com.lhd.base.PlaneFrame;
public class Start {
public static void main(String[] args) {
Constant.PLANE_FRAME = new PlaneFrame();
}
}
点击start类即可运行程序,另外游戏还有一些功能没有完善,待后续开发—
后面有游戏需要的图片