在Java applet的循环期间输入密钥以用于动画目的

时间:2014-09-06 11:33:51

标签: java applet awt paint keylistener

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

它是这样的:

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();
}

我的问题是,当用户没有按任何东西时,角色精灵似乎很无聊。我想要做的是使图像成为一个图像数组,并通过在数据库中循环数组来放置一个简单的图像动画:

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的初学者,很抱歉,如果我的代码不是很好。欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

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

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

一些想法可以帮助你前进。试一试,看看它是怎么回事。希望它有所帮助!

答案 1 :(得分:0)

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

否则,在等待下一个键时,您将禁止绘画。

尽管如此,这不是对您的代码的微不足道的改变。