0

Java コース用に、色付きのブロック (Bricks) の配列を含む Breakout ゲーム プログラムを作成しようとしています。私はこれを成功させましたが、今度はインストラクターが、Brick のさまざまなサブクラスを追加するように求めています。彼が必要としているサブクラスの 1 つは ColorBrick です。これは、5 ティックごとに変化する色の配列を持っていることを除いて、Brick スーパークラスからすべての動作を継承します。コンストラクターは、単一の色ではなく、色の配列を取ります。

これは、Brick スーパークラスにあるものです。

package Breakout;

import java.awt.Color;
import java.awt.Graphics;

    public class Brick {

        public int x, y, i, j;
        public Color c;
        Brick[][] brick;

        public Brick() {
        }

        public Brick(Color c, Brick[][] brick, int i, int j) {
            this.c = c;
            this.brick = brick;
            this.x = i * 40;
            this.y = j * 10 + 50;
            this.i = i;
            this.j = j;



        }

        public void tick() {
        }

        public void paint(Graphics g) {
            g.setColor(c);
            g.fillRect(x, y, Breakout.brickWidth, Breakout.brickHeight);

        }

        public void hit(Ball b) {
            if (b.yThen > y + Breakout.brickHeight) {
                b.yv = -b.yv;
                b.yNow = 2 * (y + Breakout.brickHeight) - b.yNow;
            }
            if (b.yThen < y) {
                b.yv = -b.yv;
                b.yNow = 2 * (y) - b.yNow;
            }
            if (b.xThen > x + Breakout.brickWidth) {
                b.xv = -b.xv;
                b.xNow = 2 * (x + Breakout.brickWidth) - b.xNow;
            }
            if (b.xThen < x) {
                b.xv = -b.xv;
                b.xNow = 2 * (x) - b.xNow;
            }
            brick[i][j] = null;
        }
    }

そして、これは私のcolorBrickサブクラスのためにこれまでに持っているものです:

package Breakout;

import java.awt.Color;

    public class ColorBrick extends Brick {

        Color colors[] = {Color.red, Color.green, Color.blue, Color.yellow}; 

        public ColorBrick(Color[] colors, Brick[][] brick, int i, int j){
            this.colors = colors; 
            this.brick = brick; 
            this.i = i; 
            this.j = j; 
        }

        public void tick(){

        }

    }

この時点で私は壁にぶつかり、ここから何をすべきかわかりません。私のインストラクターは、何らかの理由でスーパークラスで tick メソッドを空にする必要があると言いました。空にする必要がある場合、なぜ彼は私たちにそれをそこに置かせたのですか? また、サブクラスの tick メソッドに何を入れるべきかわかりません。サブクラスで正しい方向に向かっているのでしょうか、それともこれまでに行ったことはすべて完全に間違っていますか? どんなガイダンスでも大歓迎です!

役立つ場合は、メインのブレークアウト コードを次に示します。

