需要帮助来了解Affine2和Matrix4的区别

时间:2019-06-02 09:59:23

标签: java libgdx spritebatch

我不了解affine2的工作原理,有人要求我使用Affine2而不是spriteBatch.transformMatrix来避免刷新每个纹理图。

在视频中,我向您展示了Affine2发生了什么,所有都是混合的:(

https://youtu.be/3ErGAcvyC8s

@Override
public void draw(SpriteBatch spriteBatch, ShapeRenderer shapeRenderer, Affine2 affine2) {
    if (texture == null)
        return;

    spriteBatch.setColor(1, 1, 1, getAlpha());
    spriteBatch.draw(texture, size.width, size.height, calculate(affine2));
}

public Affine2 calculate(Affine2 affine2) {
    List<SKNode> nodes = getParents();
    Collections.reverse(nodes);
    nodes.add(this);

    affine2.idt();
    affine2.translate(-size.width / 2, -size.height / 2);
    for (SKNode node : nodes) {
        affine2.translate(node.position.x + node.origin.x, node.position.y + node.origin.y);
        affine2.rotate(node.zRotation);
        affine2.scale(node.xScale, node.yScale);
        affine2.translate(-node.origin.x, -node.origin.y);
    }

    return affine2;
}

当我使用spriteBatck transformMatrix时,会使fps下降,但显示效果完美。

public Matrix4 getTransformMatrix() {
    List<SKNode> nodes = getParents();
    Collections.reverse(nodes);
    nodes.add(this);

    Matrix4 transformMatrix = new Matrix4();
    transformMatrix.idt();
    for (SKNode node : nodes) {
        transformMatrix.translate(node.position.x + node.origin.x, node.position.y + node.origin.y, 0);
        transformMatrix.rotate(0, 0, 1, node.zRotation);
        transformMatrix.scale(node.xScale, node.yScale, 0);
        transformMatrix.translate(-node.origin.x, -node.origin.y, 0);
    }

    return transformMatrix;
}

0 个答案:

没有答案