Java 如何创建交互式动画?
所以我的老师想让我制作一个互动动画。问题是他没有告诉全班怎么做。(这是一门在线课程)。要点是他想让我制作一个可以用键盘控制的图形。我在网上到处找了找,但显然我没有提出正确的问题,因为出于某种原因,我的答案是空的 无论如何。我有三个代码文件。Zorx1、Zorx2和Zorx3是同一个外星人,颜色略有不同,这是老师给的Java 如何创建交互式动画?,java,swing,animation,keylistener,key-bindings,Java,Swing,Animation,Keylistener,Key Bindings,所以我的老师想让我制作一个互动动画。问题是他没有告诉全班怎么做。(这是一门在线课程)。要点是他想让我制作一个可以用键盘控制的图形。我在网上到处找了找,但显然我没有提出正确的问题,因为出于某种原因,我的答案是空的 无论如何。我有三个代码文件。Zorx1、Zorx2和Zorx3是同一个外星人,颜色略有不同,这是老师给的 // The Zorx alien object import java.awt.*; public class Zorx1 { /* the fields of the objec
// The Zorx alien object
import java.awt.*;
public class Zorx1
{
/* the fields of the object defined here as static to make the
interface as simple as possible to start*/
static int x = 100, y = 100;
static int size = 50;
static Color clr = Color.red;
static boolean showing = false;
// paints Zorx on the screen Note this method is not part of Interface
static void paint (Graphics g)
{
g.setColor (clr);
g.fillRect (x, y, size / 4, size);
g.setColor (Color.black);
g.drawLine (x-3,y-2,x-1,y+size/8);//These four lines will add fangs to this guy. Nasty!
g.drawLine (x-2,y-2,x-1,y+size/8);
g.drawLine (x+3,y-2,x+5,y+size/8);
g.drawLine (x+2,y-2,x+4,y+size/8);
g.setColor (clr);
g.fillOval (x - (3 * size / 8), y - (size / 2), size, size / 2);
g.drawLine (x - 3 * size / 8, y + size, x - 3 * size / 8 + size, y + size);
g.drawLine (x, y + size / 2, x - size, y);
g.drawLine (x - size, y, x - size, y - size / 4);
g.drawOval (x - size - size / 8, y - size / 4 - size / 8, size / 8, size / 8);
g.setXORMode (Color.black); //Makes his eyes black. Sinister
g.fillOval (x - size / 4, y - size / 3, size / 12, size / 12);
g.fillOval (x + size / 4, y - size / 3, size / 12, size / 12);
g.fillOval (x - size / 1000, y - size / 4, size / 12, size / 12); //adds a third eye to our alien. Spooooooooky.
g.setPaintMode ();
} // end of paint method
// Show the Zorx alien. The show method is part of the interface.
public static void show (Graphics g)
{
paint (g);
showing = true;
} // end of show method
// Erase Zorx from the screen. The erase method
// is not part of the interface.
static void erase (Graphics g, Color backgroundColor)
{
g.setColor (backgroundColor);
g.fillRect (x, y, size / 4, size);
g.fillOval (x - (3 * size / 8), y - (size / 2), size, size / 2);
g.drawLine (x-3,y-2,x-1,y+size/8);
g.drawLine (x-2,y-2,x-1,y+size/8);
g.drawLine (x+3,y-2,x+5,y+size/8);
g.drawLine (x+2,y-2,x+4,y+size/8);
g.drawLine (x - 3 * size / 8, y + size, x - 3 * size / 8 + size, y + size);
g.drawLine (x, y + size / 2, x - size, y);
g.drawLine (x - size, y, x - size, y - size / 4);
g.drawOval (x - size - size / 8, y - size / 4 - size / 8, size / 8, size / 8);
g.fillOval (x - size / 4, y - size / 3, size / 12, size / 12);
g.fillOval (x + size / 4, y - size / 3, size / 12, size / 12);
} // end of erase method
// Hide Zorx The hide method is part of the interface.
public static void hide (Graphics g, Color backgroundColor)
{
erase (g, backgroundColor);
showing = false;
} // end of hide method
// Move Zorx from one location to another. The move method
// is part of the interface.
public static void move (int newX, int newY, Graphics g, Color backgroundColor)
{
if (showing)
{
erase (g, backgroundColor);
}
x = newX;
y = newY;
if (showing)
{
show (g);
}
} // end of move method
} // end of Zorx Class
外来对象拥有移动对象所需的所有方法和一切,而动画应该控制所有这些
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Animation extends JFrame implements KeyListener
{
public Animation (Graphics g)
{
Zorx1.show(g);
Zorx2.show(g);
Zorx3.show(g);
this.setFocusable(true);
}
public static void main (String args[])
{
Animation application = new Animation(g);
application.setVisible(true);
}
public int x=100;
public int y=100;
public void keyPressed (KeyEvent e)
{
switch (e.getKeyCode()) //I can't seem to get this thing to animate through this so this is just left blank for the sake of necessity.
{
case KeyEvent.VK_LEFT:
break;
case KeyEvent.VK_RIGHT:
break;
case KeyEvent.VK_DOWN:
break;
case KeyEvent.VK_UP:
break;
}
}
public void keyTyped(KeyEvent e)
{
if (e.getKeyChar() == KeyEvent.VK_LEFT)
{
left(g);
}
else if (e.getKeyChar() == KeyEvent.VK_RIGHT)
{
right(g);
}
else if (e.getKeyChar() == KeyEvent.VK_UP)
{
up(g);
}
else if (e.getKeyChar() == KeyEvent.VK_DOWN)
{
down(g);
}
if (e.getKeyChar() == KeyEvent.VK_ESCAPE)
{
System.exit(0);
// If you hit escape you will exit the animation
}
}
public void left (Graphics g)
{
x=x-10;
Zorx1.move (x,y, g, getBackground ());
Zorx2.move (x,y+50,g,getBackground());
Zorx3.move (x,y+100,g,getBackground());
}
public void right (Graphics g)
{
x=x+10;
Zorx1.move (x,y,g,getBackground());
Zorx2.move (x,y+50,g,getBackground());
Zorx3.move (x,y+100,g,getBackground());
}
public void up(Graphics g)
{
y=y-10;
Zorx1.move (x,y,g,getBackground());
Zorx2.move (x,y+50,g,getBackground());
Zorx3.move (x,y+100,g,getBackground());
}
public void down(Graphics g)
{
y=y+10;
Zorx1.move (x,y,g,getBackground());
Zorx2.move (x,y+50,g,getBackground());
Zorx3.move (x,y+100,g,getBackground());
}
public void keyReleased(KeyEvent e)
{
switch (e.getKeyCode())
{
case KeyEvent.VK_LEFT:
break;
case KeyEvent.VK_RIGHT:
break;
case KeyEvent.VK_DOWN:
break;
case KeyEvent.VK_UP:
break;
}
}
}
我知道上面的代码不起作用,但那可能是因为我不知道我到底应该做什么
我找出了导致重写静态方法问题的原因。我在zorx1.java中添加了extendsjframe,这导致了与paint(Graphics g)部分的冲突。所以我把它重命名为make(Graphics g)。希望这不会引起并发症
我想我应该能够将键盘交互部分转移到另一个类中(我希望如此),但我也有一个问题
public class Animation extends JFrame
{
public int x=100;
public int y=100;
public Animation (Graphics g)
{
Zorx1.show(g);
Zorx2.show(g);
Zorx3.show(g);
}
public static void main (String args[])
{
Animation application = new Animation (g);
}
新动画(g);找不到符号g。我不能在任何地方添加它,因为它会导致问题。我怎样才能让它认出这个符号,或者我一开始就不需要它
public Animation ()
{
repaint();
}
public void paintComponent (Graphics g)
{
super.paintComponent(g);
Zorx1.show(g);
Zorx2.show(g);
Zorx3.show(g);
}
好的,我想我知道了,但是超级。油漆组件(g);返回一个错误,其中显示:“找不到符号方法paintComponent(java.awt.Graphics)。”
修好了。最后。建议:
- 阅读Swing图形教程,了解使用Swing绘图的最佳方法。您似乎在编写大量图形代码,但这根本不起作用。找到源头,学会正确地去做。谷歌会帮你找到这些教程
- 例如,您不应该直接在JFrame上绘制
- 相反,使用JComponent(比如JPanel)的
方法paintComponent(…)
- 避免使用键侦听器,而是使用键绑定
- 为动画循环使用摆动计时器
- 你可以在这个网站上找到很多这样的例子(包括我的)。例如,请看一看
paintComponent(Graphics g)
override方法中。在这里,您可以使用JVM传递到paintComponent(Graphics g)
方法中的图形对象。建议:
- 阅读Swing图形教程,了解使用Swing绘图的最佳方法。您似乎在编写大量图形代码,但这根本不起作用。找到源头,学会正确地去做。谷歌会帮你找到这些教程
- 例如,您不应该直接在JFrame上绘制
- 相反,使用JComponent(比如JPanel)的
方法paintComponent(…)
- 避免使用键侦听器,而是使用键绑定
- 为动画循环使用摆动计时器
- 你可以在这个网站上找到很多这样的例子(包括我的)。例如,请看一看
编辑:您的最新代码试图在JFrame构造函数中制作动画,但这是行不通的。如上所述,GUI图形必须位于JPanel或JComponent的
paintComponent(Graphics g)
override方法中。在这里,您可以使用JVM传递到paintComponent(Graphics g)
方法中的图形对象。如果这是关于zorx1.java文件是如何使用所有这些x和y绘制的,那么很可笑,我从老师那里收到了这些代码,我猜他故意让阅读变得困难。我想我应该重新表述我的问题,但我的问题是我不知道如何使用KeyListener、bindings或其他什么,而且通常出现的示例将它们的图形与KeyListener和诸如此类的东西放在同一个课堂上,这是老师命令我们不要做的。也就是说,我们需要将外星人保存在单独的.java文件中。@JackSnyder:我不确定哪些代码是你的,哪些是你的老师的,但我主要谈论的难看的猜测代码是你第二节课上的代码,你的动画课上的代码,看起来到处都是。如果这是你老师的代码,请退出课堂。关于分离,我建议您首先将键绑定与绘图类保持在一起,然后一旦开始工作,重构代码以将它们分离为单独的类。这就是所谓的编程方法。好吧,关于难看的猜测部分,你是对的,因为我真的不知道我在做什么,当它归结到基本上任何事情。当我输入它时,我唯一知道我在做什么的是Zorx1.show(g);部分在那之后,一切几乎都变得无影无踪了。不管怎么说,当谈到分离的事情时,我真的不知道该怎么做,因为我不知道该怎么做键绑定(或监听)的事情,所以我已经被困在了第一步。@JackSnyder:这就是为什么上帝发明了教程,你应该去寻找这些,他们和在这个网站上可以找到的例子,比如我在最后一个项目中的链接。好的,我想我现在就在某个地方。我将一个面板添加到框架中,然后将KeyListener添加到该面板中,并在其中绘制外星人?到目前为止,我是对的吗?如果这是关于zorx1.java文件是如何用所有的x和y来绘制的,那么这一切都很可笑,我从老师那里收到了代码,我猜他故意让阅读变得如此困难。我想我应该重新表述我的问题,但我的问题是我不知道如何使用KeyListener、bindings或其他什么,也不知道如何使用