Почему значения моего интлиста не увеличиваются или почему функция ellipse () не отвечает на это? - PullRequest
1 голос
/ 05 ноября 2019

JavaScript-код в обработке 3.5.3 не работает, не знаю, почему. Он должен создавать круги и заставлять их прыгать по экрану, вместо этого он создает правильное количество кругов, но они не двигаются. Кажется, что intlist.set () не работает, но я не уверен, почему. Помощь будет оценена.

import javax.swing.JOptionPane;

int x = 200;
int y = 150;
int b = 50;

float slope = -1;

int numOfCircles = 10;

IntList initPosX = new IntList();
IntList initPosY = new IntList();

IntList exes = new IntList();
IntList whys = new IntList();

IntList xSpeeds = new IntList();
IntList ySpeeds = new IntList();

void setup()
{

  numOfCircles = int(JOptionPane.showInputDialog(frame, "How many circles ya want?"));
  size(800,400);
  for(int i = 0; i < numOfCircles; i++)
  {
    int toAddX = int(random(0,400));
    initPosX.append(toAddX);

    int toAddY = int(random(0,300));
    initPosY.append(toAddY);

    exes.append(0);//(int(random(-30,30)));
    whys.append(0);//(int(random(-30,30)));

    xSpeeds.append(1);
    ySpeeds.append(1);    
  }
}
void draw()
{
  background(100,100,100,255);
  for(int i = 0; i < numOfCircles; i++)
  {
    ellipse(exes.get(i) + initPosX.get(i), whys.get(i) + initPosY.get(i), 20, 20);
    exes.set(i, i + xSpeeds.get(i));
    whys.set(i, i + ySpeeds.get(i));
    if(exes.get(i) > width || exes.get(i) <= 0)
    {
      print("side wall hit");
      xSpeeds.set(i, i*= slope);
    }
    if(whys.get(i) > height || whys.get(i) <= 0)
    {
      print("roof hit");
      ySpeeds.set(i, i*= slope);
    }
  }
}

1 Ответ

2 голосов
/ 06 ноября 2019

Проблема в следующих строках:

exes.set(i, i + xSpeeds.get(i));
whys.set(i, i + ySpeeds.get(i));

То, что вы хотите там сделать, это добавить скорость к текущему значению exes / whys по индексу i. Но что вы на самом деле делаете, так это устанавливаете их на индекс + скорость. Поскольку индекс никогда не изменится, также как и позиции.

Чтобы исправить это, замените его следующим:

exes.set(i, exes.get(i) + xSpeeds.get(i));
whys.set(i, whys.get(i) + ySpeeds.get(i));

Обновление

При изменении только этого ваш код по-прежнему не будет работать должным образом, потому что обнаружение столкновений:

if(exes.get(i) > width || exes.get(i) <= 0)
{
  print("side wall hit");
  xSpeeds.set(i, i*= slope);
}
if(whys.get(i) > height || whys.get(i) <= 0)
{
  print("roof hit");
  ySpeeds.set(i, i*= slope);
}

не обнаруживает столкновения для фактической позиции, потому что это будет позиция (exes, whys) +initPos, так что это должно быть

if (exes.get(i) + initPosX.get(i) > width || exes.get(i) + initPosX.get(i) <= 0)
{
   //the code
}
if (whys.get(i) + initPosY.get(i) > height ||  whys.get(i) + initPosY.get(i) <= 0)
{
   //the code
}

Однако, если бы вы запустили его сейчас, вы бы получили ошибку. Это потому, что вы переходите на что-то негативное. вместо i*= slope просто используйте int(i * slope) (поскольку int * float возвращает число с плавающей точкой, вы должны преобразовать результат в int с помощью int () ).

Кроме того, выопять же не нужен индекс, а текущее значение индекса:

xSpeeds.set(i, int(xSpeeds.get(i) * slope); //the same for ySpeeds
...