0

このバグは私の週をひどく台無しにしました. インタラクティブなリーダーボードを作成しようとしていますが、その中には 3 つの配列があります。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 関数を最小限に抑えて、2 つの画像と 2 つの整数で十分です。

とはいえ、コードには実際の問題もあります。たとえば、mousePressed では、if(mousePressed) をテストしません。それが、 mousePressed() が呼び出されている理由です。また、何もしない loop() も呼び出します。loop() および noLoop() 関数は、draw() が終了した後に draw() を再度呼び出すかどうかのみを決定します。loop() はスケッチ モードを「イベント ベース」から「一定フレームレート」に変更し、noLoop() はその逆を行います。本当にやりたいことは、イベント処理の最後で redraw() を使用して、必要に応じて再描画をトリガーすることです。 .

デフォルトの処理フレームレートは 60 であるため、frameRate(60) は何もしません。また、実際にはフォントではなく画像形式である .vlw フォントも使用しています。font = createFont("Calibri.ttf", 16); .vlw フォントを拒否するシステムで実行されるため (ブラウザでスケッチを実行する場合など)、はるかに安全です。

コードも配列を交換しません。配列変数を再割り当てして、同じものを指すようにします。keyPressed では、"positions1 = position2" は、positions2 はもちろん position2 ですが、positions1 も position2 であることを意味します。これで、同じ配列を指す 2 つの変数ができました。位置1または位置2のいずれかを介して行う変更は、同じ配列を変更し、さらにキーまたはマウスを押して「位置2 =位置1」を実行しても、それらはすでに同じものを指しているため、何もしないため、再割り当てはそれを保持します。

ですから、あなたを助けるために、あなたがやりたいことを大まかに実行するコードをいくつか示しますが、プログラミング中に質問できる場所 (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();
}
于 2013-02-03T14:51:14.897 に答える