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

简介: 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10之一组sprite动画

一组动画


上一节我们实现了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);

如果您迷路了请看这里:


项目源码


项目源码

目录
相关文章
|
1天前
|
Java 索引
Java String应用与开发
Java String应用与开发
8 0
|
1天前
|
Java
Java对象和类研究
Java对象和类研究
6 0
|
1天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
9 2
|
1天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
5天前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
5天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
4天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
4天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?