Событие 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();
}
1 ответ
Сначала уменьшите свой код. Чтобы продемонстрировать проблему и помочь другим, большую часть этого кода можно удалить. Например, должно быть достаточно двух изображений и двух целых чисел с минимальными функциями keyPressed и mousePressed.
Тем не менее, в вашем коде есть и реальные проблемы. Например, в mousePressed вы не проверяете, если (mousePressed). Именно поэтому вызывается mousePressed(). Вы также вызываете loop(), который ничего не делает. Функции loop () и noLoop() определяют, нужно ли вызывать draw() снова после завершения draw(). loop() изменит режим эскиза с "события на основе" на "постоянную частоту кадров", noLoop() сделает наоборот - то, что вы действительно хотите сделать, это просто вызвать перерисовку при необходимости, используя redraw() в конце обработки вашего события,
По умолчанию частота обработки составляет 60, поэтому frameRate(60) ничего не сделает. Вы также используете шрифт.vlw, который на самом деле не шрифт, а формат изображения. font = createFont("Calibri.ttf", 16); гораздо безопаснее, поскольку он будет работать в системах, которые отклоняют шрифт.vlw (например, при запуске эскиза в браузере).
Ваш код также не меняет массивы, он переназначает переменные массива, чтобы они указывали на одно и то же. На нажатой клавише "позиции1 = позиции2", конечно, означает, что позиции2 - это позиции2, но позиции1 - это тоже позиции2. Теперь у вас есть две переменные, указывающие на один и тот же массив. Любые изменения, которые вы вносите с помощью позиции 1 или 2, теперь будут изменять тот же массив, и любое дальнейшее нажатие клавиши или мыши, которое делает "позиции 2 = позиции 1", теперь ничего не будет делать, поскольку они уже указывают на одно и то же, поэтому переназначение сохранит это.
Поэтому, чтобы лучше вам помочь, вот код, который примерно соответствует тому, что вы хотите, чтобы начать, но я настоятельно рекомендую вывешивать где-нибудь, где вы можете задавать вопросы во время программирования (например, канал обработки 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();
}