Не существует такого понятия, как «вращение влево» и «вращение вправо», они оба относятся к одному и тому же. Вам нужно только одно значение поворота, это текущий угол вашего рисунка.
Я также предполагаю, что вы хотите, чтобы ваша клавиша «вверх» двигалась в любом направлении, а не вверх, поэтому вы можете переключать значения скорости только на одно значение - скорость в текущем направлении. Это в основном меняет вашу систему координат с декартовой (х, у) на полярной (угол и расстояние).
Чтобы узнать окончательное изменение в плоскости X-Y движения, основанное на вращении и скорости, вы должны использовать speed * cos(angle)
для X и speed * sin(angle)
для Y (на основе теоремы Пифагора).
rotate
должен быть вызван до того, как вы начнете рисовать прямоугольник (в основном это говорит, что «все, что я буду делать дальше, нужно будет повернуть на эту сумму»), а save
и restore
нужно будет вызвать вокруг всех что, чтобы отменить вращение, когда вы закончите рисовать повернутую форму.
Еще одно примечание: rotate
вращает холст вокруг начала координат (0, 0). Чтобы вращаться вокруг центра вашего элемента, что, вероятно, и нужно, вам нужно сначала translate
до позиции, а затем не забыть сместить позицию, в которой вы рисуете прямоугольник, чтобы учесть этот первоначальный перевод. .
Потенциальное обновление нижней части вашего кода будет:
function track(width, height, color, distanceX, distanceY, rotation){
this.width = width;
this.height = height;
this.distanceX = distanceX || 0;
this.distanceY = distanceY || 0;
this.speed = 0;
this.rotation = rotation || 0;
this.rotationSpeed = 0;
this.update = function(){
ctx = mainCanvas.ctx1;
ctx.fillStyle = color;
ctx.save();
ctx.translate(this.distanceX, this.distanceY);
ctx.rotate(this.rotation);
ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
ctx.restore();
}
this.newPosition = function(){
this.rotation += this.rotationSpeed;
this.distanceX += this.speed * Math.cos(this.rotation);
this.distanceY += this.speed * Math.sin(this.rotation);
}
}
function moveTracker(){ //recognize keys from keyboard
mainCanvas.clear();
tracker.speed = 0;
tracker.rotationSpeed = 0;
// Adjust the values as you need here
if (mainCanvas.key == 37) //left key
tracker.rotationSpeed = -0.5 / Math.PI;
if (mainCanvas.key == 38) //up key
tracker.speed = 3;
if (mainCanvas.key == 39) //right key
tracker.rotationSpeed = 0.5 / Math.PI;
if (mainCanvas.key == 40) //down key
tracker.speed = -3;
tracker.newPosition();
tracker.update();
}
JSFiddle (грубая версия)