Нужна помощь от IndexOutOfBounds - PullRequest
1 голос
/ 29 апреля 2020

У меня есть одна игра в нескольких играх, поэтому у этой игры нет своего основного класса, потому что эта игра запускается другим классом. Теперь к моим проблемам. Идея игры состоит в том, чтобы просто сложить прямоугольники друг над другом, нажав пробел. Пока это тоже работает. Только в качестве первой проблемы у меня недавно возникла проблема, заключающаяся в том, что прямоугольник всегда перемещается непосредственно сам по себе в начале. (У меня была эта проблема, так как я сделал окно JDialog, чтобы сделать его модальным). Другая моя большая проблема в том, что игра часто получает IndexOutOfBounds. Я просто не знаю, как решить проблему. Мне очень жаль моего плохого Энгли sh Я пытался что-то перевести с помощью Google Переводчика.

Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:458)
    at Tower.collisionsKontrolleSpieler(Tower.java:180)
    at Tower.update(Tower.java:106)
    at Tower$Loop.run(Tower.java:245)
    at java.base/java.lang.Thread.run(Thread.java:834) 

Код:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;


public class Tower extends JDialog implements ActionListener{
    private ArrayList<Spieler> spielerListe = new ArrayList<Spieler>();
    public int xMove, yMove;
    public int speed = 5;
    private JPanel spielflaeche = new JPanel();
    private JPanel buttom = new JPanel(new FlowLayout());
    private JPanel top = new JPanel(new FlowLayout());
    private JButton temp = new JButton();
    private JButton exit = new JButton();
    private JButton startStop = new JButton();
    private JLabel jlPunkte = new JLabel();
    int punkte = 0;
    KeyManagerTower keyManager = new KeyManagerTower(this);
    Container cp;
    private JLabel jtZeit = new JLabel();
    Grid grid;
    private Random zufallsgenerator = new Random();
    private Loop loop = new Loop();
    private Thread t = new Thread(loop);
    public static final int FPS = 120; //Bilder pro Sekunde
    public static final long maxLoopTime = 1000 / FPS;
    private Point checkPointRight1 = new Point();
    private Point checkPointRight3 = new Point();
    private int zeit = 0;
    private int minuten =0;
    private Timer timerZeit = new Timer(1000, null);
    private int aktS = 0;
    int breite = 125;
    private GUI gui;
    private int akthighscore = 0;


