Как мне сделать так, чтобы круговые хитбоксы менялись?

#java #integer #processing #mouseclick-event

#java #целое число #обработка #щелчок мышью-событие

Вопрос:

Я новичок в программировании, и я создаю игру для прицеливания, в которой вы попадаете в разные круги и должны попасть в один, прежде чем он перейдет к следующему кругу. Однако у меня возникли некоторые проблемы. Я не могу понять, как создать хитбокс для кругов, которые меняются для каждого круга, и как увеличить счет.

Код находится в открытой обработке в pjs.

   class Timer {
  int time;
  int duration;
  Timer() {
    duration = 100;
    reset();
  }
  void reset() {
    time = millis()   duration;
  }
  boolean alarm() {
    if ( millis() > time ) {
      time = millis()   duration;
      return true;
    }
    return false;
  }
}


float x,y,s; //size and position of circles
color c; //colour of circles
int score = 0; //score
int miss = 0; //misses

Timer timer = new Timer();

void setup() {
  size(700, 500);
  timer.duration = 2000; //changes the circle every 2 seconds
    missed =  1;
  newEllipse(); // Make initial circle.
}

void draw() {
  background(100);
  fill(c);
    text("SCORE: "   str(score),620,20);
    text("MISSED: "   str(miss),20,20);
  ellipse(x, y, s, s);
  if( timer.alarm() ){
    newEllipse();
  }
}

void mousePressed(){
  if( overEllipse() ){
        score = 1;
    newEllipse();
  }
}

boolean overEllipse(){
    if(mouseX > x amp;amp; mouseX < x s amp;amp; mouseY > y amp;amp; mouseY < y   s);
}

void newEllipse() {
  s = random(5,min(50,50));
  x = random(0, width - s);
  y = random(0, height - s);  
  c = color( random(255), random(255), random(255) );
  timer.reset();
}
 

Комментарии:

1. Готовы ли вы использовать ООП? Вы можете создать множество объектов, которые будут иметь свои собственные координаты, что упрощает одновременное использование нескольких из них или «цепочку» некоторых, когда вы хотите, чтобы вас заставляли нажимать на них один за другим.

2. Я был бы готов использовать «ООП», но я понятия не имею, как это сделать. Я только начал программировать пару недель назад.

3. Объектно-ориентированное программирование — это здорово, как только вы раскроете его потенциал, вы подниметесь на другой уровень развития! Если сюда никто не сунется, я помогу тебе как можно скорее.

4. Хорошо, спасибо вам!

5. Этот вопрос также не кажется очень подходящим для SO — мы обычно помогаем с техническими проблемами, которые вам не удается решить самостоятельно, в отличие от помощи новым разработчикам. Имейте это в виду и удачи с ООП!

Ответ №1:

Как только я попробовал ваш код, я понял, что вы стремитесь к чему-то очень простому, поэтому сегодня нет необходимости в ООП. Я исправил и прокомментировал ваш код, чтобы вы могли его настраивать и тестировать:

 float s; //size of circles
PVector targetPosition; // position of target
color c; //colour of circles
int score = 0; //score
int miss = 0; //misses

Timer timer = new Timer();

void setup() {
  size(700, 500);
  timer.duration = 2000; //changes the circle every 2 seconds
  newEllipse(); // Make initial circle.
}

void draw() {
  background(100);
  fill(255);  // easier to read if you don't change the color all the time
  text("SCORE: "   str(score), 620, 20);
  text("MISSED: "   str(miss), 20, 20);

  fill(c);
  ellipse(targetPosition.x, targetPosition.y, s, s);
  if ( timer.alarm() ) {
    miss  = 1; // added a 'miss' when the user isn't able to click the target in due time
    newEllipse();
  }
}

// notice that I switched this method for 'mouseClicked' instead of 'mousePressed'
// the difference is that this works on a simple click, and run once per click instead of continuously
void mouseClicked() {  
  if (overEllipse()) {
    score  = 1;
    newEllipse();
  } else { // added a 'miss' when the user clicks at random
    miss  = 1;
  }
}

boolean overEllipse() {
  // these 3 lines are giving you feedback so you know how close to the target you were
  PVector mousePosition = new PVector(mouseX, mouseY);
  println(mousePosition.dist(targetPosition)   " / "   s/2);

  // you only need the next line if you don't care about the feedback
  return mousePosition.dist(targetPosition) < s/2;
}

void newEllipse() {
  s = random(10, 50); // I removed the `min(50,50)` because the minimum number between 50 and 50 is... 50. Maybe you were going for something else, but like this it was not needed
  targetPosition = new PVector(random(s/2, width - s/2), random(s/2, height - s/2));
  c = color( random(255), random(255), random(255) );
  timer.reset();
}

class Timer {
  int time;
  int duration;
  
  Timer() {
    duration = 100;
    reset();
  }
  
  void reset() {
    time = millis()   duration;
  }

  boolean alarm() {
    if ( millis() > time ) {
      time = millis()   duration;
      return true;
    }
    return false;
  }
}
 

Основная проблема здесь заключалась в том, что метод overEllipse не имел смысла, поэтому я поджег его и переписал, используя a PVector вместо прямых координат. Я сделал это в основном потому, что это проще, чем использовать математику, чтобы определить, нажмем ли мы на цель позже ( PVector класс сразу сделает это за вас, это потрясающий инструмент, посмотрите, как я изменил overEllipse метод и насколько это просто с помощью этого инструмента!). Я также добавил некоторую обратную связь в качестве консоли println , чтобы вы могли знать, насколько близко вы нажали от цели.

Я буду рядом, если вы хотите, чтобы я кое-что объяснил. Получайте удовольствие!

Комментарии:

1. Большое вам спасибо! Это мне очень помогает, и вы также добавляете комментарии, чтобы помочь мне понять!