Событие mousePressed выполняется до обработки keyPressed

Эта ошибка серьезно испортила мою неделю. Я пытаюсь создать интерактивную таблицу лидеров, и в ней три массива: 1 с изображениями и 2 с целыми числами, которые я написал в виде строк. Я пытаюсь создать событие keyPressed, которое заставит числа меняться с изображениями, представляющими команды, когда они поднимаются или опускаются по лестнице, и у меня есть событие mousePressed для выполнения цикла, чтобы вернуть окно обратно в исходное состояние.

Моя проблема заключается в том, что когда я пытаюсь запустить код, событие keyPressed не выполняется, а выполняется только после того, как я нажму кнопку мыши. Затем изображения перемещаются, но массив строк не возвращается к первому набору изображений. Я включил приведенный ниже код... Я знаю, что он длинный, и надеюсь, что я рефракторил и сокращал его по ходу дела. Прямо сейчас мне нужна помощь, чтобы убедиться, что событие keyPressed выполняется первым, а массив строк position1 возвращается в исходное положение при выполнении цикла.

Я включил свой код ниже и работаю над Macbook Pro OSX Processing 2.0b7.

Я изменил свой код и использовал циклы для размещения изображений и текста. Теперь проблема заключается в том, что изображения и текст не меняются, когда я инициирую событие keyPressed. Не могли бы вы посмотреть на мой код:

PImage[] teams;
int n = 24;
PImage[] teams2;
int m = 16;
PImage quarterFinalWinners = new PImage();
float damping = 0.1;
PFont font;
String[] positions1 = {"18", "26", "32", "45", "58", "56", "59", "61", "66", "69", "71", "85", "98", "100", "116", "133"};
String[] positions2 = {"14", "19", "25", "30", "34", "45", "52", "69", "71", "72", "87", "84", "89", "105", "107", "110"};
float x;
float y;

/**----------------------------------------------------------------------------------------------------------------------------**/

void setup() {
  size(600, 1600);
  frameRate(60);
  smooth();

  font = loadFont("Calibri-Bold-48.vlw");
  textFont(font);

  frame.setResizable(true);

  teams = new PImage[n];
    for (int i = 0; i < teams.length; i++) {
      teams[i] = loadImage(i + ".png");
    }

  teams2 = new PImage[m];
    for (int i = 0; i < teams2.length; i++) {
      teams2[i] = loadImage(i + ".jpg");
    }
}

/**----------------------------------------------------------------------------------------------------------------------------**/

void draw() {
  //noLoop();
  background(0);

  if ((x < width) && (y < height)) {
for (int i = 0; i < 16; i++) {
  image(teams[i], 150, 60*i);
  text(positions1[i], 100, 72*i);
     }
    }

 if (keyPressed) {
if((key == 's') || (key == 'S') && (x < width) && (y < height)) {
  for (int i = 0; i < 16; i++) {
  image(teams[i], 150, 60*i);
  text(positions1[i], 100, 72*i);
  }

   for (int i = 0; i >= 16; i++) {
  text(positions2[i], 100, 72*i); 
    }
   }
  }
}

/**----------------------------------------------------------------------------------------------------------------------------**/

/**void keyPressed () {
if((key == 's') || (key == 'S') && (x < width) && (y < height)) {
   for (int i = 0; i > 16; i++) {
  image(teams[i], 150, 60*i);

}

   for (int i = 0; i >= 16; i++) {
  text(positions2[i], 100, 72*i); 
    }
}
}**/

     /**image(images[10], 150, 290);
  image(images[19], 150, 50);
  image(images[17], 150, 230);
  image(images[2], 150, 110);
  image(images[22], 150, 410);
  image(images[20], 150, 470);
  image(images[16], 150, 650);
  image(images[6], 150, 350);
  image(images[7], 150, 590);
  image(images[18], 150, 770);
  image(images[21], 150, 170);
  image(images[12], 150, 830);
  image(images[13], 150, 530);
  image(images[23], 150, 950);**/

void mousePressed () {
      if (mousePressed) {
      positions2 = positions1;
      }
     loop();
      }

