Попытка вернуть float [] из метода в Java - PullRequest
0 голосов
/ 25 марта 2020

Я пишу игру и работаю над столкновениями. В настоящее время я пытаюсь использовать функцию tileCollision, чтобы вернуть одномерный массив, содержащий 2 числа; координаты угла. (представлен в программе cX и cY)

Я ожидал, что это будет работать гладко: то есть, чтобы вернуть {-999, -999}, если оно не сталкивалось, и вернуть действительный набор координат в противном случае. К сожалению, IntelliJ говорит мне, что переменные goodCX и goodCY «не могли быть инициализированы», и я не знаю, как их решить. Запуск программы выдает мне ту же ошибку.

Класс Tile можно рассматривать как класс, содержащий значение X, значение Y и текстуру. Значение t.texture.width & t.texture.height должно быть установлено равным 50, чтобы его было проще понять. Сущность может быть принята как класс, содержащий переменные с именами x, y, vx, vy и «текстуру», размеры которой должны быть 20x20. Я использую Java с библиотекой Processing 3 для рендеринга своего кода и с радостью предоставлю дополнительную информацию, если это необходимо.

Основная проблема заключается не в том, что проблема "возможно, не инициализирована", а в том, что она не инициализирована. .

Пожалуйста, go, будьте осторожны со мной, и, если возможно, не используйте ничего за пределами области того, что продемонстрировано в моем коде. Я программист-любитель, и хотя я некоторое время программировал, я не совсем профессионал.

Вот мой код:

public float[] tileCollision(Tile t)
{
    boolean isCollide = false;

    float tX = t.eX;
    float tX2 = t.eX + t.texture.width;
    float tY = t.eY;
    float tY2 = t.eY + t.texture.height;

    float[] cX = new float[]{this.x + this.vx, this.x + this.texture.width + this.vx};
    float[] cY = new float[]{this.y + this.vy, this.y + this.texture.height + this.vy};

    float[] bad = new float[]{-999, -999};

    float goodCX, goodCY;

    System.out.println("\nCollisions Testing Names:");
    System.out.println(this);
    System.out.println(t);

    for(int i = 0; i < 2; i ++)
    {
        for(int i_ = 0; i_ < 2; i_ ++)
        {
            System.out.println("\nCollisions Testing:");
            System.out.println("Entity X: " + cX[i]);
            System.out.println("Entity Y: " + cY[i_]);

            System.out.println("Tile Xs: " + tX + ", " + tX2);
            System.out.println("Tile Ys: " + tY + ", " + tY2);

            if( ( (tX <= cX[i]) && (cX[i] <= tX2) ) && ( (tY <= cY[i_]) && (cY[i_] <= tY2) ) )
            {
                isCollide = true;

                goodCX = cX[i];
                goodCY = cY[i_];
            }
        }
    }

    System.out.println("Am I colliding?\n>>> " + isCollide);

    if(isCollide)
    {
        return new float[]{goodCX, goodCY};
    }
    else { return(bad); }
}

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Проблема заключается в том, что вы только присваиваете (и сначала присваиваете, а следовательно, инициализируете) переменные goodCX и goodCY внутри комплекса if, вложенного в ваши циклы for. Затем, if(isCollide), вы попытаетесь вернуть их, но компилятор не сможет вывести какой-либо тип связи между вашим сложным условием if и условием isCollide, поэтому вы можете возвращать неназначенные ссылки .

Чтобы решить эту проблему, просто выполните инициализацию по умолчанию ваших ссылок с плавающей точкой в ​​верхней части, как показано ниже:

float goodCX = 0.0;
float goodCY = 0.0;
0 голосов
/ 25 марта 2020

Если проверка коллизий не оценивает true, GoodCX и GoodCY никогда не будут инициализированы. У вас будут проблемы при попытке вернуть "new float [] {goodCX, goodCY}". Попробуйте инициализировать GoodCX и GoodCY с -999. Вы также сможете упростить свой код с помощью этого:

public float[] tileCollision(Tile t)
{
    boolean isCollide = false;

    float tX = t.eX;
    float tX2 = t.eX + t.texture.width;
    float tY = t.eY;
    float tY2 = t.eY + t.texture.height;

    float[] cX = new float[]{this.x + this.vx, this.x + this.texture.width + this.vx};
    float[] cY = new float[]{this.y + this.vy, this.y + this.texture.height + this.vy};



    float goodCX = -999;
    float goodCY = -999;

    System.out.println("\nCollisions Testing Names:");
    System.out.println(this);
    System.out.println(t);

    for(int i = 0; i < 2; i ++)
    {
        for(int i_ = 0; i_ < 2; i_ ++)
        {
            System.out.println("\nCollisions Testing:");
            System.out.println("Entity X: " + cX[i]);
            System.out.println("Entity Y: " + cY[i_]);

            System.out.println("Tile Xs: " + tX + ", " + tX2);
            System.out.println("Tile Ys: " + tY + ", " + tY2);

            if( ( (tX <= cX[i]) && (cX[i] <= tX2) ) && ( (tY <= cY[i_]) && (cY[i_] <= tY2) ) )
            {
                goodCX = cX[i];
                goodCY = cY[i_];
            }
        }
    }

    return new float[]{goodCX, goodCY};
}
0 голосов
/ 25 марта 2020

Intellij дает вам этот ответ, потому что переменные объявлены, но не инициализированы. Вам нужно определить их с некоторым состоянием по умолчанию или изменить следующий код, чтобы обеспечить их инициализацию.

...