JAVA-制作小游戏期末实训

源码

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) {
            this.showImage = StaticValue.bg01;
            this.allEnemy.add(new Enemy(400, 110, this));
            this.allEnemy.add(new Enemy(200, 110, this));
            this.nextSort = 2;
        } else if (this.sort == 2) {
            this.showImage = StaticValue.bg02;
            this.nextSort = 3;
            this.allEnemy.add(new Enemy(400, 100, this));
            this.allEnemy.add(new Enemy(200, 100, this));
        } else if (this.sort == 3) {
            this.showImage = StaticValue.bg03;
            this.nextSort = 4;
            this.allEnemy.add(new Enemy(400, 100, this));
            this.allEnemy.add(new Enemy(200, 100, this));
            this.allEnemy.add(new Enemy(600, 100, this));
        }else if (this.sort == 4) {
            this.showImage = StaticValue.bg04;
            this.nextSort = 1;
            this.allEnemy.add(new Enemy(400, 100, this));
            this.allEnemy.add(new Enemy(200, 100, this));
            this.allEnemy.add(new Enemy(600, 100, this));
            this.allEnemy.add(new Enemy(300, 100, this));
        }
    }
    public boolean hasNext() {      //  是否有另一个场景
        return nextSort != 0;
    }
    public BackGround next() {      //  创建下一个场景
        return new BackGround(nextSort);
    }
    public boolean isPass(Person person) {  //  是否可以通过
        if (person.getX() >= 650) {
            return true;
        }
        return false;
    }
    public BufferedImage getShowImage() {
        return showImage;
    }
    public void setShowImage(BufferedImage showImage) {
        this.showImage = showImage;
    }

    public List<Enemy> getAllEnemy() {
        return allEnemy;
    }
}
package game.model;
import game.controller.EnemyController;
import game.util.StaticValue;
public class Enemy extends Person{
    private Thread controllerThread;
    public Enemy(int x, int y, BackGround backGround) {
        super(x, y, backGround);
        this.status = -1;       //  设置状态为左站立
        controllerThread = new Thread(new EnemyController(this));
        controllerThread.start();
    }

    //  设置敌人图片
    @Override
    protected void setImageList() {
        leftStandImages = StaticValue.leftEnemyImgs.subList(14, 19);
        rightStandImages = StaticValue.rightEnemyImgs.subList(14, 19);
        leftRunImages = StaticValue.leftEnemyImgs.subList(0, 6);
        rightRunImages = StaticValue.rightEnemyImgs.subList(0, 6);
        leftJumpImages = StaticValue.leftEnemyImgs.subList(4, 5);
        rightJumpImages = StaticValue.rightEnemyImgs.subList(4, 5);
        leftAttackImages = StaticValue.leftEnemyImgs.subList(6, 14);
        rightAttackImages = StaticValue.rightEnemyImgs.subList(6, 14);
    }

    public void dead() {    //  死掉
        this.backGround.getAllEnemy().remove(this);
        Person.killNum++;
    }
}
package game.model;

import game.util.StaticValue;
import java.awt.image.BufferedImage;
import java.util.List;

public class Person implements Runnable{
    protected int x;  //  坐标x
    protected int y;  //  坐标y
    protected BufferedImage showImage;    //  人物显示图片
    protected Thread t;                 //  线程
    protected double moving = 0;  //  移动帧数
    protected int status = 1;     //  人物状态 默认右站立
    protected int jumpForce = 0;  //  跳跃力
    protected int jumpMoveDirection = 0;  //  跳跃移动方向 0垂直 -1向左 1向右
    protected BackGround backGround;    //  场景
    protected static int killNum = 0;      //  击杀数

    private boolean jumpDirectionChangeRequested = false;   //  跳跃时的方向改变请求

