Как перевести прямоугольник в предыдущие координаты мыши при обработке - PullRequest
3 голосов
/ 22 января 2020

Я новичок в java и играю в змею. Мой следующий шаг - добавить прямоугольник к змее, когда она ест пищу. В настоящее время я хочу добавить идентичный прямоугольник, переведенный в предыдущую позицию (mouseX, mouseY). По крайней мере, было переведено расстояние одного прямоугольника от предыдущего, но оно было ориентировано там, где ранее находилась мышь, чтобы «следовать» за частью перед ним. Я не уверен, как go сделать это, но вот мой код до сих пор.

//snake
void snake() {
    rect(mouseX, mouseY, 10, 10);
}

class Snake {

    //variables
    int len;
    int wid;
    int xcord;
    int ycord;

    //constructor
    Snake(int x,int y, int len, int wid) {
        this.len = len;
        this.wid = wid;
        this.xcord = x;
        this.ycord = y;
        rect(xcord, ycord, wid, len);
    }

    //clear screen
    void  update() {
        background(255);
        rectMode(CENTER);
        rect(mouseX, mouseY, wid, len);
    }
}

class Food {

    //variables
    int xcord;
    int ycord;
    int wid;
    int len;

    //constructor
    Food() {
        this.xcord = int(random(width - 5));
        this.ycord = int(random(height - 5));
        this.wid = 10;
        this.len = 10;
        rect(xcord, ycord, wid, len);
    }

    //update food position
    void update() {
        if( (mouseX > xcord) && (mouseX < xcord + wid) &&
            (mouseY > ycord) && (mouseY < ycord + len)) {
            xcord = int(random(width - 5));
            ycord = int(random(height - 5));
            //lengthen snake
        }
    }

    //display food
    void displayFood() {
        rect(xcord, ycord, 10, 10);
    }
}

Snake s;
Food f;
void setup() {
    background(255);
    s = new Snake(mouseX, mouseY, 10, 10);
    f = new Food();
}

void draw() {
    s.update();

    f.update();
    f.displayFood();
}

1 Ответ

0 голосов
/ 04 февраля 2020

Вы создаете 2 переменные

float pMouseX = mouseX;
float pMouseY = mouseY;

Затем в ничьей, после обновления змеи, вы обновляете эти переменные:

s.update
pMouseX = mouseX;
pMouseX = mouseY;

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

Массив - это в основном способ хранения нескольких переменных в одной переменной. ArrayList похож, но у него нет заданного размера. Это означает, что вы можете продолжать добавлять элементы в ArrayLists, чего нельзя делать с массивами.

Вы можете объявить такой ArrayList следующим образом:

ArrayList<float[]> arrayList = new ArrayList<float[]>(); //each element of the ArrayList is an array, which contains an x and y position

Чтобы получить x и y координаты любого прямоугольника, используйте arrayList.get(indexOfTheRectangle)[0] //use 1 instead of 0 for the y coordinate и обновите их следующим образом:

for (int i = arrayList.length - i; i > 0; i++) { //you need to go through the array backwards, because otherwise, for each element, you end up changing the value it is supposed to get, which results in all elements having the same value.
   arrayList[i] = arrayList[i - 1]; 
}
arrayList[0] = new float[]{mouseX, mouseY}
...