    public Tower(JFrame owner, GUI pGui, boolean modal){
        // Frame-Initialisierung
        super(owner, modal);
        gui = pGui;
        cp = this.getContentPane();
        //setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        int frameWidth = 1000;
        int frameHeight = 900;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2;
        setLocation(x, y);
        setTitle("Fenster");
        setResizable(false);
        setUndecorated(true);

        this.add(spielflaeche, BorderLayout.CENTER);
        this.add(buttom, BorderLayout.SOUTH);
        this.add(top, BorderLayout.NORTH);

        spielflaeche.setBorder(BorderFactory.createLineBorder(Color.BLACK,5));
        spielflaeche.setLayout(null);


        buttom.add(jtZeit);
        jlPunkte.setText(Integer.toString(punkte));
        jlPunkte.setFont(new Font("Dialog", Font.BOLD, 20));
        jtZeit.setFont(new Font("Dialog", Font.BOLD, 25));
        spielerListe.add(0, new Spieler(350, 650, breite, breite));
        grid = new Grid(spielflaeche, 50, 50);
        spielflaeche.add(spielerListe.get(aktS));
        repaint();

        top.add(startStop);
        this.addKeyListener(keyManager);
        timerZeit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                timerZeit_ActionPerformed(evt);
            }
        });
        timerZeit.setRepeats(true);

        startStop.addActionListener(this);
        startStop.setFocusable(true);
        spielerListe.get(0).requestFocus();
        startStop.setVisible(true);
        startStop.setText("Start");
        buttom.add(jlPunkte);

        exit.setBackground(Color.red);
        exit.setFont(new Font("Dialog", Font.BOLD, 20));
        exit.addActionListener(this);
        exit.setText("Exit");
        top.add(exit);
        akthighscore = gui.getHighscore().getScore(6);
        JOptionPane.showMessageDialog(null, "Willkommen bei den Spiel Tower. \nSpieleanleitung: \n Beim Start schwebt ein Rechteck von Links nach Rechts, \n Versuche so viele Rechtecke wie möglich übereinander zu Stapeln. \n  Zum Stoppen benutze einfach die Leer Taste.  \n Wenn du 12 Rechtecke übereinander Gestapellt hast,\n Wir automatisch ein Neues Level gestarten. \n Viel Spaß beim Spielen! \n  \n  Aktueller Highscore: \n  " + akthighscore + " Punkte" ,  "Tower", JOptionPane.INFORMATION_MESSAGE);
        t.start();
        xMove = 0;
        setVisible(true);
    }


    private void update() {
        //try {
        collisionsKontrolleSpieler();
        spielerListe.get(aktS).setLocation(spielerListe.get(aktS).getX()+xMove*speed, spielerListe.get(aktS).getY()+yMove*speed);
        repaint();
            spielerListe.get(aktS).repaint();
       // }catch (Exception e){
         //   this.dispose();
           // JOptionPane.showMessageDialog(null, "Fehlercode: X2B0W7K3J1A9PQ5", "Game Crashed", JOptionPane.ERROR_MESSAGE);
       // }
    }

    public void zeitberechnung() {
        if (zeit >= 60) {
            minuten++;
            zeit = 0;
        }
        jtZeit.setText("Zeit: " + minuten + ":"+ zeit);
    }

    public void timerZeit_ActionPerformed(ActionEvent evt) {
       zeit++;
       zeitberechnung();
    }

    public void actionPerformed(ActionEvent evt){
      temp.setText(((JButton) evt.getSource()).getText());
      switch(temp.getText()){
          case("Start"):
              timerZeit.start();
              xMove = 1;
              yMove = 0;
              this.requestFocus();
              startStop.setVisible(false);
              startStop.setText("Neustart");
              startStop.setFocusable(false);
              jlPunkte.setText("Punkte: " + Integer.toString(punkte));
              break;
          case("Neustart"):
              loeschen();
              spielerListe.clear();
              aktS = 0;
              zeit = 0;
              speed = 5;
              breite = 125;
              startStop.setText("Start");
              spielerListe.add(aktS, new Spieler(350, 650, breite, breite));
              xMove = 0;
              yMove = 0;
              punkte = 0;
              spielflaeche.add(spielerListe.get(aktS));
              repaint();
              break;
          case("Exit"):
              t.stop();
              dispose();
              break;
      }

    }

    public void loeschen() {
        int i = 0;
        try {
            while (spielerListe.get(i) != null) {
                spielerListe.get(i).setLocation(9000, 9000);
                spielerListe.get(i).Farbwechsel(Color.white);
                i++;
            }
        } catch (Exception e) {

        }
    }

    public void collisionsKontrolleSpieler() {
        //---------------------------Boarder Kollisions-Kontrolle --------------------
            if (spielerListe.get(aktS).getX() > spielflaeche.getWidth()-breite) {
                xMove = -1;
                yMove = yMove;
            }
            if (spielerListe.get(aktS).getX() < -65) {
                xMove = 1;
                yMove = yMove;
            }
    }

    public void check(){
       if (aktS == 0){
           newLevel();
       }else if (aktS > 0 && aktS < 14){
           checkPointRight1.setLocation((spielerListe.get(aktS-1).getX()), (spielerListe.get(aktS-1).getY()));
           checkPointRight3.setLocation((spielerListe.get(aktS-1).getX()+breite), (spielerListe.get(aktS-1).getY()));
           if (aktS == 12){
               loeschen();
               spielerListe.clear();
               aktS = 0;
               speed = 5;
               breite = breite*90/100;
               jlPunkte.setText("Punkte: " + Integer.toString(punkte));
               spielerListe.add(aktS, new Spieler(350, 650, breite, breite));
               spielflaeche.add(spielerListe.get(aktS));
               xMove=1;
               repaint();
           }else if (checkPointRight1.getX() < spielerListe.get(aktS).getX()+(breite/2) && checkPointRight3.getX() > spielerListe.get(aktS).getX()+(breite/2)) {
               newLevel();
           }else{
            startStop.setVisible(true);
            timerZeit.stop();
            gui.getHighscore().wHighscore(6, Integer.toString(punkte));
            if (gui.getGameFortschritt() == 40){
                if (punkte >=20){
                    gui.setGameFortschritt(gui.getGameFortschritt()+1);
                    gui.gameAblauf();
                }
            }
           }
       }
    }

    public void newLevel(){
        punkte++;
     aktS++;
     jlPunkte.setText("Punkte: " + Integer.toString(punkte));
     spielerListe.add(aktS, new Spieler(zufallsgenerator.nextInt(600), spielerListe.get(aktS-1).getY()-(breite/2), breite, breite));
     spielerListe.get(aktS).setLocation(spielerListe.get(aktS).getX()+xMove*speed, spielerListe.get(aktS).getY()+yMove*speed);
     spielflaeche.add(spielerListe.get(aktS));
     spielerListe.get(aktS).repaint();
     xMove = 1;
     speed++;

    }


class Loop implements Runnable{
    long timestamp = 0;
    long oldTimestamp = 0;

    @Override
    public void run() {
            while (true) {
                oldTimestamp = System.currentTimeMillis();
                update();
                timestamp = System.currentTimeMillis();
                if ((timestamp - oldTimestamp) > maxLoopTime) {
                    System.out.println("Zu langsam");
                    continue;
                }
                try {
                    Thread.sleep(maxLoopTime - (timestamp - oldTimestamp));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("Loopfehler: " + maxLoopTime);
                }
            }



    }
}
} // end of class Fenster
...