All files / src/utils/pixiUtils Avatar.ts

0% Statements 0/34
0% Branches 0/8
0% Functions 0/8
0% Lines 0/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90                                                                                                                                                                                   
import {Sprite} from '@pixi/sprite';
import {Viewport} from 'pixi-viewport';
import {
  AvatarImageEnum,
  AvatarFaceEnum,
  avatarImageMDs,
} from './metaData/ImageMetaData';
import {DisplayContainer} from './DisplayContainer';
import {AvatarData, DisplayContainerData} from './metaData/DataInterface';
import {ResourceManager} from './ResourceManager';
import {World} from './World';
 
const avatarMDs = require('./metaData/avatars.json');
 
export interface IAvatar {
  avatarImageEnum: AvatarImageEnum;
  avatarFace: AvatarFaceEnum;
  avatarFaceScale: number;
  faceTexture: string[];
  partRotateDegree: number[];
  viewport: Viewport;
}
 
export enum AvatarParts {
  LEFT_ARM,
  LEFT_LEG,
  BODY,
  RIGHT_ARM,
  RIGHT_LEG,
  FACE,
}
 
export const PARTS_ROTATE_SPEED = 2;
 
export class Avatar extends DisplayContainer implements IAvatar {
  public avatarImageEnum: AvatarImageEnum;
  public avatarFace: AvatarFaceEnum;
  public avatarFaceScale: number;
  public faceTexture: string[];
  public partRotateDegree: number[];
  public viewport: Viewport;
 
  constructor(world: World, viewport: Viewport) {
    super(world);
 
    this.avatarImageEnum = AvatarImageEnum.BUNNY;
    this.avatarFace = AvatarFaceEnum.FACE_MUTE;
    this.avatarFaceScale = 1.0;
    this.partRotateDegree = Array.from({length: 6}, () => 0);
    this.position.copyFrom(world.startPosition);
    this.viewport = viewport;
    this.faceTexture = [];
  }
 
  public setAvatar(avatarImageEnum: AvatarImageEnum): void {
    this.avatarImageEnum = avatarImageEnum;
    this.changeAvatar(this.getAvatarMD());
  }
 
  protected getAvatarMD(): AvatarData {
    const avatarName = this.getAvatarInitialName();
    return avatarMDs[avatarName];
  }
 
  private getAvatarInitialName(): string {
    return avatarImageMDs[this.avatarImageEnum].avatarInitialName;
  }
 
  public changeAvatar(data: DisplayContainerData): void {
    const newParts: Sprite[] = [];
    data.parts.forEach(part => {
      const sprite = this.makeSpriteFromPartsMD(part);
      if (sprite) newParts.push(sprite);
    });
    const faceTexture = this.getAvatarMD().faceTexture;
    if (faceTexture) this.faceTexture = faceTexture;
    this.removeChildren();
    this.parts = newParts;
    this.addPartsToChild();
    if (data.collisionBox) this.addCollisionBox(data.collisionBox);
  }
 
  public swapFace(): void {
    const textureName = this.faceTexture[this.avatarFace];
    const face = this.children[AvatarParts.FACE] as Sprite;
    const texture = ResourceManager.getTexture(textureName, 'avatars.json');
    if (texture) face.texture = texture;
  }
}