在 Java 小程序的循环期间输入键以用于动画目的

Posted

技术标签:

【中文标题】在 Java 小程序的循环期间输入键以用于动画目的【英文标题】:Inputting a Key during a Loop in Java applet for animation purposes 【发布时间】:2014-10-31 05:29:48 【问题描述】:

我正在学习如何以游戏的形式使用 Java 制作 Applet。在游戏中,我在中心绘制了一个角色精灵,并在玩家按下 w a s d 时移动。

是这样的:

public game extends applet implements KeyListener 
    int x, y;
    URL url;
    Image image;
    public void init() 
        x = getSize().width/2;
        y = getSize().height/2;
        url = new URL(getCodeBase());
        image = getImage(url, "player.gif"); //take note that this is a still image
        addKeyListener(this);
    
    public void paint(Graphics g) 
        g.drawImage(image, x, y, 32, 32, this); //the size of the image is 32x32
    
    public void KeyPressed(arg0) 
    char c = arg0.getKeyChar();
    switch(c) 
        case 'w':  
            y -= 10;
            break; 
        /*And so on. You guys know how it works.*/      
    
    repaint();

我的问题是,当用户不按任何东西时,角色精灵看起来很呆板。我想要做的是使 Image 成为一个图像数组,并通过像这样在paint中循环数组来放置一个简单的图像动画:

public void paint(Graphics g) 
    for(int i = 0; ; i++) 
        g.drawImage(image[i], x, y, 32, 32, this);
        if(i == image.size() - 1)  i = 0;
    

但是,如果我这样做,我将无法再获得在用户想要移动时会激活的 KeyEvent。我的问题是:我将如何制作,以便我的角色在程序“空闲”(即用户没有按下任何东西)时制作动画,同时仍然保持接收 KeyEvents 的能力(例如,当玩家键入时移动在 w、a、s 或 d 中,然后在重新绘制后继续空闲动画)?

提前致谢。

PS。我仍然是 Java 的初学者,如果我的代码不是很好,很抱歉。欢迎任何建议。

【问题讨论】:

1.欢迎任何建议 ---> Oracle tutorial - 2D Graphics, 2. 使用 Swing instead of AWT, 3. 不要使用 KeyListener, use KeyBindings, 4. short_cut 5.不要尝试在paint 方法中执行动画 【参考方案1】:

也许你会给自己一个新的类,比如 InterestingCharacter,它可以循环通过任何 N 个状态(对应于你的 N 个图像)。您显然不能让任何绘制方法无限运行,但如果您的 InterestingCharacter 可以将自己呈现在当前状态,那么您可能会对此有所了解。也许这个 InterestingCharacter 知道它处于什么状态,然后由其他对象管理渲染就足够了。如果 InterestingCharacter 可以告诉您它的状态已更改,因此需要再次呈现,这会有所帮助吗?如果是这样,您可以实现 Observer pattern 以便观察角色并让您的游戏成为观察者。

我认为诀窍是将问题分解为几个具有适当职责的类——理想情况下,一个类应该有一个职责,并且它的每个方法都应该做一件事。

只是一些可以帮助您前进的想法。尝试一下,看看效果如何。希望对您有所帮助!

【讨论】:

【参考方案2】:

您需要使您的应用程序多线程,以便绘画在单独的线程中运行。

否则你会在等待下一个键时阻止绘画。

不过,这对您的代码来说并不是一个微不足道的更改。

【讨论】:

这对我的目的有所帮助。谢谢!

以上是关于在 Java 小程序的循环期间输入键以用于动画目的的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器演示动画期间响应触摸事件

如何绑定转义键以关闭此窗口

一个多个数相加的结果的java小程序

用于交互式动画的 Java Swing 与 HTML5 Canvas

如何使主键以特定字母开头?

暂时禁用Java图形小程序中的双缓冲