0

私は最近、Java で簡単な小さなスペース インベーダー ゲームに取り組んでいます。簡単なグーグル検索で、コンストラクターを追加してオーバーライドする必要があることがわかりましたが、実行したときに興味深いエラーメッセージに出くわしました:

エラー: シンボルが見つかりません: super.cpuMove(m);

                        ^(this points directly to the "." in the original error message)

コードを変更することでこのエラーを完全に回避する方法を見つけましたが、その変更により約 50 ~ 60 行の不要な行が追加されました。このエラーが発生したコードのセクションは次のとおりです。

@Override
protected void cpuMove(ShapesMove m){
    super.cpuMove(m);
    cpu_x(m);
    cpu_y(m);
}

コードの残りの部分を変更しても、このエラー メッセージが毎回表示されるのはなぜですか? さらに、なぜ「。」を指しているのですか?「super」または「cpuMove(m)」の代わりに? 私はこれに適合できるようにしたいのですが、Java ではそれができないようです。

編集:

これが私のコードの残りの部分です。たぶんそれは別のことで、これを投稿する必要はないと思ったので、お詫び申し上げます。

import javax.swing.*;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;

public class ShapesMove extends JPanel{

    public static int x = 40;
    public static int y = 40;
    public static int h = 240;
    public static int k = 240;

    public static void main(String[] args){

        final JFrame frame = new JFrame("Movement of 2d Shapes");
        final ShapesMove m = new ShapesMove();
        frame.setSize(400,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(m);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        Action actionRight = new AbstractAction(){
            public void actionPerformed(ActionEvent actionRightEvent){
                x += 10;
                m.repaint();
            }
        };

        Action actionLeft = new AbstractAction(){
            public void actionPerformed(ActionEvent actionLeftEvent){
                x -= 10;
                m.repaint();
            }
        };

        Action actionUp = new AbstractAction(){
            public void actionPerformed(ActionEvent actionUpEvent){
                y -= 10;
                m.repaint();
            }
        };

        Action actionDown = new AbstractAction(){
            public void actionPerformed(ActionEvent actionDownEvent){
                y += 10;
                m.repaint();
            }
        };

        KeyStroke right = KeyStroke.getKeyStroke("RIGHT");
        KeyStroke left = KeyStroke.getKeyStroke("LEFT");
        KeyStroke up = KeyStroke.getKeyStroke("UP");
        KeyStroke down = KeyStroke.getKeyStroke("DOWN");

        InputMap inputMap = m.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(right, "RIGHT");
        inputMap.put(left, "LEFT");
        inputMap.put(up, "UP");
        inputMap.put(down, "DOWN");
        m.getActionMap().put("RIGHT", actionRight);
        m.getActionMap().put("LEFT", actionLeft);
        m.getActionMap().put("UP", actionUp);
        m.getActionMap().put("DOWN", actionDown);

    }

    @Override
    protected void cpuMove(ShapesMove m){
        super.cpuMove(ShapesMove m);
        cpu_x(m);
        cpu_y(m);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw(g);
    }

    public void cpu_x(ShapesMove m){
        if(h > x){
            h -= 10;
            m.repaint();
        }else if(h < x){
            h += 10;
            m.repaint();
        }else{
            m.repaint();
        }
    }

    public void cpu_y(ShapesMove m){
        if(k > y){
            k -= 10;
            m.repaint();
        }else if(k < y){
            k += 10;
            m.repaint();
        }else{
            m.repaint();
        }
    }

    public void draw(Graphics g){
        g.drawOval(x, y, 40, 40);
        g.drawRect(h, k, 40, 40);
    }

}

コードに関するいくつかの簡単なメモ: 最初に、これはスペース インベーダー ゲームであると言いましたが、今のところ、これは実際にはほとんど似ていないか、まったく似ていません。WIP です。私はフォトショップで独自の画像とアニメーションの背景を作成しているので、画像を呼び出す代わりに四角形と円を描画しています。これが実際に行うことを意味するのは、メソッドが呼び出されたときにゲーム内の敵がプレイヤーを「フォロー」する方法をシミュレートすることです。これは、このゲームにいくつかの「ギャラガ」の側面も持たせたかったからです。

4

2 に答える 2

0

メッセージのとおり、

cpuMove(ShapesMove m)あなたのスーパークラスにはメソッド cpuMove() がなく、署名に一致します。

于 2013-11-06T04:16:33.710 に答える
0

唯一の説明は、ここで「スーパー」を誤用したということです。「スーパー」は、サブクラスの親クラスを参照するために使用されます。クラスが何も拡張していない場合、参照するものが何もないか、スーパー クラスに「cpuMove」メソッドがないため、エラーが発生します。

于 2013-11-06T04:17:25.707 に答える