UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

291 lines (228 loc) 9.63 kB
var GetCalcMatrix = require('../../src/gameobjects/GetCalcMatrix'); var TransformMatrix = require('../../src/gameobjects/components/TransformMatrix'); function makeSrc (overrides) { var defaults = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, scrollFactorX: 1, scrollFactorY: 1 }; if (overrides) { for (var key in overrides) { defaults[key] = overrides[key]; } } return defaults; } function makeCamera (overrides) { var cam = { scrollX: 0, scrollY: 0, matrix: new TransformMatrix(), matrixCombined: new TransformMatrix(), matrixExternal: new TransformMatrix() }; if (overrides) { for (var key in overrides) { cam[key] = overrides[key]; } } return cam; } describe('Phaser.GameObjects.GetCalcMatrix', function () { it('should be importable', function () { expect(GetCalcMatrix).toBeDefined(); }); it('should return an object with camera, sprite, calc, and cameraExternal properties', function () { var src = makeSrc(); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result).toBeDefined(); expect(result.camera).toBeDefined(); expect(result.sprite).toBeDefined(); expect(result.calc).toBeDefined(); expect(result.cameraExternal).toBeDefined(); }); it('should return TransformMatrix instances for all result properties', function () { var src = makeSrc(); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.camera).toBeInstanceOf(TransformMatrix); expect(result.sprite).toBeInstanceOf(TransformMatrix); expect(result.calc).toBeInstanceOf(TransformMatrix); expect(result.cameraExternal).toBeInstanceOf(TransformMatrix); }); it('should apply sprite position to the sprite matrix', function () { var src = makeSrc({ x: 100, y: 200 }); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.sprite.tx).toBeCloseTo(100); expect(result.sprite.ty).toBeCloseTo(200); }); it('should apply sprite scale to the sprite matrix', function () { var src = makeSrc({ x: 0, y: 0, scaleX: 2, scaleY: 3 }); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.sprite.a).toBeCloseTo(2); expect(result.sprite.d).toBeCloseTo(3); }); it('should apply sprite rotation to the sprite matrix', function () { var angle = Math.PI / 4; var src = makeSrc({ rotation: angle, scaleX: 1, scaleY: 1 }); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.sprite.a).toBeCloseTo(Math.cos(angle)); expect(result.sprite.b).toBeCloseTo(Math.sin(angle)); expect(result.sprite.c).toBeCloseTo(-Math.sin(angle)); expect(result.sprite.d).toBeCloseTo(Math.cos(angle)); }); it('should copy camera matrixCombined into the cam matrix when ignoreCameraPosition is false', function () { var combined = new TransformMatrix(2, 0, 0, 2, 50, 60); var camera = makeCamera({ matrixCombined: combined, scrollX: 0, scrollY: 0 }); var src = makeSrc({ scrollFactorX: 1, scrollFactorY: 1 }); var result = GetCalcMatrix(src, camera); expect(result.camera.a).toBeCloseTo(2); expect(result.camera.d).toBeCloseTo(2); }); it('should use camera.matrix instead of matrixCombined when ignoreCameraPosition is true', function () { var mat = new TransformMatrix(3, 0, 0, 3, 0, 0); var combined = new TransformMatrix(1, 0, 0, 1, 0, 0); var camera = makeCamera({ matrix: mat, matrixCombined: combined, scrollX: 0, scrollY: 0 }); var src = makeSrc({ scrollFactorX: 1, scrollFactorY: 1 }); var result = GetCalcMatrix(src, camera, null, true); expect(result.camera.a).toBeCloseTo(3); expect(result.camera.d).toBeCloseTo(3); }); it('should set cameraExternal to identity when ignoreCameraPosition is true', function () { var extMatrix = new TransformMatrix(5, 0, 0, 5, 100, 200); var camera = makeCamera({ matrixExternal: extMatrix, scrollX: 0, scrollY: 0 }); var src = makeSrc(); var result = GetCalcMatrix(src, camera, null, true); expect(result.cameraExternal.a).toBeCloseTo(1); expect(result.cameraExternal.b).toBeCloseTo(0); expect(result.cameraExternal.c).toBeCloseTo(0); expect(result.cameraExternal.d).toBeCloseTo(1); expect(result.cameraExternal.tx).toBeCloseTo(0); expect(result.cameraExternal.ty).toBeCloseTo(0); }); it('should copy camera matrixExternal into cameraExternal when ignoreCameraPosition is false', function () { var extMatrix = new TransformMatrix(4, 0, 0, 4, 10, 20); var camera = makeCamera({ matrixExternal: extMatrix, scrollX: 0, scrollY: 0 }); var src = makeSrc(); var result = GetCalcMatrix(src, camera, null, false); expect(result.cameraExternal.a).toBeCloseTo(4); expect(result.cameraExternal.d).toBeCloseTo(4); expect(result.cameraExternal.tx).toBeCloseTo(10); expect(result.cameraExternal.ty).toBeCloseTo(20); }); it('should multiply parentMatrix into calc matrix when provided', function () { var src = makeSrc({ x: 0, y: 0, scaleX: 1, scaleY: 1, rotation: 0 }); var camera = makeCamera({ scrollX: 0, scrollY: 0 }); var parentMatrix = new TransformMatrix(2, 0, 0, 2, 0, 0); var resultWithParent = GetCalcMatrix(src, camera, parentMatrix); var calcWithParent = resultWithParent.calc.a; var resultWithout = GetCalcMatrix(src, camera, null); var calcWithout = resultWithout.calc.a; expect(calcWithParent).not.toBe(calcWithout); expect(calcWithParent).toBeCloseTo(2); }); it('should produce identity-like calc matrix for a default src and camera with no parent', function () { var src = makeSrc(); var camera = makeCamera({ scrollX: 0, scrollY: 0 }); var result = GetCalcMatrix(src, camera, null); expect(result.calc.a).toBeCloseTo(1); expect(result.calc.b).toBeCloseTo(0); expect(result.calc.c).toBeCloseTo(0); expect(result.calc.d).toBeCloseTo(1); expect(result.calc.tx).toBeCloseTo(0); expect(result.calc.ty).toBeCloseTo(0); }); it('should factor scroll offset into camera matrix translation when scrollFactor is 1', function () { var combined = new TransformMatrix(1, 0, 0, 1, 0, 0); var camera = makeCamera({ matrixCombined: combined, scrollX: 50, scrollY: 80 }); var src = makeSrc({ scrollFactorX: 1, scrollFactorY: 1 }); var result = GetCalcMatrix(src, camera); // scrollFactor of 1 means (1 - 1) = 0, no scroll offset applied expect(result.camera.tx).toBeCloseTo(0); expect(result.camera.ty).toBeCloseTo(0); }); it('should apply scroll offset when scrollFactor is 0', function () { var combined = new TransformMatrix(1, 0, 0, 1, 0, 0); var camera = makeCamera({ matrixCombined: combined, scrollX: 50, scrollY: 80 }); var src = makeSrc({ scrollFactorX: 0, scrollFactorY: 0 }); var result = GetCalcMatrix(src, camera); // scrollFactor of 0 means (1 - 0) = 1, full scroll offset applied expect(result.camera.tx).toBeCloseTo(50); expect(result.camera.ty).toBeCloseTo(80); }); it('should return the same result object reference on each call', function () { var src = makeSrc(); var camera = makeCamera(); var result1 = GetCalcMatrix(src, camera); var result2 = GetCalcMatrix(src, camera); expect(result1).toBe(result2); }); it('should handle zero scale values without throwing', function () { var src = makeSrc({ scaleX: 0, scaleY: 0 }); var camera = makeCamera(); expect(function () { GetCalcMatrix(src, camera); }).not.toThrow(); var result = GetCalcMatrix(src, camera); expect(result.sprite.a).toBeCloseTo(0); expect(result.sprite.d).toBeCloseTo(0); }); it('should handle negative scale values', function () { var src = makeSrc({ scaleX: -1, scaleY: -2 }); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.sprite.a).toBeCloseTo(-1); expect(result.sprite.d).toBeCloseTo(-2); }); it('should handle negative position values', function () { var src = makeSrc({ x: -100, y: -200 }); var camera = makeCamera(); var result = GetCalcMatrix(src, camera); expect(result.sprite.tx).toBeCloseTo(-100); expect(result.sprite.ty).toBeCloseTo(-200); }); it('should handle partial scroll factor correctly', function () { var combined = new TransformMatrix(1, 0, 0, 1, 0, 0); var camera = makeCamera({ matrixCombined: combined, scrollX: 100, scrollY: 100 }); var src = makeSrc({ scrollFactorX: 0.5, scrollFactorY: 0.5 }); var result = GetCalcMatrix(src, camera); // (1 - 0.5) * 100 = 50 expect(result.camera.tx).toBeCloseTo(50); expect(result.camera.ty).toBeCloseTo(50); }); });