Решил рассказать о том, как сделать нормальный Fullscreen mode в игре с учётом нашего менеджера масштабирования игры — ScaleMng.
Дело в том, что в полноэкранном режиме свойства padding и marging нашего родительского DOM объекта всегда равны 0, т.е. он автоматически выставляется в координаты (0, 0). А т.к. мой ScaleMng для подстройки экрана игры пользуется как раз этими свойствами, то в fullscreen он просто не будет работать правильно.
Вот какую картину я получил просто перейдя в полный экран при обычно работающем ScaleMng:
Т.е. изображение экрана игры сдвинуто вправо и выходит за экран от чего получается обрезано. ScaleMng делает всё правильно и если бы fullscreen позволял выставить margin, то экран игры бы центрировался.
Для того, чтобы поправить это дело, я внёс в ScaleMng небольшие изменения:
public static init(aGame: Phaser.Game, aDomId: string, GW: number, GH: number, GSW: number, GSH: number) { this.game = aGame; this.dom_id = aDomId; this.dom = document.getElementById(this.dom_id); this.game_w = GW; this.game_h = GH; this.game_sw = GSW; this.game_sh = GSH; this.game.scale.fullScreenScaleMode = Phaser.ScaleManager.SHOW_ALL; this.game.scale.scaleMode = Phaser.ScaleManager.USER_SCALE; this.isDesktop = this.game.device.desktop; // for test //this.isDesktop = false; ScaleManager.SizeCalculation(); window.onresize = () => { ScaleManager.SizeCalculation(); }; } private static doEventOriChange() { this.onOrientationChange.dispatch(this.isPortrait); } public static SizeCalculation() { if (this.game.scale.isFullScreen) { return; } ...
А именно:
[11]: установка свойства scaleMode для fullScreen; [30-32]: выход из функции расчёта скейла и сдвига игры во время полноэкранного режима.Теперь фулскрин работает без касяков и вы сами можете посмотреть это в действии по ссылке или скачав мой шаблон для Phaser2 из репозитория.