手把手一步一步教你使用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);

如果您迷路了请看这里:


项目源码


项目源码

目录
相关文章
|
8天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
21 4
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
32 4
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
49 4
|
11天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
21 0
|
10天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
24 0
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
17天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
22 9