2020-07-28 11:06:08 +02:00
|
|
|
import {EnableCameraSceneName} from "./EnableCameraScene";
|
|
|
|
import {TextField} from "../Components/TextField";
|
|
|
|
import Image = Phaser.GameObjects.Image;
|
|
|
|
import Rectangle = Phaser.GameObjects.Rectangle;
|
2020-10-20 16:39:23 +02:00
|
|
|
import {BodyResourceDescriptionInterface, LAYERS, loadAllLayers, loadCustomTexture} from "../Entity/body_character";
|
2020-07-28 11:06:08 +02:00
|
|
|
import Sprite = Phaser.GameObjects.Sprite;
|
|
|
|
import Container = Phaser.GameObjects.Container;
|
2020-07-28 15:53:44 +02:00
|
|
|
import {gameManager} from "../Game/GameManager";
|
2020-10-08 16:00:29 +02:00
|
|
|
import {ResizableScene} from "./ResizableScene";
|
2020-10-20 13:44:57 +02:00
|
|
|
import {localUserStore} from "../../Connexion/LocalUserStore";
|
2020-10-20 16:39:23 +02:00
|
|
|
import {PlayerResourceDescriptionInterface} from "../Entity/Character";
|
2020-12-04 11:30:35 +01:00
|
|
|
import {SelectCharacterSceneName} from "./SelectCharacterScene";
|
|
|
|
import {LoginSceneName} from "./LoginScene";
|
2020-07-28 11:06:08 +02:00
|
|
|
|
|
|
|
export const CustomizeSceneName = "CustomizeScene";
|
|
|
|
|
|
|
|
enum CustomizeTextures{
|
|
|
|
icon = "icon",
|
|
|
|
arrowRight = "arrow_right",
|
|
|
|
mainFont = "main_font",
|
|
|
|
arrowUp = "arrow_up",
|
|
|
|
}
|
|
|
|
|
2020-10-08 16:00:29 +02:00
|
|
|
export class CustomizeScene extends ResizableScene {
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-08-07 23:39:06 +02:00
|
|
|
private textField!: TextField;
|
|
|
|
private enterField!: TextField;
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-08-07 23:39:06 +02:00
|
|
|
private arrowRight!: Image;
|
|
|
|
private arrowLeft!: Image;
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-08-07 23:39:06 +02:00
|
|
|
private arrowDown!: Image;
|
|
|
|
private arrowUp!: Image;
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-08-07 23:39:06 +02:00
|
|
|
private Rectangle!: Rectangle;
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-08-07 23:39:06 +02:00
|
|
|
private logo!: Image;
|
2020-07-28 11:06:08 +02:00
|
|
|
|
2020-10-20 13:44:57 +02:00
|
|
|
private selectedLayers: number[] = [0];
|
|
|
|
private containersRow: Container[][] = [];
|
|
|
|
private activeRow:number = 0;
|
2020-10-20 16:39:23 +02:00
|
|
|
private layers: BodyResourceDescriptionInterface[][] = [];
|
2020-07-28 11:06:08 +02:00
|
|
|
|
|
|
|
constructor() {
|
|
|
|
super({
|
|
|
|
key: CustomizeSceneName
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
preload() {
|
|
|
|
this.load.image(CustomizeTextures.arrowRight, "resources/objects/arrow_right.png");
|
|
|
|
this.load.image(CustomizeTextures.icon, "resources/logos/tcm_full.png");
|
|
|
|
this.load.image(CustomizeTextures.arrowUp, "resources/objects/arrow_up.png");
|
|
|
|
this.load.bitmapFont(CustomizeTextures.mainFont, 'resources/fonts/arcade.png', 'resources/fonts/arcade.xml');
|
|
|
|
|
|
|
|
//load all the png files
|
2020-07-29 11:40:05 +02:00
|
|
|
loadAllLayers(this.load);
|
2020-10-20 16:39:23 +02:00
|
|
|
|
|
|
|
// load custom layers
|
|
|
|
this.layers = LAYERS;
|
|
|
|
|
|
|
|
const localUser = localUserStore.getLocalUser();
|
|
|
|
|
|
|
|
const textures = localUser?.textures;
|
|
|
|
if (textures) {
|
|
|
|
for (const texture of textures) {
|
|
|
|
loadCustomTexture(this.load, texture);
|
|
|
|
const name = 'customCharacterTexture'+texture.id;
|
|
|
|
this.layers[texture.level].unshift({
|
|
|
|
name,
|
|
|
|
img: texture.url
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2020-07-28 11:06:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
create() {
|
|
|
|
this.textField = new TextField(this, this.game.renderer.width / 2, 30, 'Customize your own Avatar!');
|
|
|
|
|
2020-10-15 12:05:40 +02:00
|
|
|
this.enterField = new TextField(this, this.game.renderer.width / 2, 40, 'you can start the game by pressing SPACE..');
|
2020-07-28 11:06:08 +02:00
|
|
|
|
|
|
|
this.logo = new Image(this, this.game.renderer.width - 30, this.game.renderer.height - 20, CustomizeTextures.icon);
|
|
|
|
this.add.existing(this.logo);
|
|
|
|
|
|
|
|
|
|
|
|
this.arrowRight = new Image(this, this.game.renderer.width*0.9, this.game.renderer.height/2, CustomizeTextures.arrowRight);
|
|
|
|
this.add.existing(this.arrowRight);
|
|
|
|
|
|
|
|
this.arrowLeft = new Image(this, this.game.renderer.width/9, this.game.renderer.height/2, CustomizeTextures.arrowRight);
|
|
|
|
this.arrowLeft.flipX = true;
|
|
|
|
this.add.existing(this.arrowLeft);
|
|
|
|
|
|
|
|
|
|
|
|
this.Rectangle = this.add.rectangle(this.cameras.main.worldView.x + this.cameras.main.width / 2, this.cameras.main.worldView.y + this.cameras.main.height / 2, 32, 33)
|
|
|
|
this.Rectangle.setStrokeStyle(2, 0xFFFFFF);
|
|
|
|
this.add.existing(this.Rectangle);
|
|
|
|
|
|
|
|
this.arrowDown = new Image(this, this.game.renderer.width - 30, 100, CustomizeTextures.arrowUp);
|
|
|
|
this.arrowDown.flipY = true;
|
|
|
|
this.add.existing(this.arrowDown);
|
|
|
|
|
|
|
|
this.arrowUp = new Image(this, this.game.renderer.width - 30, 60, CustomizeTextures.arrowUp);
|
|
|
|
this.add.existing(this.arrowUp);
|
|
|
|
|
|
|
|
this.createCustomizeLayer(0, 0, 0);
|
|
|
|
this.createCustomizeLayer(0, 0, 1);
|
|
|
|
this.createCustomizeLayer(0, 0, 2);
|
|
|
|
this.createCustomizeLayer(0, 0, 3);
|
|
|
|
this.createCustomizeLayer(0, 0, 4);
|
|
|
|
this.createCustomizeLayer(0, 0, 5);
|
|
|
|
|
|
|
|
this.moveLayers();
|
|
|
|
this.input.keyboard.on('keyup-ENTER', () => {
|
2020-07-28 15:53:44 +02:00
|
|
|
const layers: string[] = [];
|
|
|
|
let i = 0;
|
2020-07-28 17:43:33 +02:00
|
|
|
for (const layerItem of this.selectedLayers) {
|
2020-07-28 15:53:44 +02:00
|
|
|
if (layerItem !== undefined) {
|
2020-10-20 16:39:23 +02:00
|
|
|
layers.push(this.layers[i][layerItem].name);
|
2020-07-28 15:53:44 +02:00
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
gameManager.setCharacterLayers(layers);
|
|
|
|
|
2020-12-04 11:30:35 +01:00
|
|
|
this.scene.sleep(CustomizeSceneName)
|
|
|
|
this.scene.run(EnableCameraSceneName);
|
2020-07-28 11:06:08 +02:00
|
|
|
});
|
|
|
|
|
2020-10-20 13:44:57 +02:00
|
|
|
this.input.keyboard.on('keydown-RIGHT', () => this.moveCursorHorizontally(1));
|
|
|
|
this.input.keyboard.on('keydown-LEFT', () => this.moveCursorHorizontally(-1));
|
|
|
|
this.input.keyboard.on('keydown-DOWN', () => this.moveCursorVertically(1));
|
|
|
|
this.input.keyboard.on('keydown-UP', () => this.moveCursorVertically(-1));
|
2020-10-20 16:39:23 +02:00
|
|
|
|
2020-10-20 17:22:32 +02:00
|
|
|
const customCursorPosition = localUserStore.getCustomCursorPosition();
|
2020-10-20 13:44:57 +02:00
|
|
|
if (customCursorPosition) {
|
2020-10-20 17:22:32 +02:00
|
|
|
this.activeRow = customCursorPosition.activeRow;
|
2020-10-20 13:44:57 +02:00
|
|
|
this.selectedLayers = customCursorPosition.selectedLayers;
|
2020-10-20 17:22:32 +02:00
|
|
|
this.moveLayers();
|
|
|
|
this.updateSelectedLayer();
|
|
|
|
}
|
2020-10-20 13:44:57 +02:00
|
|
|
}
|
2020-10-20 16:39:23 +02:00
|
|
|
|
2020-10-20 13:44:57 +02:00
|
|
|
private moveCursorHorizontally(index: number): void {
|
2020-10-20 17:22:32 +02:00
|
|
|
this.selectedLayers[this.activeRow] += index;
|
2020-10-20 13:44:57 +02:00
|
|
|
if (this.selectedLayers[this.activeRow] < 0) {
|
|
|
|
this.selectedLayers[this.activeRow] = 0
|
2020-10-20 16:39:23 +02:00
|
|
|
} else if(this.selectedLayers[this.activeRow] > this.layers[this.activeRow].length - 1) {
|
|
|
|
this.selectedLayers[this.activeRow] = this.layers[this.activeRow].length - 1
|
2020-10-20 13:44:57 +02:00
|
|
|
}
|
|
|
|
this.moveLayers();
|
|
|
|
this.updateSelectedLayer();
|
2020-10-20 17:22:32 +02:00
|
|
|
this.saveInLocalStorage();
|
2020-10-20 13:44:57 +02:00
|
|
|
}
|
2020-10-20 16:39:23 +02:00
|
|
|
|
2020-10-20 13:44:57 +02:00
|
|
|
private moveCursorVertically(index:number): void {
|
|
|
|
this.activeRow += index;
|
|
|
|
if (this.activeRow < 0) {
|
|
|
|
this.activeRow = 0
|
2020-10-20 16:39:23 +02:00
|
|
|
} else if (this.activeRow > this.layers.length - 1) {
|
|
|
|
this.activeRow = this.layers.length - 1
|
2020-10-20 13:44:57 +02:00
|
|
|
}
|
|
|
|
this.moveLayers();
|
2020-10-20 17:22:32 +02:00
|
|
|
this.saveInLocalStorage();
|
2020-07-28 11:06:08 +02:00
|
|
|
}
|
2020-10-20 16:39:23 +02:00
|
|
|
|
2020-10-20 17:22:32 +02:00
|
|
|
private saveInLocalStorage() {
|
|
|
|
localUserStore.setCustomCursorPosition(this.activeRow, this.selectedLayers);
|
|
|
|
}
|
2020-10-20 16:39:23 +02:00
|
|
|
|
2020-07-28 11:06:08 +02:00
|
|
|
update(time: number, delta: number): void {
|
|
|
|
super.update(time, delta);
|
|
|
|
this.enterField.setVisible(!!(Math.floor(time / 500) % 2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param x, the layer's vertical position
|
|
|
|
* @param y, the layer's horizontal position
|
2020-10-20 16:39:23 +02:00
|
|
|
* @param layerNumber, index of the this.layers array
|
2020-07-28 11:06:08 +02:00
|
|
|
* create the layer and display it on the scene
|
|
|
|
*/
|
|
|
|
private createCustomizeLayer(x: number, y: number, layerNumber: number): void {
|
2020-10-20 13:44:57 +02:00
|
|
|
this.containersRow[layerNumber] = [];
|
2020-10-20 17:22:32 +02:00
|
|
|
this.selectedLayers[layerNumber] = 0;
|
2020-07-28 11:06:08 +02:00
|
|
|
let alpha = 0;
|
|
|
|
let layerPosX = 0;
|
2020-10-20 16:39:23 +02:00
|
|
|
for (let i = 0; i < this.layers[layerNumber].length; i++) {
|
2020-07-28 11:06:08 +02:00
|
|
|
const container = this.generateCharacter(300 + x + layerPosX, y, layerNumber, i);
|
|
|
|
|
|
|
|
this.containersRow[layerNumber][i] = container;
|
|
|
|
this.add.existing(container);
|
|
|
|
layerPosX += 30;
|
|
|
|
alpha += 0.1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generates a character from the current selected items BUT replaces
|
|
|
|
* one layer item with an item we pass in parameter.
|
|
|
|
*
|
|
|
|
* Current selected items are fetched from this.selectedLayers
|
|
|
|
*
|
|
|
|
* @param x,
|
|
|
|
* @param y,
|
|
|
|
* @param layerNumber, The selected layer number (0 for body...)
|
|
|
|
* @param selectedItem, The number of the item select (0 for black body...)
|
|
|
|
*/
|
|
|
|
private generateCharacter(x: number, y: number, layerNumber: number, selectedItem: number) {
|
|
|
|
return new Container(this, x, y,this.getContainerChildren(layerNumber,selectedItem));
|
|
|
|
}
|
|
|
|
|
|
|
|
private getContainerChildren(layerNumber: number, selectedItem: number): Array<Sprite> {
|
|
|
|
const children: Array<Sprite> = new Array<Sprite>();
|
|
|
|
for (let j = 0; j <= layerNumber; j++) {
|
|
|
|
if (j === layerNumber) {
|
2020-10-20 16:39:23 +02:00
|
|
|
children.push(this.generateLayers(0, 0, this.layers[j][selectedItem].name));
|
2020-07-28 11:06:08 +02:00
|
|
|
} else {
|
|
|
|
const layer = this.selectedLayers[j];
|
|
|
|
if (layer === undefined) {
|
|
|
|
continue;
|
|
|
|
}
|
2020-10-20 16:39:23 +02:00
|
|
|
children.push(this.generateLayers(0, 0, this.layers[j][layer].name));
|
2020-07-28 11:06:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return children;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Move the layer left, right, up and down and update the selected layer
|
|
|
|
*/
|
|
|
|
private moveLayers(): void {
|
|
|
|
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
|
|
|
const screenCenterY = this.cameras.main.worldView.y + this.cameras.main.height / 2;
|
|
|
|
const screenWidth = this.game.renderer.width;
|
|
|
|
const screenHeight = this.game.renderer.height;
|
|
|
|
for (let i = 0; i < this.containersRow.length; i++) {
|
|
|
|
for (let j = 0; j < this.containersRow[i].length; j++) {
|
|
|
|
let selectedX = this.selectedLayers[i];
|
|
|
|
if (selectedX === undefined) {
|
|
|
|
selectedX = 0;
|
|
|
|
}
|
|
|
|
this.containersRow[i][j].x = screenCenterX + (j - selectedX) * 40;
|
|
|
|
this.containersRow[i][j].y = screenCenterY + (i - this.activeRow) * 40;
|
|
|
|
const alpha1 = Math.abs(selectedX - j)*47*2/screenWidth;
|
|
|
|
const alpha2 = Math.abs(this.activeRow - i)*49*2/screenHeight;
|
|
|
|
this.containersRow[i][j].setAlpha((1 -alpha1)*(1 - alpha2));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param x, the sprite's vertical position
|
|
|
|
* @param y, the sprites's horizontal position
|
|
|
|
* @param name, the sprite's name
|
|
|
|
* @return a new sprite
|
|
|
|
*/
|
|
|
|
private generateLayers(x: number, y: number, name: string): Sprite {
|
|
|
|
return new Sprite(this, x, y, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
private updateSelectedLayer() {
|
|
|
|
for(let i = 0; i < this.containersRow.length; i++){
|
|
|
|
for(let j = 0; j < this.containersRow[i].length; j++){
|
|
|
|
const children = this.getContainerChildren(i, j);
|
|
|
|
this.containersRow[i][j].removeAll(true);
|
|
|
|
this.containersRow[i][j].add(children);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-08 16:00:29 +02:00
|
|
|
public onResize(): void {
|
2020-07-28 11:06:08 +02:00
|
|
|
this.moveLayers();
|
|
|
|
|
|
|
|
this.Rectangle.x = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
|
|
|
this.Rectangle.y = this.cameras.main.worldView.y + this.cameras.main.height / 2;
|
|
|
|
|
|
|
|
this.textField.x = this.game.renderer.width/2;
|
|
|
|
|
|
|
|
this.logo.x = this.game.renderer.width - 30;
|
|
|
|
this.logo.y = this.game.renderer.height - 20;
|
|
|
|
|
|
|
|
this.arrowUp.x = this.game.renderer.width - 30;
|
|
|
|
this.arrowUp.y = 60;
|
|
|
|
|
|
|
|
this.arrowDown.x = this.game.renderer.width - 30;
|
|
|
|
this.arrowDown.y = 100;
|
|
|
|
|
|
|
|
this.arrowLeft.x = this.game.renderer.width/9;
|
|
|
|
this.arrowLeft.y = this.game.renderer.height/2;
|
|
|
|
|
|
|
|
this.arrowRight.x = this.game.renderer.width*0.9;
|
|
|
|
this.arrowRight.y = this.game.renderer.height/2;
|
|
|
|
}
|
2020-07-28 15:53:44 +02:00
|
|
|
}
|