0

Java と myro を使った古典的なブレイクアウト ゲームを扱っています。プログラムはボールとパドルをロードしますが、すぐにプログラムを閉じます。

私が望むのは、マイロブリックのコレクションがウィンドウの上部に表示され、ボールがランダムな方向に移動してパドルから跳ね返ることです。レンガの 1 つに当たると、レンガが消えてボールが跳ね返ります。

コードは次のとおりです。

import Myro.*;
import java.util.*;
import java.awt.*;


public class BreakOut
{
// declare the Scribbler object
private Scribbler robot;

private boolean intersects( MyroShape s1, MyroShape s2 )
{
    if( s1.getTop() >= s2.getBottom() || s1.getBottom() <= s2.getTop() || s1.getLeft() >= s2.getRight() || s1.getRight() <= s2.getLeft() )
        return false;
    else
        return true;
}

public void main()
{   //set a canvas that has 500 width, 500 height
    final int WIDTH = 500;
    final int HEIGHT = 500;
    MyroCanvas myCanvas = new MyroCanvas( "Breakout",WIDTH, HEIGHT );

    int brickX = 0;
    int brickY = 60;

    //creating the collection of bricks
    Collection<MyroRectangle> bricks = new ArrayList<MyroRectangle>();

    //create a rectangle(the paddle)
    MyroRectangle paddle = new MyroRectangle( myCanvas, 205, 475, 90, 25 );
    //make it visible
    paddle.makeFilled();
    paddle.setFillColor( Color.green );
    paddle.visible();
    //create a ball
    MyroCircle ball = new MyroCircle( myCanvas, 250, 465, 10 );
    ball.makeFilled();
    ball.setFillColor( Color.blue );
    ball.visible();
    //choose a random Delta X(negative) & Y(not 0)
    int deltaX = MyroUtils.randomInt( -4,-1 );
    int deltaY = MyroUtils.randomInt(-4, 4);
    //if it chooses zero, do another one

    myCanvas.setAutoRepaint( false );

    for ( int c = 0; c<9; c++ )
    {
        brickX = 0;
        for (int r = 0; c<4; c++)
        { 
            MyroRectangle rectangles = new MyroRectangle( myCanvas, brickX, brickY, 50, 20 );

            int red = MyroUtils.randomInt (0, 255);
            int green = MyroUtils.randomInt (0, 255);
            int blue = MyroUtils.randomInt (0, 255);

            rectangles.setFillColor( new Color (red, green, blue ));
            rectangles.makeFilled();
            rectangles.visible();
            bricks.add( rectangles );
            brickX = brickX + 50;
        }
        brickY = brickY + 20;
    }
    while (deltaY == 0)
    {
        deltaY = MyroUtils.randomInt(-4, 4);
    }
    boolean finished = false;
    while (!finished)
    {
        ball.move( deltaX, deltaY );
        MyroUtils.sleep( 0.01);
        int bricksCount = 40;
        //implementing the paddle that is controlled by the A and D keys
        if( MyroListener.isKeyPressed() )
        {
            if( MyroListener.whichKey() == 'q' )
            {
                // quit
                finished = true;
            }
            else if( MyroListener.whichKey() == 'a' )
            {
                paddle.move( -4,0 );
                if( paddle.getLeft() < 0 )
                {
                    paddle.move( 0, 0 );
                }
            }
            else if( MyroListener.whichKey() == 'd' )
            {
                paddle.move( 4,0 );
                if( paddle.getRight() > 500 )
                {
                    paddle.move( 0, 0 );
                }
            }
        }

        if ( ball.getBottom() == 500 )
            finished = true;

        if ( ball.getBottom()==0 )
            ball.move(deltaX,-deltaY);

        if ( ball.getLeft()==0 || ball.getRight()==500 )
            ball.move(-deltaX, deltaY);

        if( intersects( ball, paddle ))
            ball.move(deltaX,-deltaY);

        myCanvas.repaint();

        for (MyroRectangle rectangles : bricks)
        {
            if(rectangles.isVisible() && intersects( ball, rectangles ))
            {
                rectangles.invisible();
                deltaY = -deltaY;
                bricksCount--;
            }
        }
        if( bricksCount == 0 )
        {
            finished = true;
            MyroGUI.tellUser( "Congratulation!" );
        }
        myCanvas.setVisible( false );
    }
}
}

このコードの何が問題なのかについてのアイデアはありますか?

4

1 に答える 1

1

問題は次のとおりだと思います。

myCanvas.setVisible( false );

そのステートメントの前にキャンバスが表示されていたので、次のように変更します。

myCanvas.setVisible( true );
違いを見るために。それが解決策ではない場合でも、そのステートメントをそのままにしておくべきではありませんJPanel.setVisible().trueに設定されている場合、メソッドはパネルをユーザーに表示するように設定し、パネルが表示された直後にパネルを非表示に設定しています. それがあなたの意図であった場合、それは実行中のプログラムを閉じません。

于 2013-04-20T00:59:43.543 に答える