    protected List<BufferedImage> leftStandImages;      //  左站立图集
    protected List<BufferedImage> rightStandImages;     //  右站立图集
    protected List<BufferedImage> leftRunImages;        //  左跑图集
    protected List<BufferedImage> rightRunImages;       //  右跑图集
    protected List<BufferedImage> leftJumpImages;       //  左跳图集
    protected List<BufferedImage> rightJumpImages;      //  右跳图集
    protected List<BufferedImage> leftAttackImages;     //  左攻图集
    protected List<BufferedImage> rightAttackImages;    //  右攻图集
    public Person(int x, int y, BackGround backGround) {
        this.x = x;
        this.y = y;
        this.backGround = backGround;
        this.t = new Thread(this);
        t.start();
        setImageList();
    }

    protected void setImageList() {    //  初始化图集
        leftStandImages = StaticValue.leftPersonImgs.subList(0, 4);
        rightStandImages = StaticValue.rightPersonImgs.subList(0, 4);
        leftRunImages = StaticValue.leftPersonImgs.subList(5, 9);
        rightRunImages = StaticValue.rightPersonImgs.subList(5, 9);
        leftJumpImages = StaticValue.leftPersonImgs.subList(6, 7);
        rightJumpImages = StaticValue.rightPersonImgs.subList(6, 7);
        leftAttackImages = StaticValue.leftPersonImgs.subList(9, 12);
        rightAttackImages = StaticValue.rightPersonImgs.subList(9, 12);
    }

