2

私はJavaが初めてです。私はJavaクラスを持っていますが、先に進みたいです。私は本当にそれが好き!これは私の問題です。ゲームに必要な 2 つのパドルを描こうとしています。それらのために2つのオブジェクトを作成しましたが、両方とも「表示」されますが、次のことが起こります:

メインランナー

import javax.swing.JFrame;


public class PongRunner {

    public static void main (String[] args)
    {

        new PongRunner();
    }

    public PongRunner()
    {
        JFrame PongFrame= new JFrame();
        PongFrame.setSize(800,600);
        PongFrame.add(new PaddleB());
        PongFrame.add(new PaddleA());
        PongFrame.setLocationRelativeTo(null);
        PongFrame.setTitle("My Pong Game");
        PongFrame.setResizable(false);
        PongFrame.setVisible(true);
        PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

PaddleAおよびPaddleBdrawRect Graphics であり、特定の四角形を描画します。

最初に追加するように指示したグラフィックJFrameのみが表示されます。その下にあるものがフレームに追加されない理由と、両方のパドルを同時に描画する方法を知りたいと思っていましたJFrame...本を読んだり、インターネットをできる限り調べたりしていますが、これらの中で運がありません2日。いくつかの助けがいいでしょう。Java の学習を始めたばかりで、進歩していると思います。actionListenerパドルを動かすためにそれらを使用する必要があるので、いくつかのヒントもありがとう:)、特に!

両方のパドルのソースコード:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class PaddleA extends JPanel implements ActionListener
{
    private Timer timer;

    public void timer()
    {
        timer = new Timer(25, this);
        timer.start();

    }

public void actionPerformed(ActionEvent e)
{
    repaint();
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.fillRect(70,200,20,100);      
}
}

パドルB:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class PaddleB extends JPanel implements ActionListener
{

private Timer timer;

    public void timer()
    {
        timer = new Timer(25, this);
        timer.start();

    }

    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }


    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(500, 200, 20, 100);

    }

}
4

5 に答える 5

3

これは、最初のパドルを追加してから、最初のパドルの上に 2 番目のパドルを追加して、それらを置き換えるためです。

    PongFrame.add(new PaddleB());
    PongFrame.add(new PaddleA());

sを使ってみてくださいLayoutManagerここにあるのは簡単なサンプルです:

    PongFrame.getContentPane().add(new PaddleB(),BorderLayout.WEST);
    PongFrame.getContentPane().add(new PaddleA(),BorderLayout.EAST);

また、g.fillRect(...);x座標とy座標が大きすぎるため、JFrame表示されません。次のように変更します。

    g.fillRect(0,0, 20, 100);

関係ありませんが:

  • JFrame.add()むしろ使わないJFrame.getContentPane().add()

アップデート:

他の人が言ったように、ゲームのロジックは少しずれています。に追加される単一の描画パネルJFrameが必要であり、すべての描画はではなくJPanelを使用して単一で行われます。以下に小さな例を示します。GraphicJPanel

ここに画像の説明を入力

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PongRunner {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PongRunner();
            }
        });
    }

    public PongRunner() {
        JFrame PongFrame = new JFrame();
        PongFrame.setTitle("My Pong Game");
        PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PongFrame.setResizable(false);
        PongFrame.setSize(400,400);
        //PongFrame.setLocationRelativeTo(null);
        PongFrame.getContentPane().add(new DrawingPanel());
        PongFrame.setVisible(true);
    }
}

class DrawingPanel extends JPanel {

    Rect rect1, rect2;

    public DrawingPanel() {
        super(true);
        rect1 = new Rect(80, 80, 20, 100, Color.yellow);
        rect2 = new Rect(100, 200, 20, 100, Color.red);

    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(rect1.getColor());
        g.fillRect(rect1.getX(), rect1.getY(), rect1.getWidth(), rect1.getHeight());
        g.setColor(rect2.getColor());
        g.fillRect(rect2.getX(), rect2.getY(), rect2.getWidth(), rect2.getHeight());
    }
}

class Rect {

    private Color color;
    private int x, y, height, width;

    Rect(int x, int y, int width, int height, Color color) {
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
        this.color = color;
    }

    public Color getColor() {
        return color;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public Rectangle getBounds() {
        return new Rectangle(x, y, width, height);
    }
}

このスニペットは完璧ではなく、四角形を描画してある種のゲームを形成するために必要なステレオタイプのロジックを示しているだけであることに注意してください。

于 2012-09-28T21:50:14.480 に答える
3

2 つのパドルをメインの同じBorderLayout.CENTER場所に追加したためPongFrame、2 番目のパドルのみが表示されます。

Graphicsこのタイプのペイントは、1 つのオブジェクトを 1つのオブジェクトに使用することで、より簡単に行うことができますJComponent

于 2012-09-28T21:29:38.147 に答える
3

Swing コンポーネントは、実際にはこのように使用するようには設計されていません。各パドル JPanel は四角形を描画しようとしますが、コンテナー (JFrame) とそのレイアウト マネージャーが JPanel のサイズと位置を制御します。したがって、ペイントする長方形は境界の外にある可能性があり、まったく表示されません。

このように次々に追加すると、一部のレイアウトマネージャーは JPanel の 1 つだけを表示します - Reimus による回答を参照してください

このようなアニメーション グラフィックを作成するには、おそらく、JFrame を満たす単一の JComponent (JPanel など) から始めて、両方のパドルを四角形としてその上にペイントする必要があります。

于 2012-09-28T21:32:51.640 に答える
0

JFrameJPanels をメソッドによって追加しないでくださいJFrame#add(Component)。それらを contentPane に追加することをお勧めします:ただし、 LayoutManagerframe.getContentPane().add(panel);について読む必要があります。コンポーネントをフレームに配置するのに役立ちます。または、間違って使用すると台無しになります。

于 2012-09-28T21:29:17.413 に答える
0

コードを実行する時間はありませんが、「パドル」オブジェクトのサイズと位置を設定するか、非不透明に設定してみてください。Swing は、別の不透明なコンポーネントによって完全に覆われているコンポーネントを描画しないことで、レンダリングを高速化しようとしていると思います。そのため、パドルの 1 つを描画していない可能性があります。

パドルのサイズと位置を設定する場合は、paintComponentメソッドを変更する必要がある場合があります。私の記憶が正しければ、Graphics渡されたオブジェクトはコンポーネントの領域にクリップされていると思うので、0,0 がコンポーネントの左上隅。

于 2012-09-28T21:28:37.057 に答える