0

私はJavaでポンゲームを作って言語をいじっていますが、なぜ私の再描画メソッドが画面上の画像を再描画していないのか疑問に思っていました. 基本的に私が望むのは、ボールが画面の両側に当たったときにプレーヤーが得点を開始したときです。リセットをエミュレートするために、開始位置のすべてを再描画したいと考えています。あちこちに再描画を試みましたが、すべてがロックされるか、何も起こらなかったかのようにゲームが続行されます。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.Rectangle;

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

public class Board extends JPanel implements ActionListener
{
    private Timer timer;
    private PlayerOne paddle;
    private PlayerTwo paddle2;
    private Ball ball;
    private boolean ingame = true;
    int playeronescore = 0;
    int playertwoscore = 0;

    public Board()
    {

        addKeyListener(new TAdapter());
        setFocusable(true);
        setDoubleBuffered(true);

        paddle = new PlayerOne();
        paddle2 = new PlayerTwo();
        ball = new Ball();

        timer = new Timer(5, this);
        timer.start();
    }

public void paint(Graphics g)
{
    if(ingame)
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), this);
        g2d.drawImage(paddle2.getImage(), paddle2.getX(), paddle2.getY(), this);
        g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),this);
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
    else
    {
        restartGame();
        repaint();
    } 
}

public void actionPerformed(ActionEvent e)
{
    paddle.move();
    paddle2.move();
    ball.move();
    checkCollision();
    repaint();
}

private class TAdapter extends KeyAdapter
{
    public void keyPressed(KeyEvent e)
    {
        paddle.keyPressed(e);
        paddle2.keyPressed(e);
    }

    public void keyReleased(KeyEvent e)
    {
        paddle.keyReleased(e);
        paddle2.keyReleased(e);
    }
}
public void restartGame()//resetting the paddles and ball into their initial positions
{
    paddle.setX(0);
    paddle.setY(60);
    paddle2.setX(280);
    paddle2.setY(60);
    ball.setX(140);
    ball.setY(60);

}
public void checkCollision()
{
    Rectangle r1 = paddle.getBounds();
    Rectangle r2 = paddle2.getBounds();
    Rectangle r3 = ball.getBounds();

    if(ball.getX() == 0)
    {
        playeronescore++;
        ingame = false;
    }

    if(ball.getX() == 280)
    {
        playertwoscore++;
        ingame = false;
    }

    if(r3.intersects(r1))
    {
        int paddleLPos = (int)paddle.getBounds().getMinX();
        int ballLPos = (int)ball.getBounds().getMinX();

        int first = paddleLPos + 8;
        int second = paddleLPos + 16;
        int third = paddleLPos + 24;
        int fourth = paddleLPos + 32;

        if (ballLPos < first) {
            ball.setXDir(-1);
            ball.setYDir(-1);
        }

        if (ballLPos >= first && ballLPos < second) {
            ball.setXDir(-1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos >= second && ballLPos < third) {
            ball.setXDir(0);
            ball.setYDir(-1);
        }

        if (ballLPos >= third && ballLPos < fourth) {
            ball.setXDir(1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos > fourth) {
            ball.setXDir(1);
            ball.setYDir(-1);
        }           
    }
    else if(r3.intersects(r2))
    {
        int paddleLPos = (int)paddle2.getBounds().getMinX();
        int ballLPos = (int)ball.getBounds().getMinX();

        int first = paddleLPos + 8;
        int second = paddleLPos + 16;
        int third = paddleLPos + 24;
        int fourth = paddleLPos + 32;

        if (ballLPos < first) {
            ball.setXDir(-1);
            ball.setYDir(-1);
        }

        if (ballLPos >= first && ballLPos < second) {
            ball.setXDir(-1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos >= second && ballLPos < third) {
            ball.setXDir(0);
            ball.setYDir(-1);
        }

        if (ballLPos >= third && ballLPos < fourth) {
            ball.setXDir(1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos > fourth) {
            ball.setXDir(1);
            ball.setYDir(-1);
        }           
    }
}

}

どんな助けでも大歓迎です。

4

2 に答える 2

1

OK、ここでいくつかの問題があります。

paintComponentsまず、 notをオーバーライドする必要がありますpaint

次に、 をrepaint()呼び出しますpaint。つまり、ゲームがロックされる理由は、事実上、ゲームを終わりのないループに強制しているからです。 paintと呼ばれる、どれがrepaintどれを呼び出すpaint、などなど

最後に、carmickr がコメントで述べたように、メソッド内のコンポーネント プロパティを変更するべきではありませんpaint

そう。actionPerformedこれらすべてをまとめて、ロジックを再検討することをお勧めします。あなたが学んでいると言うように、私はあなたにコードの山を手渡すのは少し嫌ですが、いくつかのヒントがあります:

checkCollisionポイントが獲得されたかどうかを判断します。そのメソッドからあなたのactionPerformedメソッドに何かを返すのはどうですか-ポイントが得点された場合はこれを行い、そうでない場合はそれを行います。その最後に呼び出す必要があるpaintComponentため、いくつかのフラグが必要になります-おそらくブール変数-paintComponentバットの更新された位置を描画するか、少なくとも最初の位置を描画するかを伝えます。位置をリセットするというcarmickrの提案とちょうどただし、ルートが1つpaintComponentある方が良いです。

これが役立つことを願っています。

于 2013-05-20T01:18:04.437 に答える