Sistema de profundidad: el elemento 'superior' anterior parpadea al cambiar

Estoy tratando de configurar un sistema de profundidad en el procesamiento. El objetivo es que funcione de manera similar a una ventana (Windows).

Tengo una clase llamada 'Ventana' y que puede tomar algunos argumentos y dibujará con éxito una ventana que se puede arrastrar.

El sistema de profundidad funciona tal como está ahora. No puedo hacer clic en las ventanas 'debajo' de la ventana actual y si hago clic en otra ventana, el orden de las ventanas se cambia correctamente.

El problema es que cada vez que cambio entre ventanas, la ventana seleccionada previamente parpadea (no se dibuja) para un marco, y luego aparece de nuevo.

No puedo entender por qué sucede esto en absoluto. Aquí está mi código, avíseme si necesita más información.

Windows.pde:

Window[] wins;
int win_count = 0;
boolean win_drag = false;
int win_selected = 2;

void setup()
{
  size(800, 600);
  wins = new Window[3];
  wins[0] = new Window("Test", 20, 20, 300, 200); 
  wins[1] = new Window("Test 2", 20, 260, 350, 225); 
  wins[2] = new Window("Test 3", 400, 20, 250, 150); 
}

void draw()
{
  background(10);

  for (int i = 0; i < wins.length; i ++)
  {
    wins[i].draw_window();
  }
}


void bringToTop(Window winID)
{
  Window[] new_wins;
  new_wins = new Window[wins.length];

  int win_pos = -1;

  for (int i = 0; i < wins.length; i ++)
  {
    if (wins[i] == winID)
    {
      win_pos = i;
      break;
    }
  }

  arrayCopy(wins, 0, new_wins, 0, win_pos);
  arrayCopy(wins, win_pos + 1, new_wins, win_pos, wins.length - win_pos - 1);
  new_wins[wins.length - 1] = winID;

  arrayCopy(new_wins, wins);
}


boolean isOnTop(Window winID)
{

  int win_pos = -1;

  for (int i = 0; i < wins.length; i ++)
  {
    if (wins[i] == winID)
    {
      win_pos = i;
      break;
    }
  }

  Window[] top_wins;
  top_wins = new Window[wins.length];
  int winTopCount = 0;

  for (int i = 0; i < wins.length; i ++)
  {
    if (mouse_in_rect(wins[i].winX, wins[i].winY, wins[i].winW, wins[i].winH + 24))
    {
      top_wins[winTopCount] = wins[i];
      winTopCount ++;
    }
  }

  int last_real_win = -1;

  for (int i = 0; i < top_wins.length; i ++)
  {

    if (top_wins[i] != null)
    {
      last_real_win = i;
    }
  }

  return (wins[win_pos] == top_wins[last_real_win]);
}

WindowObj.pde:

class Window
{
  String winT;
  int winX;
  int winY;
  int winW;
  int winH;

  boolean dragging;
  int winXOff;
  int winYOff;
  int winTH;
  int my_id;

  Window(String ttl, int WX, int WY, int WW, int WH)
  {
    winT = ttl;
    winX = WX;
    winY = WY;
    winW = WW;
    winH = WH;

    dragging = false;
    winXOff = 0;
    winYOff = 0;
    winTH = 24;
    my_id = win_count ++;
  }

  void draw_window()
  {
    if (win_selected == my_id)
    {
      fill(60);
    }
    else
    {
      fill(40);
    }
    rect(winX, winY, winW, winTH);

    fill(25);
    rect(winX, winY + 24, winW, winH);


    if (dragging == true)
    {
      winX = mouseX + winXOff;
      winY = mouseY + winYOff;


      if (winX < 0)
      {
        winX = 0;
      }

      if (winX > width - winW - 1)
      {
        winX = width - winW - 1;
      }


      if (winY < 0)
      {
        winY = 0;
      }

      if (winY > height - winH - winTH - 1)
      {
        winY = height - winH - winTH - 1;
      }

    }


    Window win_pos = wins[0];

    for (int i = 0; i < wins.length; i ++)
    {
      if (wins[i].my_id == my_id)
      {
        win_pos = wins[i];
      }
    }

    if (mouse_in_rect(winX, winY, winW, 24) && mousePressed && mouseButton == LEFT && dragging == false && isOnTop(win_pos) && win_drag == false)
    {
      dragging = true;
      winXOff = winX - mouseX;
      winYOff = winY - mouseY;
      win_drag = true;
      win_selected = my_id;
      bringToTop(win_pos);
    }


    if (mouse_in_rect(winX, winY + 24, winW, winH) && mousePressed && mouseButton == LEFT && dragging == false && isOnTop(win_pos) && win_drag == false)
    {
      win_selected = my_id;
      bringToTop(win_pos);
    }


    if (dragging == true)
    {
      if (mouseButton != LEFT)
      {
        win_drag = false;
        dragging = false;
        winXOff = 0;
        winYOff = 0;
      }
    }

  }



}

mouseFunctions.pde:

boolean mouse_in_rect(int mX, int mY, int mW, int mH)
{
  int but_x = mX;
  int but_y = mY;
  int but_w = mW;
  int but_h = mH;

  if (mouseX > but_x && mouseY > but_y && mouseX < but_x + but_w && mouseY < but_y + but_h)
  {
    return true;
  }
  else
  {
    return false;
  }
}
Respuesta 1

INSTRUCCIÓN: Cree una clase regular con un método estático que pueda procesar una matriz unidimensional: • método que acepta una matriz unidimensional y devuelve el valor promedio de los elementos. ...

Recibo la Lista de dos objetos y debo comparar todos los objetos ... Para esto, he estado usando el siguiente ciclo: for (int i = 0; it2.hasNext (); i ++) {objetoDb4o = it2.next ( ); ...

Tengo un programa que calcula las ocurrencias de d, por ejemplo, s = "dda" yn = 10. Las repetiré hasta obtener s.length = 10 eg ddaddaddad el resultado = 7d. He hecho esto en el bucle básico: ...

Tengo una función que toma una clase <GenericType <Constraint>>. Cuando paso una subclase de ese GenericType <Constraint>, los errores del compilador con el mensaje: Inferencia de tipo falló. ...