源码
import game.frame.Frame;
public class App {
public static void main(String[] args) {
System.out.println("starting......");
new Frame();
}
}
package game.controller;
import game.model.Enemy;
public class EnemyController implements Runnable{
private Enemy enemy;
public EnemyController(Enemy enemy) {
this.enemy = enemy;
}
@Override
public void run() {
while (true) {
try {
if (enemy.getStatus() == 1 || enemy.getStatus() == -1) {
enemy.setStatus(-2); // 站立状态修改成左跑
}
if (enemy.getX() <= -100) {
enemy.setStatus(2);
}
if (enemy.getX() >= 300) {
enemy.setStatus(-2);
}
Thread.sleep(50);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
package game.frame;
import game.model.BackGround;
import game.model.Enemy;
import game.model.Person;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.List;
public class Frame extends JFrame implements Runnable, KeyListener {
private Person person; // 添加人物
private Date startDate = new Date(); // 游戏开始时间
private BackGround nowBackGround; // 当前场景
public Frame() {
setTitle("game"); // 窗体标题
setSize(720, 480); // 窗体大小
// 居中显示
Toolkit toolkit = Toolkit.getDefaultToolkit(); // 获取屏幕工具包
int width = (int)toolkit.getScreenSize().getWidth(); // 获取屏幕宽度
int hight = (int)toolkit.getScreenSize().getHeight(); // 获取屏幕高度
int x = (width - 720) / 2;
int y = (hight - 480) / 2;
this.setLocation(x, y);
// 初始化场景
nowBackGround = new BackGround(1);
setVisible(true); // 设置可见
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 程序随窗体关闭而关闭
// 监听键盘
this.addKeyListener(this);
// 多线程
Thread thread = new Thread(this);
thread.start();
// 创建人物
person = new Person(0, 250, nowBackGround);
}
// 多线程任务
@Override
public void run() {
while (true) {
try {
this.person.applyGravity();
this.repaint(); // 循环重新绘画窗口
Thread.sleep(50); // 线程休息50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void paint(Graphics g) {
// 创建图片对象
BufferedImage image = new BufferedImage(720, 480, BufferedImage.TYPE_3BYTE_BGR);
// 获取图像画笔
Graphics graphics = image.getGraphics();
// 图像画笔绘画图像
graphics.drawImage(nowBackGround.getShowImage(), 0, 0, this);
// 添加时间
long dif = new Date().getTime() - startDate.getTime();
// 绘画时间
graphics.drawString("时间 " + (dif/1000/60) + " : " + (dif/1000%60), 600, 60);
// 绘画击杀数
graphics.drawString("击杀数: " + person.getKillNum(), 600, 80);
// 绘画敌人
List<Enemy> allEnemy = nowBackGround.getAllEnemy();
for (Enemy enemy : allEnemy) {
graphics.drawImage(enemy.getShowImage(), enemy.getX(), enemy.getY(), this);
}
// 绘画人物
graphics.drawImage(person.getShowImage(), person.getX(), person.getY(), this);
// 窗体画笔会话图像
g.drawImage(image, 0, 0, this);
// 是否进入下一场景
if (nowBackGround.isPass(person) && nowBackGround.hasNext()) {
nowBackGround = nowBackGround.next();
person.setX(0);
person.setBackGround(nowBackGround); // 重新设置场景
}
}
@Override // 键入某个键时调用
public void keyTyped(KeyEvent e) {
//TODO
}
@Override // 按下某个键时调用
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == 68) { // 按下D时右跑
this.person.rightRun();
}
if (keyCode == 65) { // 按下A时左跑
this.person.leftRun();
}
if (keyCode == 75) { // 按下K时跳跃
this.person.jump();
}
if (keyCode == 74) { // 按下J时攻击
this.person.attack();
}
if (keyCode == 76) { // 按下L时闪现
this.person.flash();
}
// 当按下A或D键且人物处于跳跃状态时,设置方向改变请求为true
if (person.getStatus() == 3 || person.getStatus() == -3) {
if (keyCode == 68) {
person.setJumpDirectionChangeRequested(true);
person.setJumpMoveDirection(1);
} else if (keyCode == 65) {
person.setJumpDirectionChangeRequested(true);
person.setJumpMoveDirection(-1);
}
}
}
@Override // 释放某个键时调用
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == 68) { // 释放D时停止右跑
this.person.stopRightRun();
}
if (keyCode == 65) { // 释放A时停止左跑
this.person.stopLeftRun();
}
}
}
package game.model;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import game.util.StaticValue;
public class BackGround {
private BufferedImage showImage = null; // 显示的场景图片
private int sort; // 序号
private int nextSort; // 下一个场景序号
private List<Enemy> allEnemy = new ArrayList<>(); // 敌人
public BackGround(int sort) {
this.sort = sort;
create();
}
public void create() { // 根据sort选择场景
if (this.sort == 1)