package Breakout;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;

    public class Breakout extends javax.swing.JFrame {

        public static final int fieldHeight = 600;
        public static final int fieldWidth = 400;
        public int diameter = 5;
        public int xNow = 200 - (diameter / 2);
        public int yNow = 300 - (diameter - 2);
        public int paddleWidth = 50;
        public int paddleHeight = 5;
        public int platform = 580;
        public static int mousex;
        public int mousey;
        public static int brickWidth = 40;
        public static int brickHeight = 10;
        public Random randoms = new Random();
        Brick[][] bricks = new Brick[arrayWide][arrayHigh];
        public static boolean startUp;
        public static int arrayWide = 10;
        public static int arrayHigh = 5;
        Ball ball = new Ball(200 - (diameter / 2), 20 /*300 - (diameter /2)*/, 0, 0, diameter, Color.white);
        Paddle myPaddle = new Paddle(platform, paddleWidth, paddleHeight);

        /**
         * Creates new form Breakout
         */
        public Breakout() {
            initComponents();
            clock.start();
        }

        public class MyPanel extends JPanel {

            @Override
            public void paint(Graphics g) {
                super.paint(g);
                if (startUp) {
                    ball.paint(g);
                }
                myPaddle.paint(g);

                for (int i = 0; i < arrayWide; i++) {
                    for (int j = 0; j < arrayHigh; j++) {
                        if (bricks[i][j] != null) {
                            bricks[i][j].paint(g);
                        }

                    }
                }
                // Insert code to paint the scene here.
                // Use methods in the Graphics class to do the painting
                // Remember coordinates use (0,0) at the top left

            }
        }
        public Timer clock = new Timer(50, new ActionListener() {  // 50ms delay between ticks
            public void actionPerformed(ActionEvent e) {
                tick();               // Write a method named tick to advance your game
                jPanel1.repaint();
            }
        });  // panel is the name of the JPanel that displays the game

        public void launchball() {
        }

        public void tick() {
            ball.move();
            Brick brick2 = brickAt(ball);
            if (brick2 != null) {
                brick2.hit(ball);
            }


            myPaddle.move(mousex);
            myPaddle.bounce(ball);
            System.out.println();


        }

        public Brick brickAt(Ball b) {
            int j = (int) (b.yNow - 50) / 10;
            int i = (int) (b.xNow / 40);
            if (i < arrayWide && i >= 0 && j < arrayHigh && j >= 0) {
                return (bricks[i][j]);



            }


            return null;
        }

        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {

            jPopupMenu1 = new javax.swing.JPopupMenu();
            jPanel2 = new javax.swing.JPanel();
            jPanel1 = new MyPanel();
            jLabel1 = new javax.swing.JLabel();
            start = new javax.swing.JButton();

            org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
            jPanel2.setLayout(jPanel2Layout);
            jPanel2Layout.setHorizontalGroup(
                jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 100, Short.MAX_VALUE)
            );
            jPanel2Layout.setVerticalGroup(
                jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 100, Short.MAX_VALUE)
            );

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            jPanel1.setBackground(new java.awt.Color(0, 0, 0));
            jPanel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
                public void mouseMoved(java.awt.event.MouseEvent evt) {
                    mouseMove(evt);
                }
            });

            org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 400, Short.MAX_VALUE)
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 600, Short.MAX_VALUE)
            );

            jLabel1.setFont(new java.awt.Font("Hobo Std", 1, 24)); // NOI18N
            jLabel1.setForeground(new java.awt.Color(153, 51, 255));
            jLabel1.setText("Breakout");

            start.setFont(new java.awt.Font("Hobo Std", 0, 13)); // NOI18N
            start.setForeground(new java.awt.Color(255, 51, 0));
            start.setText("Start");
            start.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    startActionPerformed(evt);
                }
            });

            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                            .add(164, 164, 164)
                            .add(jLabel1))
                        .add(layout.createSequentialGroup()
                            .add(15, 15, 15)
                            .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(layout.createSequentialGroup()
                            .add(175, 175, 175)
                            .add(start)))
                    .addContainerGap(17, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(16, 16, 16)
                    .add(jLabel1)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                    .add(start)
                    .addContainerGap(10, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold>                        

        private void mouseMove(java.awt.event.MouseEvent evt) {                           
            mousex = evt.getX();
            mousey = evt.getY();
        }                          

        private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      

            startUp = true;
            ball.xNow = 200 - (diameter / 2);
            ball.yNow = 300 - (diameter - 2);
            ball.xv = 0;
            ball.yv = 8;
            for (int i = 0; i < arrayWide; i++) {
                for (int j = 0; j < arrayHigh; j++) {
                    if ((j % 2 == 0 && i % 2 == 0) || (j % 2 == 1 && i % 2 == 1)) {
                        bricks[i][j] = new Brick(Color.magenta, bricks, i, j);
                    } else {
                        bricks[i][j] = new Brick(Color.gray, bricks, i, j);
                    }

                }
            }
        }                                     

        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(Breakout.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(Breakout.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(Breakout.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(Breakout.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>

            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Breakout().setVisible(true);
                }
            });
        }
4

4 に答える 4

0

存在するすべてのBrickに対してtick()が呼び出されることを意図しているため、tickメソッドはスーパークラスに存在する必要があります(おそらくメインのBreakoutクラスで、おそらくループで)。スーパークラスのtick()メソッドは、何もしない「デフォルト」の動作を指定します。ColorBrickクラスの場合、tickが呼び出されると、5ティックごとに色を変更する必要があるため、サブクラス(ColorBrick)でこの特殊な動作を指定する必要があります。

これを行うには、ColorBrickはtick()が呼び出された回数をカウントする方法を必要とします。これを実行できるコードを追加したら、特定のティックでColorBrickの色を変更することを検討できます。ColorBrickは、Colorプロパティを持つBrickから拡張されているため、現在の色をすでに「認識」しています( c)したがって、特定のティックでその値を変更する場合です。

私はあなたのためにあなたの任務を完了したくないので、これを意図的に曖昧に残しましたが、質問があれば遠慮なく質問してください。

于 2013-02-20T22:32:51.093 に答える
0

これは宿題.授業のように聞こえるので、詳細には触れません。

おそらく、何か (未定) が tick() を 5 秒ごとに (または定期的に) 呼び出します。通常Brickは何もしません。5秒ColorBrickごとに次の色に変更する必要があります。どういうわけか、現在の色を認識して次の色に変更する必要があります。

于 2013-02-20T22:29:52.510 に答える
0

別のクラスがブリックのみを処理する必要があるように、空のtickメソッドが必要です。Brickを呼び出すクラスは、それがかtickかを知る必要はありません。の動作はランタイム クラスによって指定されます。これがポリモーフィズムです。関連するクラスが同じメソッド呼び出しに対して異なる反応を示す能力です。BrickColorBricktick

サブクラスtickメソッドは、生成されたティックの数を追跡する必要があります。必要に応じて、 Color 変数を変更しますc

ColorBrickコンストラクターに追加する可能性のある変更の 1 つはsuper、コードを複製しないように、スーパークラス コンストラクターを呼び出すことです。

さらに、インスタンス変数 ( cxyなど)を宣言してprotected、クラス自体とサブクラスのみがそれらに直接アクセスできるようにします。

于 2013-02-20T22:30:05.493 に答える
0

以下のようなtick方法でメソッドを実装する必要があります。ColorBrick

private int i = 0;
public void tick(){
    c = colors[i++ % colors.length];
}

これで、グラフィック アプリケーションを作成するときに、Brickクラスを使用して作成することもできColorBricksます。たとえば、壁を作るために複数のレンガを追加します。

Brick[][] wall = new Brick[5][5];

Brick上記の配列の一部はColorBrick. これによりtick()、すべてのBrickオブジェクトの汎用インターフェース、つまりメソッドを持つことができます。しかし、ColorBrickこのメソッドは実際にBrickwhere-as の色を変更しますが、他のメソッドBrickでは何もしません!

DancingBrickごとにサイズが変わるなど、さらに多くのことができますtickBrick基本型を as として使用するため、さまざまな種類の を追加するために、グラフィックの実装を大幅に変更する必要はありませんBrick

于 2013-02-20T22:35:16.330 に答える