Удобный совет: ваш тон звучит немного требовательно, и ваше описание очень расплывчато. Вам будет намного лучше, если вы попытаетесь облегчить другим людям помощь.
- Сообщите нам, какие ошибки вы получаете.
- Опубликовать MCVE с достаточным кодом, чтобы мы могли запускать его, но не код, напрямую не связанный с вашей проблемой.
- Попробуйте разбить проблему на небольшие шаги и задайте только один конкретный вопрос одновременно.
- Проверьте номер question checklist и убедитесь, что вы сделали все, что в списке.
Почему, черт возьми, в этом нет учебника?
Имейте в виду, что люди, отвечающие на вопросы о переполнении стека, делают это бесплатно, в свободное время. Люди, занимающиеся обработкой, делают это бесплатно, в свободное время. Тем не менее, есть тонны учебников по вашим проблемам. Вы пробовали искать в Google?
Here - это учебное пособие, которое делает именно то, что вы ищете. Эти примеры поставляются с редактором обработки (перейдите в Файл -> Примеры). The reference - еще один отличный ресурс, который вы должны проверить.
Все сказанное, я проведу вас через решение этой проблемы и, надеюсь, как решить другие проблемы в будущем.
Шаг 0: Прервите свою проблему с меньших шагов. Это золотое правило программирования. Всякий раз, когда вы застреваете, вернитесь к этому шагу. Этот шаг подпитывает остальные шаги, и это должно быть первое, второе и третье, что вы делаете всякий раз, когда вы застреваете.
Этап 1: Вы можете нарисовать один объект? Не беспокойтесь о взаимодействии или нескольких объектах или чем-либо еще, просто нарисуйте один объект. Сначала запустите этот код.
Вот код, который рисует один круг:
void setup(){
size(500, 500);
ellipseMode(CENTER);
}
void draw(){
background(0);
ellipse(100, 200, 50, 50);
}
Шаг 2: Вы можете инкапсулировать информацию, необходимую для отрисовки объекта в классе? Опять же, только беспокоиться о следующем небольшом шаге - не беспокойтесь о нескольких фигурах. Просто получите класс, работающий для одного объекта. Вот как мы можем инкапсулировать данные для нашего круга:
Circle circle;
void setup() {
size(500, 500);
ellipseMode(CENTER);
circle = new Circle(100, 200, 50);
}
void draw() {
background(0);
circle.draw();
}
class Circle {
float x;
float y;
float r;
public Circle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
void draw() {
ellipse(x, y, r, r);
}
}
Если у вас возникли проблемы на этом этапе, то вы можете оставить что-то вроде этого небольшого примера, с более конкретным вопросом, и это будет намного легче поможет вам, если вы разместите раздел всего своего эскиза без каких-либо конкретных ошибок.
Шаг 3: Вы можете добавить простую логику взаимодействия пользователя к классу круга? Не беспокойтесь о нажатии, просто попробуйте изменить цвет круга, когда вы наводите на него курсор.
Circle circle;
void setup() {
size(500, 500);
ellipseMode(RADIUS);
circle = new Circle(100, 200, 50);
}
void draw() {
background(0);
circle.draw();
}
class Circle {
float x;
float y;
float r;
public Circle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
void draw() {
if(dist(mouseX, mouseY, x, y) < r){
//mouse is inside circle
fill(0, 255, 0);
}
else{
//mouse is outside circle
fill(0, 0, 255);
}
ellipse(x, y, r, r);
}
}
Разбив вашу большую проблему вниз в этих небольших шагов, она становится гораздо проще отлаживать код, чем если вы попытаетесь записать весь свой эскиз в одно время.
Этап 4: Можете ли вы улучшить код взаимодействия, чтобы обнаружить щелчок? Можете ли вы переместить круг при обнаружении перетаскивания?
Вы должны, вероятно, разорвать эти шаги вниз еще дальше, но ради сохранения этого поста короткий (ER), я объединил их в одно:
Circle circle;
void setup() {
size(500, 500);
ellipseMode(RADIUS);
circle = new Circle(100, 200, 50);
}
void draw() {
background(0);
circle.draw();
}
class Circle {
float x;
float y;
float r;
public Circle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
void draw() {
if(dist(mouseX, mouseY, x, y) < r){
//mouse is inside circle
if(mousePressed){
//mouse is being dragged
fill(255, 0, 0);
//move the circle to the mouse position
x = mouseX;
y = mouseY;
}
else{
//mouse is not clicked
fill(0, 255, 0);
}
}
else{
//mouse is outside circle
fill(0, 0, 255);
}
ellipse(x, y, r, r);
}
}
Шаг 5: Вы можете сделать это работать для нескольких объектов? Если вы хорошо поработали над тем, чтобы разбить проблему на небольшие шаги и инкапсулировать свою логику в класс, то этот шаг станет довольно простым.
ArrayList<Circle> circles = new ArrayList<Circle>();
void setup() {
size(500, 500);
ellipseMode(RADIUS);
for (int i = 0; i < 10; i++) {
circles.add(new Circle(random(width), random(height), random(10, 50)));
}
}
void draw() {
background(0);
for (Circle circle : circles) {
circle.draw();
}
}
class Circle {
float x;
float y;
float r;
public Circle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
void draw() {
if (dist(mouseX, mouseY, x, y) < r) {
//mouse is inside circle
if (mousePressed) {
//mouse is being dragged
fill(255, 0, 0);
//move the circle to the mouse position
x = mouseX;
y = mouseY;
} else {
//mouse is not clicked
fill(0, 255, 0);
}
} else {
//mouse is outside circle
fill(0, 0, 255);
}
ellipse(x, y, r, r);
}
}
Подводя итог, необходимо разбить проблему на более мелкие шаги и взять на себя те шаги, по одному за раз. Если вы застряли на определенном шаге (или если вы не понимаете один из шагов моего ответа), вы можете разместить небольшой пример MCVE, как и мои примеры выше, и задать конкретный вопрос.
Счастливое кодирование!
Условие 'if' от' isTriggerd (...) 'не похоже на право, вместо' x' не должно быть 'X', а вместо' mouseX' не должно быть 'x' , то же самое происходит для 'y' и' mouseY'. – Titus
Хм просто попробовал, в коде ниже, правильно: я протестировал его, и когда я наводил курсор на прямоугольник, он двигается прямо, пока мой курсор больше не находится над объектом .... Но как отображать более одного раза из них ? : x – gnr