person Siya    schedule 01.02.2013    source источник
comment
Есть довольно много вещей, которые можно улучшить с помощью вашего кода, например, избегать повторений: вам удалось использовать цикл for в настройке для инициализации PImages, но вы продолжаете копировать/вставлять вызовы image() и text() повсюду. Я рекомендую сначала очистить ваш код, это должно сделать ошибки более очевидными. Другая причина заключается в том, что в текущем состоянии ваш код не может быть протестирован кем-либо, кроме вас самих. Я предполагаю, что проблема заключается в функциях mousePressed() и keyPressed(), особенно в функциях loop(); и noLoop();, которые могут сбить вас с толку, когда дело доходит до выполнения программы.   -  person George Profenza    schedule 02.02.2013
comment
Привет, Джордж. Не могли бы вы взглянуть на код ниже, который я рефракторил.   -  person Siya    schedule 03.02.2013


Ответы (1)


Сначала сократите свой код. Чтобы продемонстрировать проблему, чтобы другие могли помочь, большую часть этого кода можно удалить. Например, двух изображений и двух целых чисел должно быть достаточно с минимальными функциями keyPressed и mousePressed.

Тем не менее, в вашем коде также есть реальные проблемы. Например, в mousePressed вы не проверяете if(mousePressed). Именно поэтому вызывается mousePressed(). Вы также вызываете loop(), который ничего не делает. Функции loop() и noLoop() определяют, следует ли снова вызывать функцию draw() после завершения работы функции draw(). loop() изменит режим эскиза с «событийного» на «постоянную частоту кадров», noLoop() делает обратное — что вы действительно хотите сделать, так это просто вызвать перерисовку, когда это необходимо, используя redraw() в конце обработки вашего события. .

Частота кадров обработки по умолчанию равна 60, поэтому частота кадров (60) ничего не делает. Вы также используете шрифт .vlw, который на самом деле является не шрифтом, а форматом изображения. шрифт = createFont("Calibri.ttf", 16); намного безопаснее, поскольку он будет работать в системах, которые отвергают шрифт .vlw (например, при запуске вашего эскиза в браузере).

Ваш код также не меняет местами массивы, он переназначает переменные массива, чтобы они указывали на одно и то же. При нажатии клавиши «positions1 = position2» означает, что position2 — это position2, конечно, но position1 — это также position2. Теперь у вас есть две переменные, указывающие на один и тот же массив. Любые изменения, которые вы делаете с помощью position1 или position2, теперь изменят тот же массив, и любое дальнейшее нажатие клавиши или мыши, которое делает «positions2 = position1», теперь ничего не сделает, потому что они уже указывают на одно и то же. , поэтому переназначение сохранит это.

Итак, чтобы лучше всего помочь вам, вот код, который делает примерно то, что вы хотите, чтобы вы начали, но я настоятельно рекомендую тусоваться где-нибудь, где вы можете задавать вопросы во время программирования (например, канал Processing IRC или форум), потому что сейчас в вашем коде много неправильных функций и идей, что означает, что вы еще не понимаете язык и хотите, чтобы другие люди посмотрели на фрагменты, чтобы сказать, делаете ли вы что-то разумное или что-то еще очень неправильно.

String[] positions, prevPositions;

void setup() {
  // setup two identical-content arrays
  positions = new String[]{"1","a","b","c"};
  prevPositions = new String[]{"1","a","b","c"};
  // don't draw at a constant framerate. we'll redraw
  // based on key/mouse events
  noLoop();
}

void draw() {
  // white background, black text
  background(255);
  fill(0);
  // just draw the first thing in "position"
  text(positions[0], width/2, height/2);
}

void keyPressed () {
  // cache what the array looks like
  arrayCopy(positions,0,prevPositions,0,positions.length);
  // modify the positions list
  positions[0] = ""+ (int(positions[0])+1);
  // redraw now that our state has changed
  redraw();
}

void mousePressed () {
  // revert to previous array. We can only do this once.
  // if someone pressed the key seven times, we can't revert
  // seven times, because the code only has one history state
  // that is updated every time a key is pressed
  arrayCopy(prevPositions,0,positions,0,positions.length);
  // redraw now that our state has changed
  redraw();
}
person Mike 'Pomax' Kamermans    schedule 03.02.2013
comment
Привет, Майк, я изменил свой код, если вы посмотрите выше, но вы правы, я не самый осведомленный, когда дело доходит до программирования в Processing или любом другом языке. Спасибо в любом случае за помощь. - person Siya; 03.02.2013