【问题标题】:Processing function does nothing but freezes the program处理函数什么都不做,只是冻结程序
【发布时间】:2021-09-20 20:43:51
【问题描述】:

我正在处理一个寻路算法。如果我不画一条穿过绿点和红点之间路径的线,它可以工作,但如果我这样做,我有一个问题,如果我调用一个函数,程序除了冻结之外什么都不做,我不知道为什么。像素存储您绘制的内容,并且有各种各样的东西,在这个问题上无关紧要。 当您将其粘贴到处理中时,按 ctrl+t 自动格式化,以便您更好地理解它,但我敢打赌这是一个新手问题。

int[][] pixelss = new int[500][500];
void setup() {
  background(255);
  size(500, 500);}
int[][] badcoos = new int[500][500];
void golinego() {
  stroke(200, 200, 255);
  line(30, 30, 470, 470);
  int j = 30;
  int i = 30;
  while (dist(i, j, 470, 470) > 10) {
    stroke(0, 0, 180);
    circle(i, j, 1);
    if (pixelss[i+1][j+1]==0) {
        i++;j++;}
    if (pixelss[i][j]==1) {
      if (pixelss[i][j+1]==1) {
        if (pixelss[i+1][j]==0) {
          i++;}
      } else if (pixelss[i+1][j]==1) {
        if (pixelss[i][j+1]==0) {
          j++;}
      } else {
        i-=1;
        j-=1;}}}}
void draw() {
  stroke(0, 255, 0);
  fill(0, 255, 0);
  circle(30, 30, 10);
  stroke(255, 0, 0);
  fill(255, 0, 0);
  circle(470, 470, 10);
  if (mousePressed == true) {
    try {
      stroke(0);
      fill(0);
      circle(mouseX, mouseY, 2);
      pixelss[mouseX][mouseY] = 1;
      pixelss[mouseX+1][mouseY] = 1;
      pixelss[mouseX-1][mouseY] = 1;
      pixelss[mouseX][mouseY+1] = 1;
      pixelss[mouseX][mouseY-1] = 1;
      pixelss[mouseX+1][mouseY+1] = 1;
      pixelss[mouseX-1][mouseY+1] = 1;
      pixelss[mouseX+1][mouseY-1] = 1;
      pixelss[mouseX-1][mouseY-1] = 1;
    }catch(ArrayIndexOutOfBoundsException e) {}}}
void keyPressed() {
  if (key=='r') {
    pixelss = new int[500][500];
    badcoos = new int[500][500];
    background(255);}
  if (key==' ') {
    golinego();}
  if (key=='d') {
    background(0);
    for (int i = 0; i < 500; i++) {
      for (int j = 0; j < 500; j++) {
        if (pixelss[i][j]==1) {
          stroke(255);
          circle(i, j, 1);}}}}}

【问题讨论】:

  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: java processing


【解决方案1】:

该程序被您的while 循环捕获。 如果您在循环中打印出ij 的值,您可以看到这一点。他们从不满足退出循环的条件,因此代码块重复运行而没有变化。

while (dist(i, j, 470, 470) > 10) {
  println(i, j);
  // etc...
}

这会挂起应用程序,因为 while 循环需要在再次调用 draw 函数以更新屏幕之前完成。

我不清楚你在 while 循环中实际在做什么,但那是你应该看的地方。要么更改循环内的逻辑,要么更改条件以确保代码不会陷入无限循环。

【讨论】:

    【解决方案2】:

    当 ArrayIndexOutOfBoundsException 被捕获时,您至少应该打印一些东西。

    您似乎正在使用某种 gui 库,请确保您在与 gui 不同的线程中进行任何处理,否则 gui 将变得无响应并像您描述的那样“冻结”。

    https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

    【讨论】:

    • try/catch 部分只影响绘图,不影响寻路。
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多