Обработка - остановка исчезновения изображения при выборе другого - PullRequest
1 голос
/ 18 апреля 2020

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

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

Мне также хотелось бы иметь background() внутри draw(), так как изображение уйдет следы изображений всякий раз, когда я перемещаю его с помощью мыши.

Мой код

PImage img;
int imgX, imgY;
int mX, mY;
String path ="";

void setup() {
    size(1000, 800);
}

void draw() {
    background(204);
    if(mousePressed){ // is the mousebutton being held?
        imgX = mouseX-mX;
        imgY = mouseY-mY;
    }
    if (img != null) {
        image(img, imgX, imgY);
    }
    text("Press 't' to load an image", 40, 100);
}

void handleImage(File selection) {
    if (selection== null) {
        println ("nono");
    } 
    else {
        path = selection.getAbsolutePath();
        img = loadImage(path);
    }
}

void mousePressed()
{
    // set variables for holding mouseposition offset
    // to the image
    mX = mouseX-imgX;
    mY = mouseY-imgY;
}

void keyPressed() {
    if(key == 't') {
        img = null;
        selectInput("select an image", "handleImage");
    }
}

1 Ответ

2 голосов
/ 18 апреля 2020

Изображение не исчезает. Изображение просто меняется, потому что у вас есть только 1 изображение (img). Вся сцена перерисовывается в каждом кадре, поэтому вы можете просто видеть «текущее» изображение.

Создайте класс MyImage, который может рисовать изображение и изменять положение изображения:

class MyImage {
    PImage img;
    int x, y;

    MyImage(PImage img, int x, int y) {
        this.img = img;
        this.x = x;
        this.y = y;
    }

    void changePosition(int dx, int dy) {
        this.x += dx;
        this.y += dy;
    }

    void draw() {
        image(img, x, y);
    }
}

Используйте ArrayList для управления несколькими изображениями:

ArrayList<MyImage> images = new ArrayList<MyImage>();

Добавление нового изображения при нажатии t :

String path = selection.getAbsolutePath();
PImage image = loadImage(path);
images.add(new MyImage(image, 0, 0));

Нарисуйте все изображения в al oop

for (int i = 0; i < images.size(); i++) {
    MyImage img = images.get(i);
    img.draw();
}

Воспользуйтесь обратным вызовом события mouseDragged(), чтобы перетащить последнее изображение в списке:

void mouseDragged() {
    if (images.size() > 0) {
        images.get(images.size()-1).changePosition(mouseX-pmouseX, mouseY-pmouseY);
    }
}

См. Пример:

class MyImage {
    PImage img;
    int x, y;

    MyImage(PImage img, int x, int y) {
        this.img = img;
        this.x = x;
        this.y = y;
    }

    void changePosition(int dx, int dy) {
        this.x += dx;
        this.y += dy;
    }

    void draw() {
        image(img, x, y);
    }
}

ArrayList<MyImage> images = new ArrayList<MyImage>();

void setup() {
    size(1000, 800);
}

void draw() {
    background(204);
    for (int i = 0; i < images.size(); i++) {
        MyImage img = images.get(i);
        img.draw();
    }
    text("Press 't' to load an image", 40, 100);
}

void handleImage(File selection) {
    if (selection == null) {
        println ("nono");
    } 
    else {
        String path = selection.getAbsolutePath();
        PImage image = loadImage(path);
        images.add(new MyImage(image, 0, 0));
    }
}

void mouseDragged() {
    if (images.size() > 0) {
        images.get(images.size()-1).changePosition(mouseX-pmouseX, mouseY-pmouseY);
    }
}

void keyPressed() {
    if(key == 't') {
        selectInput("select an image", "handleImage");
    }
}
...