2

それで、先生は私にインタラクティブなアニメーションを作ってほしいと言っています。問題は、彼がその方法をクラスに教えなかったことです。(オンラインコースです)。要点は、キーボードで操作できるグラフィックを作ってほしいということです。私はオンラインで見回しましたが、何らかの理由で空っぽになっているため、適切な質問をしていないようです.

いずれかの方法。3 つのコード ファイルがあります。Zorx1、Zorx2、Zorx3 は、先生から与えられた、色がわずかに異なる、まったく同じエイリアンです。

// 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;
        }
    }
}

上記のコードが機能しないことは理解していますが、それはおそらく、自分が何をすべきなのかがわからないためです。

オーバーライドする静的メソッドの問題の原因を突き止めました。extends JFrame を zorx1.java に追加したところ、ペイント (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);
    }

さて、私はそれを手に入れたと思いますが、super.paintComponent(g); 「シンボルが見つかりません - メソッド paintComponent(java.awt.Graphics)」というエラーが返されます。

修正しました。ついに。

4

1 に答える 1

4

提案:

  • Swing グラフィックスのチュートリアルを読んで、Swing で描画する最良の方法を確認してください。多くのグラフィック コードを作成しているように見えますが、これはまったく機能しません。ソースに行き、それを正しく行うことを学びましょう。Google は、これらのチュートリアルを見つけるのに役立ちます。
  • たとえば、JFrame に直接描画しないでください。
  • 代わりに、JComponent の (JPanel などの)paintComponent(...)メソッドを描画します。
  • KeyListeners の使用を避け、代わりに Key Bindings を使用してください。
  • アニメーション ループにスイング タイマーを使用します。
  • 少し検索すれば、このサイト (私のものを含む) の多くの例を見つけることができます。たとえば、こちらをご覧ください

編集:最新のコードは、動作しない JFrame コンストラクターでアニメーションを実行しようとしています。前述のとおり、GUI 描画はpaintComponent(Graphics g)JPanel または JComponent のオーバーライド メソッド内にある必要があります。paintComponent(Graphics g)ここで、JVM がメソッドに渡す Graphics オブジェクトを使用できます。

于 2013-03-20T03:10:02.657 に答える