手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏12之英雄自由行走

简介: 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏12之英雄自由行走

控制Player移动


Transform.java类新增一个flip方法,其功能是可以左右翻转一张图片,实现原理也很容易理解:

先移动到图片中心点(宽高一半的位置),然后进行缩放(大小不变,水平方向上沿中心线翻转)。

_isPivotRight变量用来记录当前对象是否朝右。

public void flip(){
        _rat.translate(_cx,_cy);
        _rat.scale(-1,1);
        _rat.translate(-_cx,-_cy);
        _isPivotRight = !_isPivotRight;
    }

Player类实现如下:

构造方法Player(String animName),加载player角色,全部行为动画;并设置初始动画为idle。

_handleMovement方法,在每一次游戏循环中被调用,判断上下左右箭头是否被按下,进行相应的偏移。

move方法先进行平移操作,然后判断是否需要进行翻转(头朝右按下左箭头或头朝左按下右箭头)。

package character;
import managers.InputManager;
import sprite.Animator;
import sprite.Transform;
import java.awt.*;
import java.awt.event.KeyEvent;
public class Player {
    private Animator _animator;
    private InputManager _input = InputManager.getInstance();
    private float _xspeed = 3.0f;
    private float _yspeed = 1.5f;
    private boolean _keyPressed = false;
    private double _flipCord = 1;
    public Player(String animName){
        _animator = new Animator(animName);
        _animator.setAnimation("idle");
    }
    public void move(double x, double y){
        _animator.translate(x, y);
        if(x>0 && _flipCord<0){
            _animator.flip();
            _flipCord = x;
        }
        if(x<0 && _flipCord>0){
            _animator.flip();
            _flipCord = x;
        }
        if(!_animator.isPlaying("walk")){
            _animator.setAnimation("walk");
        }
    }
    public void update(Graphics2D g){
        _animator.show(g);
        _handleMovement();
    }
    public Transform getTransform(){
        return _animator;
    }
    private void _handleMovement(){
        _keyPressed = false;
        if(_input.isKeyDown(KeyEvent.VK_UP)){
            _keyPressed = true;
            move(0,-_yspeed);
        }
        if(_input.isKeyDown(KeyEvent.VK_DOWN)){
            _keyPressed = true;
            move(0,_yspeed);
        }
        if(_input.isKeyDown(KeyEvent.VK_RIGHT)) {
            _keyPressed = true;
            move(_xspeed,0);
        }
        if(_input.isKeyDown(KeyEvent.VK_LEFT)) {
            _keyPressed = true;
            move(-_xspeed,0);
        }
        if(!_keyPressed){
            _animator.setAnimation("idle");
            _animator.translate(0,0);
        }
    }
}


整合在一起


修改GameApp.java

1.创建Player对象,并设置图片的中心点为图像的中心位置(宽高一半),查看图片的宽高以及这里的(72, 144)。

_player = new Player(Config.PLAYER_JASMIN);
_player.getTransform().setOrigin(72, 144);

2.在游戏循环里调用_player.update(g)

_player.update(g);

如果您迷路了,请查看本节完整源码:


项目源码


项目源码

目录
相关文章
|
1天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
14 4
|
2天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
20 4
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
9 2
|
1天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
5 0
|
1天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
|
IDE 小程序 前端开发
详细解读java的俄罗斯方块游戏的源代码--【课程设计】
详细解读java的俄罗斯方块游戏的源代码--【课程设计】
|
Java 定位技术 开发者
基于Java的俄罗斯方块游戏
基于Java的俄罗斯方块游戏
基于Java的俄罗斯方块游戏
|
Java 定位技术
Java---俄罗斯方块小游戏
去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏。 只有简单的新游戏,暂停,继续,积分功能。简单的实现了俄罗斯的经典功能。 不介绍了,有兴趣的自己运行一下,后面贴出了图片。
1020 0
|
9天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?