    @Override
    public void run() {
        //  线程更新人物
        while (true) {
            try {
                switch (status) {
                    case 1:     //  向右-站立
                        if (this.moving > 3) {
                            this.moving = 0;
                        }
                        this.showImage = rightStandImages.get((int)moving);
                        moving += 0.2;
                        break;
                    case 2:     //  向右-跑
                        if (this.moving > 3) {
                            this.moving = 0;
                        }
                        this.showImage = rightRunImages.get((int)moving);
                        moving += 0.5;
                        break;
                    case 3:     //  向右-跳跃
                        this.moving = 0;
                        this.showImage = rightJumpImages.get((int)moving);
                        if (jumpDirectionChangeRequested) {
                            if (jumpMoveDirection == -1) {
                                status = -3;
                            }
                            jumpDirectionChangeRequested = false;
                        }
                        if (jumpMoveDirection > 0) {
                            x += 10;
                        } else if (jumpMoveDirection < 0) {
                            x -= 10;
                        }
                        y -= jumpForce + 2;
                        if (y > 250) {
                            y = 250;
                            if (jumpMoveDirection > 0) {
                                this.status = 2;
                            } else if (jumpMoveDirection < 0) {
                                this.status = -2;
                            } else {
                                this.status = this.status > 0? 1 : -1;
                            }
                        }
                        jumpForce--;
                        break;
                    case 4:     //  向右-攻击
                        if (this.moving > 2) {
                            this.moving = 0;
                        }
                        this.showImage = rightAttackImages.get((int)moving);
                        moving += 0.5;
                        if (this.moving == 2){
                            this.status = this.status > 0 ? 1 : -1;
                        }
                        break;
                    case -1:    //  向左-站立
                        if (this.moving > 3) {
                            this.moving = 0;
                        }
                        this.showImage = leftStandImages.get((int)moving);
                        moving += 0.2;
                        break;
                    case -2:    //  向左-跑
                        if (this.moving > 3) {
                            this.moving = 0;
                        }
                        this.showImage = leftRunImages.get((int)moving);
                        moving += 0.5;
                        break;
                    case -3:    //  向左-跳跃
                        this.moving = 0;
                        this.showImage = leftJumpImages.get((int)moving);
                        if (jumpDirectionChangeRequested) {
                            if (jumpMoveDirection == 1) {
                                status = 3;
                            }
                            jumpDirectionChangeRequested = false;
                        }
                        if (jumpMoveDirection > 0) {
                            x += 10;
                        } else if (jumpMoveDirection < 0) {
                            x -= 10;
                        }
                        y -= jumpForce + 2;
                        if (y > 250) {
                            y = 250;
                            if (jumpMoveDirection > 0) {
                                this.status = 2;
                            } else if (jumpMoveDirection < 0) {
                                this.status = -2;
                            } else {
                                this.status = this.status > 0? 1 : -1;
                            }
                        }
                        jumpForce--;
                        break;
                    case -4:    //  向左-攻击
                        if (this.moving > 2) {
                            this.moving = 0;
                        }
                        this.showImage = leftAttackImages.get((int)moving);
                        moving += 0.5;
                        if (this.moving == 2){
                            this.status = this.status > 0 ? 1 : -1;
                        }
                    default:
                        break;
                }
                moveXY();       //  人物移动
                //  边界控制
                if (x < -100) {
                    x = -100;
                }
                if (x > 650) {
                    x = 650;
                }
                //  攻击敌人
                if (this.backGround != null) {
                    List<Enemy> allEnemy = this.backGround.getAllEnemy();   //  获取场景中所有的敌人
                    for (int i = 0; i < allEnemy.size(); i++) {
                        Enemy enemy = allEnemy.get(i);
                        if (this.status == 4 && (this.x + 125) > (enemy.getX()) && (this.x + 125) < (enemy.getX() + 250)) {
                            enemy.dead();
                        } else if (this.status == -4 && (this.x + 125) < (enemy.getX() + 400) && (this.x + 125) > (enemy.getX() + 256)) {
                            enemy.dead();
                        }
                    }
                }
                Thread.sleep(50);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void moveXY() {     //  人物移动方法
        switch (status) {
            case 1:     //  向右-站立
                break;
            case 2:     //  向右-跑
                x += 10;
                break;
            case 3:     //  向右-跳跃
                if (this.jumpMoveDirection > 0) {
                    x += 10;
                }else if (this.jumpMoveDirection < 0) {
                    x -= 10;
                }
                y -= jumpForce + 2;
                if (y > 250) {
                    y = 250;
                    if (this.jumpMoveDirection > 0) {
                        this.status = 2;
                    } else if (this.jumpMoveDirection < 0) {
                        this.status = -2;
                    }else {
                        this.status = this.status > 0 ? 1 : -1;
                    }
                }
                jumpForce--;
                break;
            case 4:     //  向右-攻击
                break;
            case -1:    //  向左-站立
                break;
            case -2:    //  向左-跑
                x -= 10;
                break;
            case -3:    //  向左-跳跃
                if (this.jumpMoveDirection > 0) {
                    x += 10;
                }else if (this.jumpMoveDirection < 0) {
                    x -= 10;
                }
                y -= jumpForce + 2;
                if (y > 250) {
                    y = 250;
                    if (this.jumpMoveDirection > 0) {
                        this.status = 2;
                    } else if (this.jumpMoveDirection < 0) {
                        this.status = -2;
                    }else {
                        this.status = this.status > 0 ? 1 : -1;
                    }
                }
                jumpForce--;
                break;
            case -4:    //  向左-攻击
                break;
            default:
                break;
        }
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setX(int x) {
        this.x = x;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getKillNum() {
        return killNum;
    }
    public BufferedImage getShowImage() {
        if (showImage == null) {    //  当图片显示为空获取图片
            showImage = StaticValue.rightPersonImgs.get(0); //  获取第一张
        }
        return showImage;
    }
    public void setShowImage(BufferedImage showImage) {
        this.showImage = showImage;
    }

    public void rightRun() {    //  右跑
        if (this.status == 3 || this.status == -3) {    //  浮空状态不允许改变状态
            return;
        }
        this.status = 2;
    }
    public void leftRun() {    //  左跑
        if (this.status == 3 || this.status == -3) {    //  浮空状态不允许改变状态
            return;
        }
        this.status = -2;
    }
    public void stopRightRun() {    //  停止右跑
        if (this.status == 3 || this.status == -3) {    //  浮空状态不允许改变状态
            this.jumpMoveDirection = 0;     //  跳跃结束恢复站立
            return;
        }
        this.status = 1;
    }
    public void stopLeftRun() {     //  停止左跑
        if (this.status == 3 || this.status == -3) {    //  浮空状态不允许改变状态
            this.jumpMoveDirection = 0;     //  跳跃结束恢复站立
            return;
        }
        this.status = -1;
    }

    public void jump() {        //  跳跃
        if (this.status != 3 && this.status != -3) {
            if (this.status == 2 || this.status == -2) {
                this.jumpMoveDirection = this.status > 0 ? 1 : -1;
            }
            this.status = this.status > 0 ? 3 : -3;     //  设置状态为跳跃
            this.jumpForce = 15;    //  设置跳跃力
        }
    }
    public void attack() {      //  攻击
        if (this.status > 0) {
            this.status = 4;
        }else {
            this.status = -4;
        }
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public BackGround getBackGround() {
        return backGround;
    }
    public void setBackGround(BackGround backGround) {
        this.backGround = backGround;
    }

    public void setJumpDirectionChangeRequested(boolean jumpDirectionChangeRequested) {
        this.jumpDirectionChangeRequested = jumpDirectionChangeRequested;
    }

    public void setJumpMoveDirection(int jumpMoveDirection) {
        this.jumpMoveDirection = jumpMoveDirection;
    }

    private double veloctiyY = 0;   //  当前速度
    public void applyGravity() {    //  跳跃攻击后落地方法
        if (this.y < 250) {
            double GRAVITY = 0.5;
            this.veloctiyY += GRAVITY;
            this.y += (int)this.veloctiyY;
            if (this.y >= 250) {
                this.y = 250;
                this.veloctiyY = 0;
            }
        }
    }
    public void flash() {   //  闪现
        if (this.status == 1 || this.status == 2) {
            this.x += 100;
        }else if (this.status == -1 || this.status == -2) {
            this.x -= 100;
        }
    }
}
package game.util;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class StaticValue {
    //  获取项目目录
    public static final String ImagePath = System.getProperty("user.dir") + "/res/";
    //  背景图片
    public static BufferedImage bg01 = null;
    public static BufferedImage bg02 = null;
    public static BufferedImage bg03 = null;
    public static BufferedImage bg04 = null;

    //  人物图片集合
    public static List<BufferedImage> leftPersonImgs = new ArrayList<>();
    public static List<BufferedImage> rightPersonImgs = new ArrayList<>();

    //  敌人图片集合
    public static List<BufferedImage> leftEnemyImgs = new ArrayList<>();
    public static List<BufferedImage> rightEnemyImgs = new ArrayList<>();

    static {
        try {
            //  获取背景图片
            bg01 = ImageIO.read(new File(ImagePath + "background/1.png"));
            bg02 = ImageIO.read(new File(ImagePath + "background/2.png"));
            bg03 = ImageIO.read(new File(ImagePath + "background/3.png"));
            bg04 = ImageIO.read(new File(ImagePath + "background/4.png"));
            //  获取人物图片
            for (int i = 1; i <= 14; i++) {
                DecimalFormat decimalFormat = new DecimalFormat("00");
                String num = decimalFormat.format(i);
                //  添加人物图片到集合中
                leftPersonImgs.add(ImageIO.read(new File(ImagePath + "person/left/" + num + ".png")));
                rightPersonImgs.add(ImageIO.read(new File(ImagePath + "person/right/" + num + ".png")));
            }
            //  加载敌人图片
            for (int i = 0; i <= 6; i++) {
                File rightfile = new File(ImagePath + "enemy/right/517_move_" + i + ".png");
                File leftfile = new File(ImagePath + "enemy/left/517_move_" + i + ".png");
                leftEnemyImgs.add(ImageIO.read(leftfile));
                rightEnemyImgs.add(ImageIO.read(rightfile));
            }
            for (int i = 0; i <= 7; i++) {
                File rightfile = new File(ImagePath + "enemy/right/517_skill_1027_" + i + ".png");
                File leftfile = new File(ImagePath + "enemy/left/517_skill_1027_" + i + ".png");
                leftEnemyImgs.add(ImageIO.read(leftfile));
                rightEnemyImgs.add(ImageIO.read(rightfile));
            }
            for (int i = 0; i <= 7; i++) {
                File rightfile = new File(ImagePath + "enemy/right/517_stand_" + i + ".png");
                File leftfile = new File(ImagePath + "enemy/left/517_stand_" + i + ".png");
                leftEnemyImgs.add(ImageIO.read(leftfile));
                rightEnemyImgs.add(ImageIO.read(rightfile));
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

新增功能

杀敌数量显示

Person添加killNum属性记录杀敌数量

Frame.java

//  绘画时间
        graphics.drawString("时间 " + (dif/1000/60) + " : " + (dif/1000%60), 600, 60);

跳跃可攻击

Person.java

public void attack() {      //  攻击
        if (this.status > 0) {
            this.status = 4;
        }else {
            this.status = -4;
        }
    }
public void applyGravity() {    //  落地方法
        if (this.y < 250) {
            double GRAVITY = 0.5;
            this.veloctiyY += GRAVITY;
            this.y += (int)this.veloctiyY;
            if (this.y >= 250) {
                this.y = 250;
                this.veloctiyY = 0;
            }
        }
    }

跳跃可转身

Person.java

private boolean jumpDirectionChangeRequested = false;   //  跳跃时的方向改变请求

public void setJumpDirectionChangeRequested(boolean jumpDirectionChangeRequested) {
        this.jumpDirectionChangeRequested = jumpDirectionChangeRequested;
    }

    public void setJumpMoveDirection(int jumpMoveDirection) {
        this.jumpMoveDirection = jumpMoveDirection;
    }

private void moveXY() {     //  人物移动方法
        switch (status) {
            case 1:     //  向右-站立
                break;
            case 2:     //  向右-跑
                x += 10;
                break;
            case 3:     //  向右-跳跃
                if (this.jumpMoveDirection > 0) {
                    x += 10;
                }else if (this.jumpMoveDirection < 0) {
                    x -= 10;
                }
                y -= jumpForce + 2;
                if (y > 250) {
                    y = 250;
                    if (this.jumpMoveDirection > 0) {
                        this.status = 2;
                    } else if (this.jumpMoveDirection < 0) {
                        this.status = -2;
                    }else {
                        this.status = this.status > 0 ? 1 : -1;
                    }
                }
                jumpForce--;
                break;
            case 4:     //  向右-攻击
                break;
            case -1:    //  向左-站立
                break;
            case -2:    //  向左-跑
                x -= 10;
                break;
            case -3:    //  向左-跳跃
                if (this.jumpMoveDirection > 0) {
                    x += 10;
                }else if (this.jumpMoveDirection < 0) {
                    x -= 10;
                }
                y -= jumpForce + 2;
                if (y > 250) {
                    y = 250;
                    if (this.jumpMoveDirection > 0) {
                        this.status = 2;
                    } else if (this.jumpMoveDirection < 0) {
                        this.status = -2;
                    }else {
                        this.status = this.status > 0 ? 1 : -1;
                    }
                }
                jumpForce--;
                break;
            case -4:    //  向左-攻击
                break;
            default:
                break;
        }
    }

Frame.java

@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);
            }
        }
    }

闪现

Person.java

public void flash() {   //  闪现
        if (this.status == 1 || this.status == 2) {
            this.x += 100;
        }else if (this.status == -1 || this.status == -2) {
            this.x -= 100;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux Red Hat 7.9 Server安装GitLab

1、关闭防火墙 执行 systemctl disable firewalld 查看服务器状态 systemctl status firewalld 2、禁用selinux vi /etc/selinux/config 将SELINUX 的值改为 disabled 3、安装policycoreutils-python 执行 yum install policycoreutils-python 4、下载gitlab wget --co…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子&#xff0c;抽象来说就是&#xff1a; 把此类相关联的量当作节点&#xff0c;两个节点之间连接一条无向边&#xff0c;所形成的图 例题算法流程&#xff1a; 在此定义“族长”就是一个树的…

windows编译llama.cpp GPU版本

Build 指南 https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md 一、Prerequire 具体步骤&#xff08;以及遇到的坑&#xff09;&#xff1a; 如果你要使用CUDA&#xff0c;请确保已安装。 1.安装 最新的 cmake, git, anaconda&#xff0c; pip 配置pyt…

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化&#xff1a;内存优化 &#xff08;思路篇&#xff09; 大概梳理了Android 内存原理和优化的必要性及应该如何优化&#xff0c;输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…

「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用

本篇教程将实现一个打卡提醒小应用&#xff0c;通过用户输入时间进行提醒设置&#xff0c;并展示实时提醒状态&#xff0c;实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能&#xff1a; 提醒时间输入与…

Nginx知识详解(理论+实战更易懂)

目录 一、Nginx架构和安装 1.1 Nginx 概述 1.1.1 nginx介绍 1.1.2?Nginx 功能介绍 1.1.3?基础特性 1.1.4?Web 服务相关的功能 1.2?Nginx 架构和进程 1.2.1?Nginx 进程结构 1.2.2?Nginx 进程间通信 1.2.3?Nginx 启动和 HTTP 连接建立 1.2.4?HTTP 处理过程 1…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

Vue 解决浏览器刷新路由参数丢失问题 全局统一配置无需修改组件

在路由跳转的时候,我们经常会传一些参数过去,然后通过传过来的参数调用接口获取相关数据,但是刷新浏览器的时候路由参数会丢失。此时页面报错误了,如何通过全局配置的方式,不需要修改任何组件 实现刷新浏览器保存参数? 实现方式如下: 首先在router/index.js里添加参数管…

【AIGC】电话录音转文字实践:基于Google Cloud Speech-to-Text-v1的技术方案Python

文章目录 引言技术原理技术方案设计系统架构关键技术要点 代码实现1. 环境准备2. 核心代码实现3. 音频预处理工具响应格式 性能优化实践经验应用场景未来展望总结 引言 在当今数字化时代&#xff0c;将语音内容转换为文字已经成为一个非常重要的技术需求。无论是客服通话记录、…

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

Android Camera压力测试工具

背景描述&#xff1a; 随着系统的复杂化和业务的积累&#xff0c;日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化&#xff0c;需要对Android Camera应用进行全面的压测。 对于压…

vscode中调用deepseek实现AI辅助编程

来自 Python大数据分析 费弗里 1 简介 大家好我是费老师&#xff0c;最近国产大模型Deepseek v3新版本凭借其优秀的模型推理能力&#xff0c;讨论度非常之高&#x1f525;&#xff0c;且其官网提供的相关大模型API接口服务价格一直走的“价格屠夫”路线&#xff0c;性价比很高…

基于 LMS 算法的离散傅里叶分析器

基于 LMS&#xff08;Least Mean Squares&#xff0c;最小均方&#xff09;算法的离散傅里叶分析器是一种结合自适应滤波和频域分析的工具&#xff0c;用于动态估计信号的频谱成分。它将 LMS 自适应算法与离散傅里叶变换&#xff08;DFT&#xff09;的频率分解能力结合&#xf…

2022浙江大学信号与系统笔记

原视频地址&#xff1a;2022浙江大学信号与系统&#xff08;含配套课件和代码&#xff09; - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记&#xff1a;飞书链接 - 信号与系统 基于视频&#xff0c;记得笔记&#xff0c;加了点自己的补充&#xff08;有的是问 ChatGPT 的&#xff09;…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署、常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台&#xff1b;我这里是安装的其他开源平台Kub…

Gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置

gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置 1. 说明2. 实操&#xff08;以docker执行器为例&#xff09;2.1 修改默认的builds_dir2.1.1 调整gitlab-runner的配置文件2.1.2 CI文件 2.2 启用custom_build_dir2.2.1 调整gitlab-runner的配置文件2.2.2 CI文件…

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

SpringCloud源码-Ribbon

一、Spring定制化RestTemplate&#xff0c;预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…

MySQL5.7.26-Linux-安装(2024.12)

文章目录 1.下载压缩包1.访问MySQL版本归档2.找到5.7.26并下载3.百度网盘 2.Linux安装1.卸载原来的MySQL8.0.26&#xff08;如果没有则无需在意&#xff09;1.查看所有mysql的包2.批量卸载3.删除残留文件**配置文件**&#xff08;默认路径&#xff09;&#xff1a; 4.**验证卸载…