改进之一:跳跃转身
实现:在跳跃的时候可以左右转身
实现:在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();// 杀死当前背景中的所有敌人
}
}