当前位置: 首页 > 知识库问答 >
问题:

mousePressed事件在keyPressed处理之前执行

隗和裕
2023-03-14

这个虫子严重毁了我的一周。我试图创建一个交互式排行榜,其中有三个数组:1是图像,2是我以字符串形式编写的整数。我正在尝试创建一个keyPressed事件,它将使数字随着代表团队的图像而改变,因为他们在梯子上或下梯子,我有一个mousePressed事件来执行一个循环,将窗口恢复到它的原始状态。

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

我已经包含了我的代码在下面,并正在工作在一个Macbook Pro OSX处理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个答案

金子轩
2023-03-14

首先,减少你的代码。为了演示问题以便其他人提供帮助,可以移除大部分这段代码。例如,两个图像和两个整数就足够了,只需要最小的keyPressed和mousePressed函数。

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

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

您的代码也不交换数组,它重新分配数组变量以指向相同的东西。按下键后,“positions1=positions2”意味着positions2当然是positions2,但是positions1也是positions2。现在有两个变量指向同一个数组。您通过positions1或positions2所做的任何更改现在都将更改相同的数组,任何执行“positions2=positions1”的进一步按键或鼠标按压现在都不会执行任何操作,因为它们已经指向相同的东西,因此重新分配将保留这一点。

为了更好地帮助您,这里有一些代码,可以做您想做的事情,让您开始编程,但我强烈建议您在编程时可以找个地方问问题(比如处理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();
}
 类似资料:
  • 问题内容: 我刚刚创建了一个Java井字游戏,我想弄清楚在特定条件下按下Enter键后如何运行方法,下面是一个示例… 问题答案: 根据要在何处捕获“ enter”键,可以使用(在诸如文本组件或按钮之类的组件上)或将键绑定附加到组件上 这将取决于所关注的组件。

  • 我在Java和C#等OOP语言方面非常有经验。直到现在,我才开始与FX打交道,并开始在办公室无聊地处理事件。 我的外汇申请都是在一个类中编写的。我导入了我想要的软件包,包括以下两个: 我在主类声明中实现了类型为ActionEvent的EventHandler接口,如下所示。。 我在按钮对象上编写了一个匿名内部类来处理这样的单击事件。 它显然像它应该的那样工作,但后来我进行了一个实验。我从上面删除了

  • 事件 事件,就是文档与浏览器发生特定的 交互瞬间。JavaScript与HTML之间的交互就是通过事件实现的。 事件流 所谓事件流,就是接收页面事件的顺序。 事件流分 事件冒泡流 与 事件捕获流。事件冒泡流是IE开发团队提出的,捕获流是Netscape开发团队提出的。 事件冒泡流 所谓事件冒泡,就是事件开始时由 最具体的元素(文档中嵌套最深的那个 节点)接收,然后逐级向上传播到较为不具体的节点(文

  • 我用JavaFX做了一个简单的乒乓球游戏。然而,我有一个问题与设置控制。我使用的文本字段如下所示: 但是箭头键和类似键在TextField中什么都不显示(尽管它们在游戏中起作用)。如何修复此问题/一致性问题?

  • 问题内容: 我有一棵divs树: 在div上单击时,将使其子级不可见-即单击“ a”将使“ b”和“ c”不可见。 问题是:单击“ b”将调用“ a”的单击,并使“ b”和“ c”不可见。如何使用jQuery禁用对“ a”的点击? 谢谢 问题答案: 您可以为孩子添加一个处理程序,以防止click事件蔓延: 这样一来,点击不会传播到。都不会单击以转到,因此也不会。

  • 如果我有以下代码: 对该循环中某个处理程序的所有调用是并行执行还是顺序执行?如果是顺序的,那么要获得并行执行,正确的方法是什么? 当做