Мухобойка в обработке – почти работает

Задача состоит в том, чтобы создать игру с прихлопыванием мух в Обработке, в которой муха появляется в случайном месте на экране, после того, как муху прихлопнули, она заменяется изображением прихлопнутой мухи, и на экране в случайном месте появляется еще одна муха. В настоящее время, когда нажимается мышь, чтобы прихлопнуть муху, в окне также появляется несколько мух (вместо одной). Дополнительные мухи, появляющиеся в окне, также увеличивают счет на 1 за каждую случайно появившуюся муху.

Я подозреваю, что это как-то связано с моими массивами, но я изо всех сил пытаюсь найти решение.

Буду очень признателен за ясность в моих ошибках.

Несколько скриншотов для большей наглядности:

Начальный экран при запуске игры:

Прихлопнув одну муху. Если мухобойка находится в зоне обнаружения столкновения муха и муху отбивают, затем на экране появляется множество мух:

Пока муху прихлопнули и нажимают кнопку мыши, на экране продолжают появляться новые мухи, а счет увеличивается с каждой добавленной мухой (но не прихлопнутой):

PImage fly, flybye, swatter, swatted;
float[] fX, fY; // Declaring fX & fY locaiton arrays
int[] swat;
int score = 0;

void setup() {
  size(800, 400);
  // Images
  fly = loadImage("fly.png");
  fly.resize(50,0);
  flybye = loadImage("flybye.png");
  flybye.resize(50,0);
  swatter = loadImage("swatter.png");  
  swatted = loadImage("swatted.png");
  
  fX = new float[0];
  fY = new float[0];
  swat = new int[0];
  
  fX = append(fX, random(width));
  fY = append(fY, random(height));
  swat = append(swat, 0);
}

void draw() {
  background(255);
  populate(); // Displays flys to the screen
  fill(0);
  textSize(30);
  text("Score: " + score, 20, 50); // Displays the score in the top left corner 
  noCursor(); // Removes the cursor from the screen
  mousePressed(); 
}

void populate() {
  for (int i = 0; i < fX.length; i++) {
    if (swat[i] == 1) { // if swatted
      image(flybye, fX[i], fY[i]);
    } else {
      image(fly, fX[i], fY[i]);
    }
  }
}

void collisionDetect() {
  for (int i = 0; i < swat.length; i++) {
    if (mouseX > fX[i] && mouseX < fX[i] + fly.width &&
        mouseY > fY[i] && mouseY < fY[i] + fly.height) {
          swat[i] = 1;
          fX = append(fX, random(width));
          fY = append(fY, random(height));
          swat = append(swat, 0);
          score++;
          }
  } 
}

