Я пытаюсь повернуть изображение на 90 градусов, но когда я это делаю, оно выходит за пределы экрана (слева от окна), вот мой код:

Вот ссылка на мое изображение: http://imgur.com/gallery/pQ85Z

Сейчас я просто пытаюсь заставить его вращаться, когда я нажимаю 'r', но после этого мне нужно сделать так, чтобы он вращался, когда он ударяется о край экрана.

PImage head;
int fizzyX = 400;
int fizzyY = 50;
int movementX=0;
int movementY=0;
float x;

void setup() {
  size(800,800);
  background(255);
  head = loadImage("Fizzy.PNG");
}

void collisionDetection() {
  if (fizzyX == (750)) {
    movementX=-1;
    key = 'a';
  }
}



void keyPressed() {
  if (key == 'a' || key == 'A') {
    movementX = -1;
    movementY = 0;
  }
  if (key == 'd' || key == 'D') {
    movementX = 1;
    movementY = 0;
  }
  if (key == 'w' || key == 'W') {
    movementX = 0;
    movementY = -1;
  }
  if (key == 's' || key == 'S') {
    movementX = 0;
    movementY = 1;
  }
  if (key == 'r') {
    x = PI/2;
  }
}

void draw() {
  rotate(x);
  background(255);
  imageMode(CENTER);
  image(head,fizzyX,fizzyY);
  fizzyX+=movementX;
  fizzyY+=movementY;
  keyPressed();
  collisionDetection();
  translate(width/2,height/2);

}
0
Timothy Bolton 24 Апр 2017 в 06:38

2 ответа

Лучший ответ

Функция rotate() выполняет поворот вокруг источника, который по умолчанию равен 0,0. Это заставляет ваше изображение вращаться вокруг верхнего левого угла окна, что приводит к тому, что ваше изображение исчезает с экрана.

Если вы хотите повернуть изображение вокруг его центра, то сначала вы должны переместить начало координат в центр изображения. Вы делаете это с помощью функции translate(), но вы должны сделать это , прежде чем перейти к повороту.

Соедини это, это будет выглядеть так:

void draw() {

  background(255);

  imageMode(CENTER);
  translate(fizzyX, fizzyY);
  rotate(x);

  image(head,0,0);

  fizzyX+=movementX;
  fizzyY+=movementY;
  collisionDetection();

}

Также обратите внимание, что вам не следует вручную вызывать функцию keyPressed(). Обработка позвонит вам за вас.

0
Kevin Workman 7 Июл 2017 в 23:46

Более подробно, с моими предложениями:

-Каждое время, когда вы нажимаете r x, должно увеличиваться в HALF_PI (HALF_PI является константой, определенной при обработке)

Каждый раз, когда вы делаете преобразование, вы должны использовать pushMatrix () и popMatrix (), чтобы преобразовать только то, что лежит между ними.

-Положите начало координат, где вы хотите разместить фигуру, затем поверните, а затем поместите фигуру в 0,0. Это ваш исправленный код, и он работает как шарм.

- Использование PVector, когда это возможно, облегчает понимание кода, делает его менее загроможденным этой переменной, переменной

-X это плохое имя вращения.Англ был бы лучше

Попробуйте, это работает, и его путь более разборчивый.

PImage head;
PVector fizzy;
PVector movement;
float rotationAngle;

void setup(){
  size(800,800);
  fizzy=new PVector(400,50);
  movement=new PVector(0,0);
  rotationAngle=0;
  background(255);
  head = loadImage("Fizzy.png");
}

void collisionDetection() {
  if (fizzy.x == (750)) {
    movement.set(-1,0);
  }
}

void keyPressed() {
  if (key == 'a' || key == 'A') {
    movement.set(-1,0);
  }
  if (key == 'd' || key == 'D') {
    movement.set (1,0);
  }
  if (key == 'w' || key == 'W') {
    movement.set (0,-1);
  }
  if (key == 's' || key == 'S') {
    movement.set (0,1);
  }
  if (key == 'r') {  
     rotationAngle+=HALF_PI;  
  }
}

void draw() {
  background(255);
  pushMatrix();
  translate(fizzy.x,fizzy.y);
  rotate(rotationAngle);
  imageMode(CENTER);
  image(head,0,0);
  popMatrix();
  
  fizzy.add(movement);
  collisionDetection();
}
0
Community 20 Июн 2020 в 09:12