Merge pull request #700 from thecodingmachine/audioCameraPermission
Input need camera and microphone permission
This commit is contained in:
commit
4660b450c5
7
front/dist/resources/html/gameMenu.html
vendored
7
front/dist/resources/html/gameMenu.html
vendored
@ -1,11 +1,4 @@
|
|||||||
<style>
|
<style>
|
||||||
*{
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
cursor: url('/resources/logos/cursor_normal.png'), auto;
|
|
||||||
}
|
|
||||||
* a, button, select{
|
|
||||||
cursor: url('/resources/logos/cursor_pointer.png'), pointer;
|
|
||||||
}
|
|
||||||
#gameMenu button {
|
#gameMenu button {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
color: white;
|
color: white;
|
||||||
|
7
front/dist/resources/html/gameMenuIcon.html
vendored
7
front/dist/resources/html/gameMenuIcon.html
vendored
@ -1,11 +1,4 @@
|
|||||||
<style>
|
<style>
|
||||||
*{
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
cursor: url('/resources/logos/cursor_normal.png'), auto;
|
|
||||||
}
|
|
||||||
* a, button, select{
|
|
||||||
cursor: url('/resources/logos/cursor_pointer.png'), pointer;
|
|
||||||
}
|
|
||||||
#menuIcon button {
|
#menuIcon button {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
color: white;
|
color: white;
|
||||||
|
@ -1,11 +1,4 @@
|
|||||||
<style>
|
<style>
|
||||||
*{
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
cursor: url('/resources/logos/cursor_normal.png'), auto;
|
|
||||||
}
|
|
||||||
* a, button, select{
|
|
||||||
cursor: url('/resources/logos/cursor_pointer.png'), pointer;
|
|
||||||
}
|
|
||||||
#gameQuality {
|
#gameQuality {
|
||||||
background: #eceeee;
|
background: #eceeee;
|
||||||
border: 1px solid #42464b;
|
border: 1px solid #42464b;
|
||||||
|
7
front/dist/resources/html/gameReport.html
vendored
7
front/dist/resources/html/gameReport.html
vendored
@ -1,11 +1,4 @@
|
|||||||
<style>
|
<style>
|
||||||
*{
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
cursor: url('/resources/logos/cursor_normal.png'), auto;
|
|
||||||
}
|
|
||||||
* a, button, input{
|
|
||||||
cursor: url('/resources/logos/cursor_pointer.png'), pointer;
|
|
||||||
}
|
|
||||||
#gameReport {
|
#gameReport {
|
||||||
background: #eceeee;
|
background: #eceeee;
|
||||||
border: 1px solid #42464b;
|
border: 1px solid #42464b;
|
||||||
|
7
front/dist/resources/html/gameShare.html
vendored
7
front/dist/resources/html/gameShare.html
vendored
@ -1,11 +1,4 @@
|
|||||||
<style>
|
<style>
|
||||||
*{
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
cursor: url('/resources/logos/cursor_normal.png'), auto;
|
|
||||||
}
|
|
||||||
* a, button, input{
|
|
||||||
cursor: url('/resources/logos/cursor_pointer.png'), pointer;
|
|
||||||
}
|
|
||||||
#gameShare {
|
#gameShare {
|
||||||
background: #eceeee;
|
background: #eceeee;
|
||||||
border: 1px solid #42464b;
|
border: 1px solid #42464b;
|
||||||
|
103
front/dist/resources/html/helpCameraSettings.html
vendored
Normal file
103
front/dist/resources/html/helpCameraSettings.html
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<style>
|
||||||
|
#helpCameraSettings {
|
||||||
|
background: #eceeee;
|
||||||
|
border: 1px solid #42464b;
|
||||||
|
border-radius: 6px;
|
||||||
|
margin: 10px auto 0;
|
||||||
|
width: 400px;
|
||||||
|
height: 370px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings h1 {
|
||||||
|
background-image: linear-gradient(top, #f1f3f3, #d4dae0);
|
||||||
|
border-bottom: 1px solid #a6abaf;
|
||||||
|
border-radius: 6px 6px 0 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: #727678;
|
||||||
|
display: block;
|
||||||
|
height: 43px;
|
||||||
|
padding-top: 10px;
|
||||||
|
margin: 0;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: 0 -1px 0 rgba(0,0,0,0.2), 0 1px 0 #fff;
|
||||||
|
}
|
||||||
|
#helpCameraSettings input {
|
||||||
|
font-size: 70%;
|
||||||
|
background: linear-gradient(top, #d6d7d7, #dee0e0);
|
||||||
|
border: 1px solid #a1a3a3;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 1px #fff;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: #696969;
|
||||||
|
height: 30px;
|
||||||
|
transition: box-shadow 0.3s;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section.action{
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#helpCameraSettings button {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
border-radius: 7px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings button#helpCameraSettingsFormCancel {
|
||||||
|
background-color: #c7c7c700;
|
||||||
|
color: #292929;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section a{
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 0 6px;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section h6,
|
||||||
|
#helpCameraSettings section h5{
|
||||||
|
margin: 1px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section.text-center{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section p{
|
||||||
|
font-size: 8px;
|
||||||
|
margin: 0px 20px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section p.err{
|
||||||
|
color: #ff0000;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section ul{
|
||||||
|
margin: 6px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section li{
|
||||||
|
text-align: left;
|
||||||
|
font-size: 8px;
|
||||||
|
}
|
||||||
|
#helpCameraSettings section img {
|
||||||
|
width: 200px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<form id="helpCameraSettings" hidden>
|
||||||
|
<section class="text-center">
|
||||||
|
<h5>Camera/Microphone access needed</h5>
|
||||||
|
<p class="err" id="permissionError">Permission denied</p>
|
||||||
|
<p class="info">You must allow camera and microphone access in your browser.</p>
|
||||||
|
<ul>
|
||||||
|
<li>Please click on the lock or camera symbol on the side of the URL in the address bar. Here you can grant "always allow" access to your input devices.</li>
|
||||||
|
<li>Please ensure that you have a camera AND microphone plugged into your computer.</li>
|
||||||
|
</ul>
|
||||||
|
<p class="info">Once you've followed these steps, please refresh this page.</p>
|
||||||
|
<p>If you prefer to continue without allowing camera and microphone access, click on Continue</p>
|
||||||
|
<p id='browserHelpSetting'></p>
|
||||||
|
</section>
|
||||||
|
<section class="action">
|
||||||
|
<button type="submit" id="helpCameraSettingsFormRefresh">Refresh</button>
|
||||||
|
<button type="submit" id="helpCameraSettingsFormContinue">Continue</button>
|
||||||
|
</section>
|
||||||
|
</form>
|
BIN
front/dist/resources/objects/help-setting-camera-permission-chrome.png
vendored
Normal file
BIN
front/dist/resources/objects/help-setting-camera-permission-chrome.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 65 KiB |
BIN
front/dist/resources/objects/help-setting-camera-permission-firefox.png
vendored
Normal file
BIN
front/dist/resources/objects/help-setting-camera-permission-firefox.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
@ -2,6 +2,7 @@ import {GameScene} from "./GameScene";
|
|||||||
import {connectionManager} from "../../Connexion/ConnectionManager";
|
import {connectionManager} from "../../Connexion/ConnectionManager";
|
||||||
import {Room} from "../../Connexion/Room";
|
import {Room} from "../../Connexion/Room";
|
||||||
import {MenuScene, MenuSceneName} from "../Menu/MenuScene";
|
import {MenuScene, MenuSceneName} from "../Menu/MenuScene";
|
||||||
|
import {HelpCameraSettingsScene, HelpCameraSettingsSceneName} from "../Menu/HelpCameraSettingsScene";
|
||||||
import {LoginSceneName} from "../Login/LoginScene";
|
import {LoginSceneName} from "../Login/LoginScene";
|
||||||
import {SelectCharacterSceneName} from "../Login/SelectCharacterScene";
|
import {SelectCharacterSceneName} from "../Login/SelectCharacterScene";
|
||||||
import {EnableCameraSceneName} from "../Login/EnableCameraScene";
|
import {EnableCameraSceneName} from "../Login/EnableCameraScene";
|
||||||
@ -78,6 +79,7 @@ export class GameManager {
|
|||||||
console.log('starting '+ (this.currentGameSceneName || this.startRoom.id))
|
console.log('starting '+ (this.currentGameSceneName || this.startRoom.id))
|
||||||
scenePlugin.start(this.currentGameSceneName || this.startRoom.id);
|
scenePlugin.start(this.currentGameSceneName || this.startRoom.id);
|
||||||
scenePlugin.launch(MenuSceneName);
|
scenePlugin.launch(MenuSceneName);
|
||||||
|
scenePlugin.launch(HelpCameraSettingsSceneName);//700
|
||||||
}
|
}
|
||||||
|
|
||||||
public gameSceneIsCreated(scene: GameScene) {
|
public gameSceneIsCreated(scene: GameScene) {
|
||||||
|
@ -547,6 +547,7 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//todo: into dedicated classes
|
//todo: into dedicated classes
|
||||||
private initCirclesCanvas(): void {
|
private initCirclesCanvas(): void {
|
||||||
// Let's generate the circle for the group delimiter
|
// Let's generate the circle for the group delimiter
|
||||||
@ -994,13 +995,12 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's move all users
|
// Let's move all users
|
||||||
const updatedPlayersPositions = this.playersPositionInterpolator.getUpdatedPositions(time);
|
const updatedPlayersPositions = this.playersPositionInterpolator.getUpdatedPositions(time);
|
||||||
updatedPlayersPositions.forEach((moveEvent: HasMovedEvent, userId: number) => {
|
updatedPlayersPositions.forEach((moveEvent: HasMovedEvent, userId: number) => {
|
||||||
const player : RemotePlayer | undefined = this.MapPlayersByKey.get(userId);
|
const player: RemotePlayer | undefined = this.MapPlayersByKey.get(userId);
|
||||||
if (player === undefined) {
|
if (player === undefined) {
|
||||||
throw new Error('Cannot find player with ID "' + userId +'"');
|
throw new Error('Cannot find player with ID "' + userId + '"');
|
||||||
}
|
}
|
||||||
player.updatePosition(moveEvent);
|
player.updatePosition(moveEvent);
|
||||||
});
|
});
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import {gameManager} from "../Game/GameManager";
|
import {gameManager} from "../Game/GameManager";
|
||||||
import {TextField} from "../Components/TextField";
|
import {TextField} from "../Components/TextField";
|
||||||
import Image = Phaser.GameObjects.Image;
|
import Image = Phaser.GameObjects.Image;
|
||||||
import {GameSceneInitInterface} from "../Game/GameScene";
|
|
||||||
import {StartMapInterface} from "../../Connexion/ConnexionModels";
|
|
||||||
import {mediaManager} from "../../WebRtc/MediaManager";
|
import {mediaManager} from "../../WebRtc/MediaManager";
|
||||||
import {RESOLUTION} from "../../Enum/EnvironmentVariable";
|
import {RESOLUTION} from "../../Enum/EnvironmentVariable";
|
||||||
import {SoundMeter} from "../Components/SoundMeter";
|
import {SoundMeter} from "../Components/SoundMeter";
|
||||||
@ -18,6 +16,7 @@ enum LoginTextures {
|
|||||||
arrowUp = "arrow_up"
|
arrowUp = "arrow_up"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export class EnableCameraScene extends Phaser.Scene {
|
export class EnableCameraScene extends Phaser.Scene {
|
||||||
private textField!: TextField;
|
private textField!: TextField;
|
||||||
private pressReturnField!: TextField;
|
private pressReturnField!: TextField;
|
||||||
|
96
front/src/Phaser/Menu/HelpCameraSettingsScene.ts
Normal file
96
front/src/Phaser/Menu/HelpCameraSettingsScene.ts
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
import {mediaManager} from "../../WebRtc/MediaManager";
|
||||||
|
import {HtmlUtils} from "../../WebRtc/HtmlUtils";
|
||||||
|
|
||||||
|
export const HelpCameraSettingsSceneName = 'HelpCameraSettingsScene';
|
||||||
|
const helpCameraSettings = 'helpCameraSettings';
|
||||||
|
/**
|
||||||
|
* The scene that show how to permit Camera and Microphone access if there are not already allowed
|
||||||
|
*/
|
||||||
|
export class HelpCameraSettingsScene extends Phaser.Scene {
|
||||||
|
private helpCameraSettingsElement!: Phaser.GameObjects.DOMElement;
|
||||||
|
private helpCameraSettingsOpened: boolean = false;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super({key: HelpCameraSettingsSceneName});
|
||||||
|
}
|
||||||
|
|
||||||
|
preload() {
|
||||||
|
this.load.html(helpCameraSettings, 'resources/html/helpCameraSettings.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
create(){
|
||||||
|
this.createHelpCameraSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private createHelpCameraSettings() : void {
|
||||||
|
const middleX = (window.innerWidth / 3) - (370*0.85);
|
||||||
|
this.helpCameraSettingsElement = this.add.dom(middleX, -800, undefined, {overflow: 'scroll'}).createFromCache(helpCameraSettings);
|
||||||
|
this.revealMenusAfterInit(this.helpCameraSettingsElement, helpCameraSettings);
|
||||||
|
this.helpCameraSettingsElement.addListener('click');
|
||||||
|
this.helpCameraSettingsElement.on('click', (event:MouseEvent) => {
|
||||||
|
event.preventDefault();
|
||||||
|
if((event?.target as HTMLInputElement).id === 'helpCameraSettingsFormRefresh') {
|
||||||
|
window.location.reload();
|
||||||
|
}else if((event?.target as HTMLInputElement).id === 'helpCameraSettingsFormContinue') {
|
||||||
|
this.closeHelpCameraSettingsOpened();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(this.helpCameraSettingsElement.parent){
|
||||||
|
(this.helpCameraSettingsElement.parent as HTMLDivElement).style.overflow = 'scroll';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!mediaManager.constraintsMedia.audio || !mediaManager.constraintsMedia.video){
|
||||||
|
this.openHelpCameraSettingsOpened();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private openHelpCameraSettingsOpened(): void{
|
||||||
|
HtmlUtils.getElementByIdOrFail<HTMLDivElement>('webRtcSetup').style.display = 'none';
|
||||||
|
this.helpCameraSettingsOpened = true;
|
||||||
|
let middleY = (window.innerHeight / 3) - (495);
|
||||||
|
if(middleY < 0){
|
||||||
|
middleY = 0;
|
||||||
|
}
|
||||||
|
let middleX = (window.innerWidth / 3) - (370*0.85);
|
||||||
|
if(middleX < 0){
|
||||||
|
middleX = 0;
|
||||||
|
}
|
||||||
|
if(window.navigator.userAgent.includes('Firefox')){
|
||||||
|
HtmlUtils.getElementByIdOrFail<HTMLParagraphElement>('browserHelpSetting').innerHTML ='<img src="/resources/objects/help-setting-camera-permission-firefox.png"/>';
|
||||||
|
}else if(window.navigator.userAgent.includes('Chrome')){
|
||||||
|
HtmlUtils.getElementByIdOrFail<HTMLParagraphElement>('browserHelpSetting').innerHTML ='<img src="/resources/objects/help-setting-camera-permission-chrome.png"/>';
|
||||||
|
}
|
||||||
|
this.tweens.add({
|
||||||
|
targets: this.helpCameraSettingsElement,
|
||||||
|
y: middleY,
|
||||||
|
x: middleX,
|
||||||
|
duration: 1000,
|
||||||
|
ease: 'Power3',
|
||||||
|
overflow: 'scroll'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private closeHelpCameraSettingsOpened(): void{
|
||||||
|
const helpCameraSettingsInfo = this.helpCameraSettingsElement.getChildByID('helpCameraSettings') as HTMLParagraphElement;
|
||||||
|
helpCameraSettingsInfo.innerText = '';
|
||||||
|
helpCameraSettingsInfo.style.display = 'none';
|
||||||
|
this.helpCameraSettingsOpened = false;
|
||||||
|
this.tweens.add({
|
||||||
|
targets: this.helpCameraSettingsElement,
|
||||||
|
y: -400,
|
||||||
|
duration: 1000,
|
||||||
|
ease: 'Power3',
|
||||||
|
overflow: 'scroll'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private revealMenusAfterInit(menuElement: Phaser.GameObjects.DOMElement, rootDomId: string) {
|
||||||
|
//Dom elements will appear inside the viewer screen when creating before being moved out of it, which create a flicker effect.
|
||||||
|
//To prevent this, we put a 'hidden' attribute on the root element, we remove it only after the init is done.
|
||||||
|
setTimeout(() => {
|
||||||
|
(menuElement.getChildByID(rootDomId) as HTMLElement).hidden = false;
|
||||||
|
}, 250);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ import {ResizableScene} from "./Phaser/Login/ResizableScene";
|
|||||||
import {EntryScene} from "./Phaser/Login/EntryScene";
|
import {EntryScene} from "./Phaser/Login/EntryScene";
|
||||||
import {coWebsiteManager} from "./WebRtc/CoWebsiteManager";
|
import {coWebsiteManager} from "./WebRtc/CoWebsiteManager";
|
||||||
import {MenuScene} from "./Phaser/Menu/MenuScene";
|
import {MenuScene} from "./Phaser/Menu/MenuScene";
|
||||||
|
import {HelpCameraSettingsScene} from "./Phaser/Menu/HelpCameraSettingsScene";
|
||||||
import {localUserStore} from "./Connexion/LocalUserStore";
|
import {localUserStore} from "./Connexion/LocalUserStore";
|
||||||
import {ErrorScene} from "./Phaser/Reconnecting/ErrorScene";
|
import {ErrorScene} from "./Phaser/Reconnecting/ErrorScene";
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ const config: GameConfig = {
|
|||||||
width: width / RESOLUTION,
|
width: width / RESOLUTION,
|
||||||
height: height / RESOLUTION,
|
height: height / RESOLUTION,
|
||||||
parent: "game",
|
parent: "game",
|
||||||
scene: [EntryScene, LoginScene, SelectCharacterScene, EnableCameraScene, ReconnectingScene, ErrorScene, CustomizeScene, MenuScene],
|
scene: [EntryScene, LoginScene, SelectCharacterScene, EnableCameraScene, ReconnectingScene, ErrorScene, CustomizeScene, MenuScene, HelpCameraSettingsScene],
|
||||||
zoom: RESOLUTION,
|
zoom: RESOLUTION,
|
||||||
fps: fps,
|
fps: fps,
|
||||||
dom: {
|
dom: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user