Java实训新增功能

改进之一:跳跃转身

实现:在跳跃的时候可以左右转身

实现:在MyFrame这个类的keyPressed(按下某个键时调用此方法)方法中监听D和A键里加一个判断条件:

如果处于跳跃状态,就直接交换人物的跳跃状态 (比如从向左跳跃变为向右跳跃,或者反之), 以此来实现利用这两个已有按键在跳跃时改变跳跃方向(左右转)的功能。

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == 68) {//按下D往右
        if (person.getStatus() == 3) {
            person.setStatus(-3);
        } else if (person.getStatus() == -3) {
            person.setStatus(3);
        }
    }
    this.person.rightRun();    
}
public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == 65) {//按下A往左
        if (person.getStatus() == 3) {
            person.setStatus(-3);
        } else if (person.getStatus() == -3) {
            person.setStatus(3);
        }
    }
    this.person.leftRun();
}

改进之二:闪现

按L健可以朝角色方向立刻移动450像素

实现:在Person类中写一个dash(猛冲的意思)方法

public void dash() {
        int dashDistance = 450; // 假设半个背景宽度是450像素,可根据实际调整
        if (status == 2) { // 向右跑状态时向右冲刺
            if (x + dashDistance < 750) { // 最大边界判断,这里750假设是场景的最大x边界值
                x += dashDistance;
            } else {
                x = 750; // 达到边界则设置为边界值
            }
        } else if (status == -2) { // 向左跑状态时向左冲刺
            if (x - dashDistance > -100) { // 最小边界判断,这里-100假设是场景的最小x边界值
                x -= dashDistance;
            } else {
                x = -100; // 达到边界则设置为边界值
            }
        }
    }

然后在MyFrame这个类的keyReleased(释放某个键时调用此方法)方法中加一个监听L键,并调用dash方法实现按L健冲刺的功能。

public void keyReleased(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == 76) { // 按下L冲刺
            this.person.dash();
        }
}

改进之三:显示关数目

在左上角显示关卡数目

实现:在BackGround类中的creat方法中,根据不同的关卡序号(sort值)进行相应的背景图像设置。然后通过获取背景图像对应的Graphics绘图上下文对象,设置好文字的颜色、字体等样式后,在每个背景图像的左上角坐标(50, 50)绘制出包含关卡序号的提示文字。

 if (showBgImage != null) {
    Graphics g = showBgImage.getGraphics();
    // 设置文字颜色为紫色
    g.setColor(new Color(153, 0, 255));
    g.setFont(new Font("Dialog", Font.BOLD, 20));
    g.drawString("距离公主被解救还剩下" + (5 - sort) + "关", 50, 50);
    g.dispose();//释放绘图资源
}

改进之四:大招

按下U键,角色可以释放动画实现当前背景所有敌人死亡

实现:准备好图片

在StaticValue类中创建ArrayList放魔法的集合,然后在静态模块中加载魔法的图片

public static List<BufferedImage> leftMagicImgs = new ArrayList<>();
public static List<BufferedImage> rightMagicImgs = new ArrayList<>();
for (int i = 0; i <= 12; i++) {
    String num = (i < 10) ? "0" + i : "" + i;
    leftMagicImgs.add(ImageIO.read(new File(ImagePath + "magic/left/" + num + ".png")));
    rightMagicImgs.add(ImageIO.read(new File(ImagePath + "magic/right/" + num + ".png")));
}

Person类中添加一个新的状态来表示技能播放,并更新run方法来处理技能动画

protected int magicStatus = 0; // 0: 不播放技能, 1: 正在播放技能
protected int magicFrame = 0; // 技能动画当前帧

protected void playMagic() {
    if (this.magicStatus == 0) { // 如果当前没有播放技能,则开始播放
        this.magicStatus = 1;
        this.magicFrame = 0;
    }
}

修改run方法来处理魔法动画

public void run() {
    while (true) {
        try {
            if (this.magicStatus == 1) { // 处理技能动画
                if (this.magicFrame > 12) { // 如果动画播放完毕,则重置状态
                    this.magicStatus = 0;
                    this.magicFrame = 0;
                } else {
                    this.showImage = (this.status > 0) ? rightMagicImgs.get(this.magicFrame) : leftMagicImgs.get(this.magicFrame);
                    this.magicFrame++;
                }
            } 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyFrame类的keyPressed方法中添加处理U键按下的逻辑

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == 85) { // U键的ASCII码是85
        this.person.playMagic(); // 触发技能播放
    }
}

在Person类中写alldead方法实现敌人当前背景所有敌人死亡

public void allDead(){
    if(background != null) {
        List<Enemy> allEnemy = background.getAllEnemy();
        Iterator<Enemy> dead = allEnemy.iterator();
        while (dead.hasNext()) {
            Enemy enemy = dead.next();
            dead.remove();
        }
    }
}

MyFrame类的keyPressed方法中U键添加个alldead方法

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == 85) { 
        this.person.playMagic(); 
        person.allDead();// 杀死当前背景中的所有敌人
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值