void mousePressed() {
  if (mousePressed) {
    collisionDetect();
    image(swatted, mouseX-35, mouseY-25);
  } else {
    image(swatter, mouseX-35, mouseY-25);
  }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы очень близки, однако части вашего кода требуют более пристального внимания, так как есть несколько ошибок:

  • mousePressed() функция, которую можно переопределить в любом скетче обработки:
  • вызывать его с draw() нет необходимости (вот почему одна из причин, по которой вы видите дубликаты)
  • if (mousePressed) { внутри mousePressed() является избыточным, так как функция должна вызываться только один раз за клик. (Попробуйте справочный пример в отдельном эскизе, чтобы освоиться)
  • Еще один источник дубликатов мух — это состояние ограничивающей рамки внутри collisionDetect()
if (mouseX > fX[i] && mouseX < fX[i] + fly.width &&
        mouseY > fY[i] && mouseY < fY[i] + fly.height)...

только проверяет, находится ли внутри коробки муха (любая муха, даже уже прихлопнутая). Возможно, вы захотите еще больше ограничить это, фильтруя неотбитых мух только перед увеличением оценки и добавлением новой мухи.

например

void collisionDetect() {
  for (int i = 0; i < swat.length; i++) {
    if (mouseX > fX[i] && mouseX < fX[i] + fly.width &&
        mouseY > fY[i] && mouseY < fY[i] + fly.height &&
        // also check this fly has not been swatted (yet)
        swat[i] == 0) {
          swat[i] = 1;
          fX = append(fX, random(width));
          fY = append(fY, random(height));
          swat = append(swat, 0);
          score++;
          }
  } 
}

Это ваш код с добавленными выше упоминаниями:

PImage fly, flybye, swatter, swatted;
float[] fX, fY; // Declaring fX & fY location arrays
int[] swat;
int score = 0;

void setup() {
  size(800, 400);
  // Images
  fly = loadImage("fly.png");
  fly.resize(50,0);
  flybye = loadImage("flybye.png");
  flybye.resize(50,0);
  swatter = loadImage("swatter.png");  
  swatted = loadImage("swatted.png");
  
  fX = new float[0];
  fY = new float[0];
  swat = new int[0];
  
  fX = append(fX, random(width));
  fY = append(fY, random(height));
  swat = append(swat, 0);
}

void draw() {
  background(255);
  populate(); // Displays flys to the screen
  fill(0);
  textSize(30);
  text("Score: " + score, 20, 50); // Displays the score in the top left corner 
  noCursor(); // Removes the cursor from the screen
}

void populate() {
  for (int i = 0; i < fX.length; i++) {
    if (swat[i] == 1) { // if swatted
      image(flybye, fX[i], fY[i]);
    } else {
      image(fly, fX[i], fY[i]);
    }
  }
}

void collisionDetect() {
  for (int i = 0; i < swat.length; i++) {
    if (mouseX > fX[i] && mouseX < fX[i] + fly.width &&
        mouseY > fY[i] && mouseY < fY[i] + fly.height &&
        // also check this fly has not been swatted (yet)
        swat[i] == 0) {
          swat[i] = 1;
          fX = append(fX, random(width));
          fY = append(fY, random(height));
          swat = append(swat, 0);
          score++;
          }
  } 
}

void mousePressed() {
  collisionDetect();
}

Другие вещи, которые можно улучшить:

  • форматирование: вы можете использовать Ctrl+T/CMD+T для приведения в порядок кода. Это облегчает чтение, и это хорошая привычка. В долгосрочной перспективе вы потратите больше времени на чтение/понимание кода, чем на его написание. Даже вернуться к собственному коду через две недели или больше будет проще, если вы отформатируете/комментируете/и т. д. и облегчите жизнь себе в будущем
  • вы можете избежать копирования/вставки кода, инкапсулируя повторно используемые блоки кода. В этом случае добавление полета (один раз в настройке, при столкновении), а также условие проверки столкновения можно инкапсулировать в функцию, которую вы можете легко повторно использовать в любом другом эскизе.

например

PImage fly, flybye, swatter, swatted;
float[] fX, fY; // Declaring fX & fY location arrays
int[] swat;
int score = 0;

void setup() {
  size(800, 400);
  noCursor(); // Removes the cursor from the screen
  // Images
  fly = loadImage("fly.png");
  fly.resize(50, 0);
  flybye = loadImage("flybye.png");
  flybye.resize(50, 0);
  swatter = loadImage("swatter.png");
  swatted = loadImage("swatted.png");
  
  fX = new float[0];
  fY = new float[0];
  swat = new int[0];

  addFly();
}

void draw() {
  background(255);
  populate(); // Displays flys to the screen
  fill(0);
  textSize(30);
  text("Score: " + score, 20, 50); // Displays the score in the top left corner
}

void populate() {
  for (int i = 0; i < swat.length; i++) {
    if (swat[i] == 1) { // if swatted
      image(flybye, fX[i], fY[i]);
    } else {
      image(fly, fX[i], fY[i]);
    }
  }
}

void collisionDetect() {
  for (int i = 0; i < swat.length; i++) {
    if (isPointInRect(mouseX, mouseY, fX[i], fY[i], fly.width, fly.height) &&
      // also check this fly has not been swatted (yet)
      swat[i] == 0) {
      // mark this index as swatted
      swat[i] = 1;
      // increment score
      score++;
      // add new fly
      addFly();
    }
  }
}

void addFly() {
  fX = append(fX, random(width));
  fY = append(fY, random(height));
  swat = append(swat, 0);
}

boolean isPointInRect(int mx, int my, float rx, float ry, float rw, float rh) {
  return (mx >= rx && mx <= rx + rw) &&
         (my >= ry && my <= ry + rh);
}

void mousePressed() {
  collisionDetect();
}

Делайте это шаг за шагом. Иногда в коде замедление/перепроверка предположений поможет вам преодолеть черту быстрее, чем спешка. Веселиться !

Спасибо, Джордж, за объяснение проблемы с моим кодом, это сообщество намного лучше, чем ожидалось.

user24558597 26.04.2024 06:25

Добро пожаловать! Это зависит от сообщества внутри сообщества :) Мы стараемся поддерживать дружеские отношения с Processing. Если ответ был полезен, проголосуйте , если он был полезен, и/или отметьте галочкой, если проблема решена .

George Profenza 26.04.2024 09:38

Другие вопросы по теме