Хотя я ценю ответ Штефа, после небольшого исследования я обнаружил, что вращение холста, которое вы фактически используете для отображения, не кажется идеальным.Сохранение, вращение и восстановление при попытке создания сложных анимаций (иначе говоря, Street Fighter 2, а не астроиды) заставляет холст мерцать даже в Chrome.
Однако я нашел полезную стратегию.Идея заключается в том, что вы на самом деле создаете два холста, один из которых предназначен для вашей игры, а другой будет своего рода буфером, и он будет использоваться для поворота или масштабирования ваших спрайтов.Вы по существу трансформируете холст буферного буфера, рисуете изображение, которое хотите, а затем переносите его на свой основной холст и восстанавливаете (или нет) буфер.Таким образом, вы только вращаете скрытый холст и воздействуете только на спрайт, а не на всю игровую доску.
Код выглядит примерно так (работа в процессе):
mainContext.clearRect(lastXpos, lastYpos, lastWidth, lastHeight);
backContext.clearRect(0, 0, lastWidth, lastHeight);
lastXpos = xpos;
lastYpos = ypos;
lastWidth = width;
lastHeight = height;
backContext.save();
//check the direction of the sprite
//turn the backContext to this direction
//SPRITE_INVERTED==-1
if (spriteXDirection == SPRITE_INVERTED || spriteYDirection == SPRITE_INVERTED)
{
var horScale = 0;
var verScale = 0;
if (spriteXDirection == SPRITE_INVERTED)
{
horScale = width;
}
if (spriteYDirection == SPRITE_INVERTED)
{
verScale = height;
}
backContext.translate(horScale, verScale);
backContext.scale(spriteXDirection, spriteYDirection);
}
//draw the sprite not we always use 0,0 for top/left
backContext.drawImage(animations[currentPlay].sheet,
animationX,
animationY,
width,
height, 0, 0, width, height);
//Get the image data from the back context
var image = backContext.getImageData(0, 0, width, height);
//flip the back context back to center - or not, I haven't decided how to optimize this yet.
backContext.restore();
//transfer the image to your main context
mainContext.putImageData(image, xpos, ypos);
Это избавило меня от многих головных болей в понимании того, как переводить мои спрайты без перемещения всего на моей игровой доске повсюду.Похоже, что он работает лучше, чем изменение основного контекста.