Задача состоит в том, чтобы создать игру с прихлопыванием мух в Обработке, в которой муха появляется в случайном месте на экране, после того, как муху прихлопнули, она заменяется изображением прихлопнутой мухи, и на экране в случайном месте появляется еще одна муха. В настоящее время, когда нажимается мышь, чтобы прихлопнуть муху, в окне также появляется несколько мух (вместо одной). Дополнительные мухи, появляющиеся в окне, также увеличивают счет на 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);
}
}





Вы очень близки, однако части вашего кода требуют более пристального внимания, так как есть несколько ошибок:
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();
}
Другие вещи, которые можно улучшить:
например
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();
}
Делайте это шаг за шагом. Иногда в коде замедление/перепроверка предположений поможет вам преодолеть черту быстрее, чем спешка. Веселиться !
Добро пожаловать! Это зависит от сообщества внутри сообщества :) Мы стараемся поддерживать дружеские отношения с Processing. Если ответ был полезен, проголосуйте , если он был полезен, и/или отметьте галочкой, если проблема решена .
Спасибо, Джордж, за объяснение проблемы с моим кодом, это сообщество намного лучше, чем ожидалось.