avatar as a menu button
This commit is contained in:
parent
b8eeb3c8ab
commit
f4ce82481e
4 changed files with 68 additions and 15 deletions
|
@ -3,7 +3,9 @@
|
||||||
import logoTalk from "../images/logo-message-pixel.png"
|
import logoTalk from "../images/logo-message-pixel.png"
|
||||||
import {menuVisiblilityStore} from "../../Stores/MenuStore";
|
import {menuVisiblilityStore} from "../../Stores/MenuStore";
|
||||||
import {chatVisibilityStore} from "../../Stores/ChatStore";
|
import {chatVisibilityStore} from "../../Stores/ChatStore";
|
||||||
|
import {userWokaPictureStore} from "../../Stores/UserWokaPictureStore";
|
||||||
import {get} from "svelte/store";
|
import {get} from "svelte/store";
|
||||||
|
import {onDestroy} from "svelte";
|
||||||
|
|
||||||
function showMenu(){
|
function showMenu(){
|
||||||
menuVisiblilityStore.set(!get(menuVisiblilityStore))
|
menuVisiblilityStore.set(!get(menuVisiblilityStore))
|
||||||
|
@ -11,12 +13,22 @@
|
||||||
function showChat(){
|
function showChat(){
|
||||||
chatVisibilityStore.set(true);
|
chatVisibilityStore.set(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let heroWokaPictureSrc = logoWA;
|
||||||
|
|
||||||
|
const unsubscribeFromUserWokaPictureStore = userWokaPictureStore.subscribe(playersAvatars => {
|
||||||
|
heroWokaPictureSrc = playersAvatars.get(-1) ?? logoWA;
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(unsubscribeFromUserWokaPictureStore);
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window/>
|
<svelte:window/>
|
||||||
|
|
||||||
<main class="menuIcon">
|
<main class="menuIcon">
|
||||||
<img src={logoWA} alt="open menu" class="nes-pointer" on:click|preventDefault={showMenu}>
|
<img src={heroWokaPictureSrc} alt="open menu" class="nes-pointer" on:click|preventDefault={showMenu}>
|
||||||
<img src={logoTalk} alt="open menu" class="nes-pointer" on:click|preventDefault={showChat}>
|
<img src={logoTalk} alt="open menu" class="nes-pointer" on:click|preventDefault={showChat}>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|
|
@ -118,15 +118,21 @@ export abstract class Character extends Container {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public saveCharacterToTexture(saveAs: string): void {
|
public async getSnapshot(): Promise<HTMLImageElement> {
|
||||||
const bounds = this.getBounds();
|
const bounds = this.getBounds();
|
||||||
const rt = this.scene.make.renderTexture({ x: 300, y: 300, width: bounds.width, height: bounds.height}, true);
|
const rt = this.scene.make.renderTexture({}, false);
|
||||||
for (const sprite of this.sprites.values()) {
|
for (const sprite of this.sprites.values()) {
|
||||||
rt.draw(sprite, sprite.displayWidth * 0.5, sprite.displayHeight * 0.5);
|
rt.draw(sprite, sprite.displayWidth * 0.5, sprite.displayHeight * 0.5);
|
||||||
}
|
}
|
||||||
// P.H. NOTE: Change of avatar will update saved texture. We can then send it again to the backend
|
// TODO: Any way for this to fail? What fallback?
|
||||||
rt.saveTexture(saveAs);
|
return new Promise<HTMLImageElement>((resolve) => {
|
||||||
rt.destroy();
|
rt.snapshot((url) => {
|
||||||
|
resolve(url as HTMLImageElement); // P.H. NOTE: Exclude Color type
|
||||||
|
// rt.destroy();
|
||||||
|
},
|
||||||
|
'image/png',
|
||||||
|
1);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public addCompanion(name: string, texturePromise?: Promise<string>): void {
|
public addCompanion(name: string, texturePromise?: Promise<string>): void {
|
||||||
|
|
|
@ -67,11 +67,13 @@ import EVENT_TYPE = Phaser.Scenes.Events;
|
||||||
import AnimatedTiles from "phaser-animated-tiles";
|
import AnimatedTiles from "phaser-animated-tiles";
|
||||||
import { StartPositionCalculator } from "./StartPositionCalculator";
|
import { StartPositionCalculator } from "./StartPositionCalculator";
|
||||||
import { soundManager } from "./SoundManager";
|
import { soundManager } from "./SoundManager";
|
||||||
|
|
||||||
import { peerStore, screenSharingPeerStore } from "../../Stores/PeerStore";
|
import { peerStore, screenSharingPeerStore } from "../../Stores/PeerStore";
|
||||||
import { videoFocusStore } from "../../Stores/VideoFocusStore";
|
import { videoFocusStore } from "../../Stores/VideoFocusStore";
|
||||||
import { biggestAvailableAreaStore } from "../../Stores/BiggestAvailableAreaStore";
|
import { biggestAvailableAreaStore } from "../../Stores/BiggestAvailableAreaStore";
|
||||||
import { SharedVariablesManager } from "./SharedVariablesManager";
|
import { SharedVariablesManager } from "./SharedVariablesManager";
|
||||||
import { playersStore } from "../../Stores/PlayersStore";
|
import { playersStore } from "../../Stores/PlayersStore";
|
||||||
|
import { userWokaPictureStore } from "../../Stores/UserWokaPictureStore";
|
||||||
import { chatVisibilityStore } from "../../Stores/ChatStore";
|
import { chatVisibilityStore } from "../../Stores/ChatStore";
|
||||||
import { emoteStore, emoteMenuStore } from "../../Stores/EmoteStore";
|
import { emoteStore, emoteMenuStore } from "../../Stores/EmoteStore";
|
||||||
import {
|
import {
|
||||||
|
@ -79,6 +81,7 @@ import {
|
||||||
audioManagerVisibilityStore,
|
audioManagerVisibilityStore,
|
||||||
audioManagerVolumeStore,
|
audioManagerVolumeStore,
|
||||||
} from "../../Stores/AudioManagerStore";
|
} from "../../Stores/AudioManagerStore";
|
||||||
|
|
||||||
import { PropertyUtils } from "../Map/PropertyUtils";
|
import { PropertyUtils } from "../Map/PropertyUtils";
|
||||||
import Tileset = Phaser.Tilemaps.Tileset;
|
import Tileset = Phaser.Tilemaps.Tileset;
|
||||||
import { userIsAdminStore } from "../../Stores/GameStore";
|
import { userIsAdminStore } from "../../Stores/GameStore";
|
||||||
|
@ -665,6 +668,7 @@ export class GameScene extends DirtyScene {
|
||||||
this.connection = onConnect.connection;
|
this.connection = onConnect.connection;
|
||||||
|
|
||||||
playersStore.connectToRoomConnection(this.connection);
|
playersStore.connectToRoomConnection(this.connection);
|
||||||
|
userWokaPictureStore.connectToRoomConnection(this.connection);
|
||||||
|
|
||||||
userIsAdminStore.set(this.connection.hasTag("admin"));
|
userIsAdminStore.set(this.connection.hasTag("admin"));
|
||||||
|
|
||||||
|
@ -1499,7 +1503,8 @@ ${escapedMessage}
|
||||||
this.companion !== null ? lazyLoadCompanionResource(this.load, this.companion) : undefined
|
this.companion !== null ? lazyLoadCompanionResource(this.load, this.companion) : undefined
|
||||||
);
|
);
|
||||||
this.CurrentPlayer.once('textures-loaded', () => {
|
this.CurrentPlayer.once('textures-loaded', () => {
|
||||||
this.savePlayerAvatarPicture(this.CurrentPlayer, 'hero-avatar');
|
// TODO: How to be sure we always get hero id?
|
||||||
|
this.savePlayerWokaPicture(this.CurrentPlayer, -1);
|
||||||
});
|
});
|
||||||
this.CurrentPlayer.on("pointerdown", (pointer: Phaser.Input.Pointer) => {
|
this.CurrentPlayer.on("pointerdown", (pointer: Phaser.Input.Pointer) => {
|
||||||
if (pointer.wasTouch && (pointer.event as TouchEvent).touches.length > 1) {
|
if (pointer.wasTouch && (pointer.event as TouchEvent).touches.length > 1) {
|
||||||
|
@ -1528,10 +1533,9 @@ ${escapedMessage}
|
||||||
this.createCollisionWithPlayer();
|
this.createCollisionWithPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private savePlayerAvatarPicture(character: Character, key: string): void {
|
private async savePlayerWokaPicture(character: Character, userId: number): Promise<void> {
|
||||||
character.saveCharacterToTexture(key);
|
const htmlImageElement = await character.getSnapshot();
|
||||||
console.log(key);
|
userWokaPictureStore.setWokaPicture(userId, htmlImageElement.src);
|
||||||
this.add.image(200, 200, key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pushPlayerPosition(event: HasPlayerMovedEvent) {
|
pushPlayerPosition(event: HasPlayerMovedEvent) {
|
||||||
|
@ -1635,11 +1639,9 @@ ${escapedMessage}
|
||||||
break;
|
break;
|
||||||
case "AddPlayerEvent":
|
case "AddPlayerEvent":
|
||||||
this.doAddPlayer(event.event);
|
this.doAddPlayer(event.event);
|
||||||
console.log('ADD PLAYER');
|
|
||||||
break;
|
break;
|
||||||
case "RemovePlayerEvent":
|
case "RemovePlayerEvent":
|
||||||
this.doRemovePlayer(event.userId);
|
this.doRemovePlayer(event.userId);
|
||||||
console.log('REMOVE PLAYER');
|
|
||||||
break;
|
break;
|
||||||
case "UserMovedEvent":
|
case "UserMovedEvent":
|
||||||
this.doUpdatePlayerPosition(event.event);
|
this.doUpdatePlayerPosition(event.event);
|
||||||
|
@ -1679,7 +1681,6 @@ ${escapedMessage}
|
||||||
*/
|
*/
|
||||||
private doInitUsersPosition(usersPosition: MessageUserPositionInterface[]): void {
|
private doInitUsersPosition(usersPosition: MessageUserPositionInterface[]): void {
|
||||||
const currentPlayerId = this.connection?.getUserId();
|
const currentPlayerId = this.connection?.getUserId();
|
||||||
console.log(currentPlayerId);
|
|
||||||
this.removeAllRemotePlayers();
|
this.removeAllRemotePlayers();
|
||||||
// load map
|
// load map
|
||||||
usersPosition.forEach((userPosition: MessageUserPositionInterface) => {
|
usersPosition.forEach((userPosition: MessageUserPositionInterface) => {
|
||||||
|
@ -1725,7 +1726,7 @@ ${escapedMessage}
|
||||||
addPlayerData.companion !== null ? lazyLoadCompanionResource(this.load, addPlayerData.companion) : undefined
|
addPlayerData.companion !== null ? lazyLoadCompanionResource(this.load, addPlayerData.companion) : undefined
|
||||||
);
|
);
|
||||||
player.once('textures-loaded', () => {
|
player.once('textures-loaded', () => {
|
||||||
this.savePlayerAvatarPicture(player, `${addPlayerData.userId}-player-avatar`);
|
this.savePlayerWokaPicture(player, addPlayerData.userId);
|
||||||
});
|
});
|
||||||
this.MapPlayers.add(player);
|
this.MapPlayers.add(player);
|
||||||
this.MapPlayersByKey.set(player.userId, player);
|
this.MapPlayersByKey.set(player.userId, player);
|
||||||
|
|
34
front/src/Stores/UserWokaPictureStore.ts
Normal file
34
front/src/Stores/UserWokaPictureStore.ts
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import { writable } from "svelte/store";
|
||||||
|
import type { RoomConnection } from "../Connexion/RoomConnection";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A store that contains the players avatars pictures
|
||||||
|
*/
|
||||||
|
function createUserWokaPictureStore() {
|
||||||
|
let players = new Map<number, string>();
|
||||||
|
|
||||||
|
const { subscribe, update } = writable(players);
|
||||||
|
|
||||||
|
return {
|
||||||
|
subscribe,
|
||||||
|
connectToRoomConnection: (roomConnection: RoomConnection) => {
|
||||||
|
roomConnection.onUserLeft((userId) => {
|
||||||
|
update((users) => {
|
||||||
|
users.delete(userId);
|
||||||
|
return users;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setWokaPicture(userId: number, url: string) {
|
||||||
|
update((users) => {
|
||||||
|
users.set(userId, url);
|
||||||
|
return users;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getWokaPictureById(userId: number): string | undefined {
|
||||||
|
return players.get(userId);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const userWokaPictureStore = createUserWokaPictureStore();
|
Loading…
Add table
Add a link
Reference in a new issue