Есть ли способ регенерировать облака, которые движутся по экрану? - PullRequest
1 голос
/ 30 марта 2019

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

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

Каждое облако состоит из серии окружностей, каждая из которых имеет собственную позицию x и смещение по оси y. Они могут перемещаться по экрану ОК; проблема возникает при создании кода для их регенерации. Я попытался создать оператор if, чтобы проверить позицию x последнего круга в серии.

/////////////MAIN SETUP////////////////

PVector screenSize;
PVector windowPosition;
PVector windowSize;

void setup() {
  size(1400,900,P3D);
  smooth();

  screenSize = new PVector(width, height);
  windowPosition = new PVector(0,0);

  frameRate(60);

  loadEnvironment();
}

void draw() {
  background(134,224,255);
  drawEnvironment();
}

///////////////FOR THE CLOUD SETUP/////////////////


int cloudNumber;

Cloud[] totalclouds;

void loadEnvironment()
{
  cloudNumber = round(random(5,25));

  totalclouds = new Cloud[cloudNumber];
  for(int i = 0; i<cloudNumber; i++)
  {
   totalclouds[i] = new Cloud();
  }
};

///////////////////////////////////////
void drawEnvironment()
{
  for(int i = 0; i<cloudNumber; i++)
  {
    totalclouds[i].update();
  }
};

/////////////////////////////////////////
class Cloud
{
  float xPos;
  float yPos;

  float yTop;
  float yBottom;

  float xVelocityMin;
  float xVelocityMax;
  float xVelocity;

  float screenStart = 0;
  float screenEnd = width;

  int cloudSize = round(random(1,4));

  float[] xPosition = new float[cloudSize];
  float[] yPositionOffset = new float[cloudSize];
  float[] xDiam = new float[cloudSize];
  float[] yDiam = new float[cloudSize];

  float xDiameter = random(40,50);
  float yDiameter = random(40,50);
  float yOffset = random(10,20);

  float overlap = xDiameter/5;

  //'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

  Cloud (){
    xPos = random(width);
    yPos = random(windowPosition.y, 350);

    xPosition[0] = xPos;
    if (xPosition.length>1)
       for(int i = 1; i<cloudSize; i++)
       {
       xPosition[i] = xPosition[i-1] + (xDiameter/2) + overlap;
       }
    for (int i = 0; i<cloudSize; i++)
    {
      yPositionOffset[i] = yOffset;
    }

    xVelocityMin = 0.3;
    xVelocityMax = 0.6;
    xVelocity = random(xVelocityMin, xVelocityMax);
  }

  //''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  void move() {
    for(int i = 0; i<cloudSize; i++)
    {
    xPosition[i] += xVelocity;
    }
  }

  //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  void createNewClouds() {
    int lastItem = xPosition.length - 1;

    if (xPosition[lastItem]>screenEnd);
    {
      xPosition[0] = screenStart;
      if (xPosition.length>1)
       for(int i = 1; i<cloudSize; i++)
       {
       xPosition[i] = xPosition[i-1] + (xDiameter/2) + overlap;
       }
      for (int i = 0; i<cloudSize; i++)
      {
       yPositionOffset[i] = yOffset;
      }

    xVelocityMin = 0.3;
    xVelocityMax = 0.6;
    xVelocity = random(xVelocityMin, xVelocityMax);
    }
  }

  //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  void display() {
    for(int i = 0; i<cloudSize; i++)
    {
    ellipseMode(CENTER);
    fill(255, 255, 255);
    noStroke();
    ellipse(xPosition[i], yPos + yPositionOffset[i], xDiameter, yDiameter);
    }
  }

  //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  void update() {
    move();
    display();
    createNewClouds();
  }
}

Без кода регенерации работает нормально - облака движутся как положено. С помощью кода облака имеют начальную позицию x=0. Почему это так, если есть оператор if? И почему они не двигаются?

...