ran prettier
This commit is contained in:
parent
e792b75ad3
commit
831d238be7
@ -1,28 +1,27 @@
|
|||||||
import { Easing } from '../../types';
|
import { Easing } from "../../types";
|
||||||
import { HtmlUtils } from '../../WebRtc/HtmlUtils';
|
import { HtmlUtils } from "../../WebRtc/HtmlUtils";
|
||||||
import type { Box } from '../../WebRtc/LayoutManager';
|
import type { Box } from "../../WebRtc/LayoutManager";
|
||||||
import type { Player } from '../Player/Player';
|
import type { Player } from "../Player/Player";
|
||||||
import type { WaScaleManager } from '../Services/WaScaleManager';
|
import type { WaScaleManager } from "../Services/WaScaleManager";
|
||||||
import type { GameScene } from './GameScene';
|
import type { GameScene } from "./GameScene";
|
||||||
|
|
||||||
export enum CameraMode {
|
export enum CameraMode {
|
||||||
Free = 'Free',
|
Free = "Free",
|
||||||
Follow = 'Follow',
|
Follow = "Follow",
|
||||||
Focus = 'Focus',
|
Focus = "Focus",
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CameraManager extends Phaser.Events.EventEmitter {
|
export class CameraManager extends Phaser.Events.EventEmitter {
|
||||||
|
|
||||||
private scene: GameScene;
|
private scene: GameScene;
|
||||||
private camera: Phaser.Cameras.Scene2D.Camera;
|
private camera: Phaser.Cameras.Scene2D.Camera;
|
||||||
private cameraBounds: { x: number, y: number };
|
private cameraBounds: { x: number; y: number };
|
||||||
private waScaleManager: WaScaleManager;
|
private waScaleManager: WaScaleManager;
|
||||||
|
|
||||||
private cameraMode: CameraMode = CameraMode.Free;
|
private cameraMode: CameraMode = CameraMode.Free;
|
||||||
|
|
||||||
private restoreZoomTween?: Phaser.Tweens.Tween;
|
private restoreZoomTween?: Phaser.Tweens.Tween;
|
||||||
|
|
||||||
constructor(scene: GameScene, cameraBounds: { x: number, y: number }, waScaleManager: WaScaleManager) {
|
constructor(scene: GameScene, cameraBounds: { x: number; y: number }, waScaleManager: WaScaleManager) {
|
||||||
super();
|
super();
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
|
|
||||||
@ -39,7 +38,8 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enterFocusMode(
|
public enterFocusMode(
|
||||||
focusOn: { x: number, y: number, width: number, height: number }, duration: number = 1000,
|
focusOn: { x: number; y: number; width: number; height: number },
|
||||||
|
duration: number = 1000
|
||||||
): void {
|
): void {
|
||||||
this.setCameraMode(CameraMode.Focus);
|
this.setCameraMode(CameraMode.Focus);
|
||||||
this.waScaleManager.saveZoom();
|
this.waScaleManager.saveZoom();
|
||||||
@ -53,9 +53,12 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
|||||||
focusOn.x + focusOn.width * 0.5,
|
focusOn.x + focusOn.width * 0.5,
|
||||||
focusOn.y + focusOn.height * 0.5,
|
focusOn.y + focusOn.height * 0.5,
|
||||||
duration,
|
duration,
|
||||||
Easing.SineEaseOut, false, (camera, progress, x, y) => {
|
Easing.SineEaseOut,
|
||||||
|
false,
|
||||||
|
(camera, progress, x, y) => {
|
||||||
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
||||||
});
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public leaveFocusMode(player: Player): void {
|
public leaveFocusMode(player: Player): void {
|
||||||
@ -107,7 +110,7 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
|||||||
ease: Easing.SineEaseOut,
|
ease: Easing.SineEaseOut,
|
||||||
onUpdate: (tween: Phaser.Tweens.Tween) => {
|
onUpdate: (tween: Phaser.Tweens.Tween) => {
|
||||||
this.waScaleManager.zoomModifier = tween.getValue();
|
this.waScaleManager.zoomModifier = tween.getValue();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,4 +118,4 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
|||||||
this.camera = this.scene.cameras.main;
|
this.camera = this.scene.cameras.main;
|
||||||
this.camera.setBounds(0, 0, this.cameraBounds.x, this.cameraBounds.y);
|
this.camera.setBounds(0, 0, this.cameraBounds.x, this.cameraBounds.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
import type { ITiledMap, ITiledMapLayer, ITiledMapObject, ITiledMapObjectLayer, ITiledMapProperty } from "../Map/ITiledMap";
|
import type {
|
||||||
|
ITiledMap,
|
||||||
|
ITiledMapLayer,
|
||||||
|
ITiledMapObject,
|
||||||
|
ITiledMapObjectLayer,
|
||||||
|
ITiledMapProperty,
|
||||||
|
} from "../Map/ITiledMap";
|
||||||
import { flattenGroupLayersMap } from "../Map/LayersFlattener";
|
import { flattenGroupLayersMap } from "../Map/LayersFlattener";
|
||||||
import TilemapLayer = Phaser.Tilemaps.TilemapLayer;
|
import TilemapLayer = Phaser.Tilemaps.TilemapLayer;
|
||||||
import { DEPTH_OVERLAY_INDEX } from "./DepthIndexes";
|
import { DEPTH_OVERLAY_INDEX } from "./DepthIndexes";
|
||||||
import { GameMapProperties } from "./GameMapProperties";
|
import { GameMapProperties } from "./GameMapProperties";
|
||||||
import { MathUtils } from '../../Utils/MathUtils';
|
import { MathUtils } from "../../Utils/MathUtils";
|
||||||
|
|
||||||
export type PropertyChangeCallback = (
|
export type PropertyChangeCallback = (
|
||||||
newValue: string | number | boolean | undefined,
|
newValue: string | number | boolean | undefined,
|
||||||
@ -28,20 +34,20 @@ export type zoneChangeCallback = (
|
|||||||
export class GameMap {
|
export class GameMap {
|
||||||
/**
|
/**
|
||||||
* oldKey is the index of the previous tile.
|
* oldKey is the index of the previous tile.
|
||||||
*/
|
*/
|
||||||
private oldKey: number | undefined;
|
private oldKey: number | undefined;
|
||||||
/**
|
/**
|
||||||
* key is the index of the current tile.
|
* key is the index of the current tile.
|
||||||
*/
|
*/
|
||||||
private key: number | undefined;
|
private key: number | undefined;
|
||||||
/**
|
/**
|
||||||
* oldPosition is the previous position of the player.
|
* oldPosition is the previous position of the player.
|
||||||
*/
|
*/
|
||||||
private oldPosition: { x: number, y: number } | undefined;
|
private oldPosition: { x: number; y: number } | undefined;
|
||||||
/**
|
/**
|
||||||
* position is the current position of the player.
|
* position is the current position of the player.
|
||||||
*/
|
*/
|
||||||
private position: { x: number, y: number } | undefined;
|
private position: { x: number; y: number } | undefined;
|
||||||
|
|
||||||
private lastProperties = new Map<string, string | boolean | number>();
|
private lastProperties = new Map<string, string | boolean | number>();
|
||||||
private propertiesChangeCallbacks = new Map<string, Array<PropertyChangeCallback>>();
|
private propertiesChangeCallbacks = new Map<string, Array<PropertyChangeCallback>>();
|
||||||
@ -117,19 +123,19 @@ export class GameMap {
|
|||||||
this.oldPosition = this.position;
|
this.oldPosition = this.position;
|
||||||
this.position = { x, y };
|
this.position = { x, y };
|
||||||
this.triggerZonesChange();
|
this.triggerZonesChange();
|
||||||
|
|
||||||
this.oldKey = this.key;
|
this.oldKey = this.key;
|
||||||
|
|
||||||
const xMap = Math.floor(x / this.map.tilewidth);
|
const xMap = Math.floor(x / this.map.tilewidth);
|
||||||
const yMap = Math.floor(y / this.map.tileheight);
|
const yMap = Math.floor(y / this.map.tileheight);
|
||||||
const key = xMap + yMap * this.map.width;
|
const key = xMap + yMap * this.map.width;
|
||||||
|
|
||||||
if (key === this.key) {
|
if (key === this.key) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.key = key;
|
this.key = key;
|
||||||
|
|
||||||
this.triggerAllProperties();
|
this.triggerAllProperties();
|
||||||
this.triggerLayersChange();
|
this.triggerLayersChange();
|
||||||
}
|
}
|
||||||
@ -189,25 +195,27 @@ export class GameMap {
|
|||||||
* We user Tiled Objects with type "zone" as zones with defined x, y, width and height for easier event triggering.
|
* We user Tiled Objects with type "zone" as zones with defined x, y, width and height for easier event triggering.
|
||||||
*/
|
*/
|
||||||
private triggerZonesChange(): void {
|
private triggerZonesChange(): void {
|
||||||
const zones = this.tiledObjects.filter(object => object.type === "zone");
|
const zones = this.tiledObjects.filter((object) => object.type === "zone");
|
||||||
|
|
||||||
// P.H. NOTE: We could also get all of the zones and add properties of occupied tiles to them, so we could later on check collision by using tileKeys
|
// P.H. NOTE: We could also get all of the zones and add properties of occupied tiles to them, so we could later on check collision by using tileKeys
|
||||||
// TODO: Change this to an array with currently occupied sone instead of doing elimination process
|
// TODO: Change this to an array with currently occupied sone instead of doing elimination process
|
||||||
const zonesByOldPosition = this.oldPosition ?
|
const zonesByOldPosition = this.oldPosition
|
||||||
zones.filter((zone) => {
|
? zones.filter((zone) => {
|
||||||
if (!this.oldPosition) {
|
if (!this.oldPosition) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return MathUtils.isOverlappingWithRectangle(this.oldPosition, zone);
|
return MathUtils.isOverlappingWithRectangle(this.oldPosition, zone);
|
||||||
}) : [];
|
})
|
||||||
|
: [];
|
||||||
|
|
||||||
const zonesByNewPosition = this.position ?
|
const zonesByNewPosition = this.position
|
||||||
zones.filter((zone) => {
|
? zones.filter((zone) => {
|
||||||
if (!this.position) {
|
if (!this.position) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return MathUtils.isOverlappingWithRectangle(this.position, zone);
|
return MathUtils.isOverlappingWithRectangle(this.position, zone);
|
||||||
}) : [];
|
})
|
||||||
|
: [];
|
||||||
|
|
||||||
const enterZones = new Set(zonesByNewPosition);
|
const enterZones = new Set(zonesByNewPosition);
|
||||||
const leaveZones = new Set(zonesByOldPosition);
|
const leaveZones = new Set(zonesByOldPosition);
|
||||||
@ -459,7 +467,7 @@ export class GameMap {
|
|||||||
private getObjectsFromLayers(layers: ITiledMapLayer[]): ITiledMapObject[] {
|
private getObjectsFromLayers(layers: ITiledMapLayer[]): ITiledMapObject[] {
|
||||||
const objects: ITiledMapObject[] = [];
|
const objects: ITiledMapObject[] = [];
|
||||||
|
|
||||||
const objectLayers = layers.filter(layer => layer.type === "objectgroup");
|
const objectLayers = layers.filter((layer) => layer.type === "objectgroup");
|
||||||
for (const objectLayer of objectLayers) {
|
for (const objectLayer of objectLayers) {
|
||||||
if (this.isOfTypeITiledMapObjectLayer(objectLayer)) {
|
if (this.isOfTypeITiledMapObjectLayer(objectLayer)) {
|
||||||
objects.push(...objectLayer.objects);
|
objects.push(...objectLayer.objects);
|
||||||
|
@ -60,7 +60,7 @@ import { PinchManager } from "../UserInput/PinchManager";
|
|||||||
import { joystickBaseImg, joystickBaseKey, joystickThumbImg, joystickThumbKey } from "../Components/MobileJoystick";
|
import { joystickBaseImg, joystickBaseKey, joystickThumbImg, joystickThumbKey } from "../Components/MobileJoystick";
|
||||||
import { waScaleManager } from "../Services/WaScaleManager";
|
import { waScaleManager } from "../Services/WaScaleManager";
|
||||||
import { EmoteManager } from "./EmoteManager";
|
import { EmoteManager } from "./EmoteManager";
|
||||||
import { CameraManager } from './CameraManager';
|
import { CameraManager } from "./CameraManager";
|
||||||
import EVENT_TYPE = Phaser.Scenes.Events;
|
import EVENT_TYPE = Phaser.Scenes.Events;
|
||||||
import type { HasPlayerMovedEvent } from "../../Api/Events/HasPlayerMovedEvent";
|
import type { HasPlayerMovedEvent } from "../../Api/Events/HasPlayerMovedEvent";
|
||||||
|
|
||||||
@ -551,7 +551,11 @@ export class GameScene extends DirtyScene {
|
|||||||
this.createCurrentPlayer();
|
this.createCurrentPlayer();
|
||||||
this.removeAllRemotePlayers(); //cleanup the list of remote players in case the scene was rebooted
|
this.removeAllRemotePlayers(); //cleanup the list of remote players in case the scene was rebooted
|
||||||
|
|
||||||
this.cameraManager = new CameraManager(this, { x: this.Map.widthInPixels, y: this.Map.heightInPixels }, waScaleManager);
|
this.cameraManager = new CameraManager(
|
||||||
|
this,
|
||||||
|
{ x: this.Map.widthInPixels, y: this.Map.heightInPixels },
|
||||||
|
waScaleManager
|
||||||
|
);
|
||||||
biggestAvailableAreaStore.recompute();
|
biggestAvailableAreaStore.recompute();
|
||||||
this.cameraManager.startFollow(this.CurrentPlayer);
|
this.cameraManager.startFollow(this.CurrentPlayer);
|
||||||
|
|
||||||
@ -787,7 +791,7 @@ export class GameScene extends DirtyScene {
|
|||||||
this.gameMap.onEnterZone((zones) => {
|
this.gameMap.onEnterZone((zones) => {
|
||||||
for (const zone of zones) {
|
for (const zone of zones) {
|
||||||
for (const property of zone.properties ?? []) {
|
for (const property of zone.properties ?? []) {
|
||||||
if (property.name === 'focusable' && property.value === true) {
|
if (property.name === "focusable" && property.value === true) {
|
||||||
this.cameraManager.enterFocusMode(zone);
|
this.cameraManager.enterFocusMode(zone);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -801,7 +805,7 @@ export class GameScene extends DirtyScene {
|
|||||||
this.gameMap.onLeaveZone((zones) => {
|
this.gameMap.onLeaveZone((zones) => {
|
||||||
for (const zone of zones) {
|
for (const zone of zones) {
|
||||||
for (const property of zone.properties ?? []) {
|
for (const property of zone.properties ?? []) {
|
||||||
if (property.name === 'focusable' && property.value === true) {
|
if (property.name === "focusable" && property.value === true) {
|
||||||
this.cameraManager.leaveFocusMode(this.CurrentPlayer);
|
this.cameraManager.leaveFocusMode(this.CurrentPlayer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,27 +1,25 @@
|
|||||||
|
|
||||||
export class MathUtils {
|
export class MathUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param p Position to check.
|
* @param p Position to check.
|
||||||
* @param r Rectangle to check the overlap against.
|
* @param r Rectangle to check the overlap against.
|
||||||
* @returns true is overlapping
|
* @returns true is overlapping
|
||||||
*/
|
*/
|
||||||
public static isOverlappingWithRectangle(
|
public static isOverlappingWithRectangle(
|
||||||
p: { x: number, y: number},
|
p: { x: number; y: number },
|
||||||
r: { x: number, y: number, width: number, height: number},
|
r: { x: number; y: number; width: number; height: number }
|
||||||
): boolean {
|
): boolean {
|
||||||
return (this.isBetween(p.x, r.x, r.x + r.width) && this.isBetween(p.y, r.y, r.y + r.height));
|
return this.isBetween(p.x, r.x, r.x + r.width) && this.isBetween(p.y, r.y, r.y + r.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param value Value to check
|
* @param value Value to check
|
||||||
* @param min inclusive min value
|
* @param min inclusive min value
|
||||||
* @param max inclusive max value
|
* @param max inclusive max value
|
||||||
* @returns true if value is in <min, max>
|
* @returns true if value is in <min, max>
|
||||||
*/
|
*/
|
||||||
public static isBetween(value: number, min: number, max: number): boolean {
|
public static isBetween(value: number, min: number, max: number): boolean {
|
||||||
return (value >= min) && (value <= max);
|
return value >= min && value <= max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,5 +50,5 @@ export enum Easing {
|
|||||||
ExpoEaseInOut = "Expo.easeInOut",
|
ExpoEaseInOut = "Expo.easeInOut",
|
||||||
CircEaseInOut = "Circ.easeInOut",
|
CircEaseInOut = "Circ.easeInOut",
|
||||||
BackEaseInOut = "Back.easeInOut",
|
BackEaseInOut = "Back.easeInOut",
|
||||||
BounceEaseInOut = "Bounce.easeInOut"
|
BounceEaseInOut = "Bounce.easeInOut",
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user