我正在学习如何使用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的初学者,很抱歉,如果我的代码不是很好。欢迎任何建议。
答案 0 :(得分:0)
也许你会给自己一个新的课程,比如 InterestingCharacter ,它可以循环通过任何N个状态(对应于你的N个图像)。您显然无法让任何绘制方法无限运行,但如果您的 InterestingCharacter 可以将其自身呈现在当前状态,那么您可能会使用该方法。也许这个 InterestingCharacter 知道它处于什么状态就足够了,然后其他一些对象管理渲染。如果 InterestingCharacter 可以告诉你它的状态已经改变并因此需要再次渲染,那会有用吗?如果是这样,你可以实现Observer pattern,以便观察角色,让你的游戏成为观察者。
我认为诀窍是将问题分解为几个具有适当职责的类 - 理想情况下,一个类应该有一个责任,每个方法应该做一件事。
一些想法可以帮助你前进。试一试,看看它是怎么回事。希望它有所帮助!
答案 1 :(得分:0)
您需要使应用程序成为多线程,以便绘画在单独的线程中运行。
否则,在等待下一个键时,您将禁止绘画。
尽管如此,这不是对您的代码的微不足道的改变。