0

这个错误严重毁了我的一周。我正在尝试创建一个交互式排行榜,其中包含三个数组:1 个带有图像,2 个带有我写为字符串的整数。我正在尝试制作一个 keyPressed 事件,当他们上下梯子时,数字会随着代表团队的图像而变化,并且我有一个 mousePressed 事件来执行循环以将窗口恢复到其原始状态。

我的问题是,当我尝试运行代码时,keyPressed 事件不会执行,只有在我单击鼠标后才会执行。然后图像移动,但字符串数组不会与第一组图像一起循环返回。我已经包含了下面的代码......我知道它很长并且相信我一直在折射和缩短。现在我想要帮助的是确保 keyPressed 事件首先执行,并且当循环执行时,positions1 字符串数组恢复到其原始位置。

我在下面包含了我的代码,并且正在使用 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();
      }
4

1 回答 1

1

首先减少你的代码。为了演示问题以便其他人可以提供帮助,可以删除大部分代码。例如,两个图像和两个整数应该足够了,具有最少的 keyPressed 和 mousePressed 函数。

也就是说,您的代码中也存在实际问题。例如,在 mousePressed 中,您无需测试是否 (mousePressed)。这就是为什么调用 mousePressed() 的原因。您还调用 loop(),它什么也不做。loop() 和 noLoop() 函数仅确定在 draw() 完成后是否再次调用 draw()。loop() 会将草图模式从“基于事件”更改为“恒定帧率”,noLoop() 则相反 - 您真正想要做的只是在必要时触发重绘,在事件处理结束时使用 redraw() .

默认处理帧率是 60,所以 frameRate(60) 不会做任何事情。您还使用了 .vlw 字体,它实际上不是一种字体,而是一种图像格式。font = createFont("Calibri.ttf", 16); 更安全,因为它将在拒绝 .vlw 字体的系统上运行(例如在浏览器中运行草图时)。

您的代码也不会交换数组,它会重新分配数组变量以指向同一事物。在 keyPressed 上,"positions1 = Position2" 表示 position2 是 position2,当然,但是 position1 也是 position2。您现在有两个变量指向同一个数组。您通过位置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();
}
于 2013-02-03T14:51:14.897 回答