美文网首页
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10

手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10

作者: __豆约翰__ | 来源:发表于2021-12-31 06:09 被阅读0次

    一组动画

    上一节我们实现了sprite的单个行为的动画,但是我们知道,在游戏中某个角色可能有多个行为,比如idle,走,跳,跑等。
    那么我们能否封装一个类,来表达一个sprite各种行为动画呢
    下面这个Animator类就能实现我们的需求。
    Animator类里包含一个HashMap,其key是一个字符串名字即(idle,walk,jump)这种。值是我们上一节的Animation对象。
    Animator类和我们上一节的Animation很像,使用前要调用setAnimation方法,根据传入的name,取得当前要播放的动画对象。
    比如setAnimation("walk").
    完整代码如下:

    package sprite;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.HashMap;
    
    
    public class Animator extends Transform implements ActionListener{
        private HashMap<String, Animation> _frames;
        private Timer _tm;
        private int _currentFrame = 0;
        private int _maxFrame = 0;
        private Animation _currentAnim;
    
    
        public Animator(){
            super();
            _frames = new HashMap<String, Animation>();
            _tm = new Timer(120,this);
            _tm.start();
    
        }
    
        public void addAnimation(Animation anim, String name){
            
            _frames.put(name,anim);
        }
        
        public void setAnimation(String name){
            if(_frames.get(name)!=null){
                _currentFrame = 0;
                _currentAnim = _frames.get(name);
                _maxFrame = _currentAnim.getFrameCount()-1;
            }else{
                System.out.println("ERROR: Animation  Name "+name);
            }
        }
        
    
        public void show(Graphics2D g){
            if(_currentAnim.getImages().get(_currentFrame) != null){
                Image img = _currentAnim.getImages().get(_currentFrame);
                g.drawImage(img.getImage(),getTransform(),null);
            }else{
                System.out.println("ERROR: Animation  NULL");
            }
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            _currentFrame++;
            if(_currentFrame>_maxFrame){
                _currentFrame = 0;
            }
        }
    
        public int getCurrentFrame(){
            return _currentFrame;
        }
    
        public int getMaxFrame(){
            return _maxFrame;
        }
        
    }
    

    而Animation对象则变得很简洁

    package sprite;
    
    import java.util.ArrayList;
    
    
    public class Animation{
    
        private ArrayList<Image> _images;
        private int _frames;
    
        public Animation(ArrayList<Image> images){
            super();
            _images = images;
            _frames = images.size();
        }
        
    
        public int getFrameCount(){
            return _frames;
        }
        
    
        public ArrayList<Image> getImages(){
            return _images;
        }
    
    
    }
    

    测试一下

    GameApp修改如下:
    1.定义一个Animator对象

    private Animator animator = new Animator();
    

    2.添加2个Animation对象到animator

                Animation hound = new Animation(images);
                animator.addAnimation(hound,"dog");
                animator.setAnimation("dog");
    
                ArrayList<Image> imagesJasmin = new ArrayList<Image>();
                for(int k = 2; k < 8; k++){
                    Image img = new Image("res/jasmin/00" + k + ".png");
                    imagesJasmin.add(img);
                }
    
                Animation heroJasmin = new Animation(imagesJasmin);
                animator.addAnimation(heroJasmin,"hero");
    

    3.按下左右箭头切换动画

        if(_input.isKeyUp(KeyEvent.VK_RIGHT))
                {
                    System.out.println("VK_RIGHT");
                    animator.setAnimation("hero");
                }
                else if(_input.isKeyUp(KeyEvent.VK_LEFT))
                {
                    animator.setAnimation("dog");
                    System.out.println("VK_LEFT");
                }
    

    4.最后别忘了animator.show(g);

    animator.show(g);
    

    如果您迷路了请看这里:

    项目源码

    项目源码

    相关文章

      网友评论

          本文标题:手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10

          本文链接:https://www.haomeiwen.com/subject/lqvvqrtx.html