控制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);
如果您迷路了,请查看本节完整源码: