Рисование холста (с drawImage) в другое не работает

Я пытаюсь сделать игру, где все враги тянутся в один холст (ctxEnemy), но я испытываю некоторые трудности, заставляя их стоять в разных положениях, так как с помощью функции поворота холста он будет вращать их все одновременно.

Моя идея разобраться с этим состояла в том, чтобы на самом деле нарисовать их на вспомогательном холсте, повернуть этот холст и только потом нарисовать его на главном холсте. Это было бы хорошо, если drawImage() не разбить все...

Я был в состоянии использовать ctxEnemy.drawImage(ctxAux,0,0) в первых строках кода для тестирования, но всякий раз, когда я помещаю его в какую-либо функцию рисования, он перестает работать.

ВОПРОС: может кто-нибудь объяснить мне, почему drawImage() не работает, или, может быть, даже дает мне другое более простое решение моей проблемы?

Enemy.prototype.draw = function(){
    ctxAux.clearRect(0,0,gameWidth,gameHeight);
    ctxAux.drawImage(imgSprite,this.srcX,this.srcY,this.width,this.height,this.drawX,this.drawY,this.width,this.height);
    //ctxAux.rotate(some angle);
    ctxEnemy.drawImage(ctxAux,0,0);
}

1 ответ

Демонстрация с использованием этой простой таблицы (2 спрайта): http://jsfiddle.net/m1erickson/ZJunX/

Сначала определите, где каждый из ваших отдельных спрайтов находится в вашей таблице спрайтов:

var sprites={
    shipOff:{x:0,y:0,w:90,h:90},
    shipOn:{x:90,y:0,w:90,h:90},
}

Если вы хотите повернуть врага вокруг его центральной точки, то эта функция привлечет вашего врага:

function drawEnemy(spritename,drawCenterX,drawCenterY,radianAngle){

    // get the desired sprite info from sprites[]
    var sprite=sprites[spritename];

    // save the unrotated context state
    ctx.save();

    // translate to the desired rotation point
    ctx.translate(drawCenterX,drawCenterY);

    // rotate by the desired angle
    ctx.rotate(radianAngle);

    // clip this desired sprite from the spritesheet and 
    // draw it on the canvas
    ctx.drawImage(spritesheet,
        sprite.x,sprite.y,sprite.w,sprite.h,
        -sprite.w/2,-sprite.h/2,sprite.w,sprite.h
    );

    // restore the context to its unrotated state
    ctx.restore();
}

Аргументы функции:

  • spritename - это имя из вашего объекта спрайтов (например, "shipOn")

  • drawCenterX / drawCenterY - это место, где на холсте будет нарисован ваш враг (центр изображения спрайта врага будет в drawCenterX / drawCenterY)

  • radianAngle - это угол, на который вы хотите повернуть спрайт

Другие вопросы по тегам