From 40954bf4977f63ddd5fd3860ac3497a7869095a7 Mon Sep 17 00:00:00 2001 From: AlexandreS <32449369+AlexandreSi@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:26:01 +0200 Subject: [PATCH] Fix some crashes happening in preview (#6988) --- .../electron-advancedwindowtools.ts | 19 ++++---- .../lightruntimeobject-pixi-renderer.ts | 3 +- .../runtimegame-pixi-renderer.ts | 47 ++++++++++--------- GDJS/Runtime/runtimeobject.ts | 1 + 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/Extensions/AdvancedWindow/electron-advancedwindowtools.ts b/Extensions/AdvancedWindow/electron-advancedwindowtools.ts index 275b215dfc2c..a4d3f8c610d0 100644 --- a/Extensions/AdvancedWindow/electron-advancedwindowtools.ts +++ b/Extensions/AdvancedWindow/electron-advancedwindowtools.ts @@ -7,15 +7,18 @@ namespace gdjs { export namespace evtTools { export namespace advancedWindow { const getElectronBrowserWindow = (runtimeScene: gdjs.RuntimeScene) => { - const electronRemote = runtimeScene - .getGame() - .getRenderer() - .getElectronRemote(); - if (electronRemote) { - return electronRemote.getCurrentWindow(); + try { + const electronRemote = runtimeScene + .getGame() + .getRenderer() + .getElectronRemote(); + if (electronRemote) { + return electronRemote.getCurrentWindow(); + } + return null; + } catch (error) { + return null; } - - return null; }; export const focus = function ( diff --git a/Extensions/Lighting/lightruntimeobject-pixi-renderer.ts b/Extensions/Lighting/lightruntimeobject-pixi-renderer.ts index 283346f40c33..b5c022e8364f 100644 --- a/Extensions/Lighting/lightruntimeobject-pixi-renderer.ts +++ b/Extensions/Lighting/lightruntimeobject-pixi-renderer.ts @@ -505,8 +505,9 @@ namespace gdjs { closestVertices.sort( LightRuntimeObjectPixiRenderer._verticesWithAngleComparator ); - const filteredVerticesResult = [closestVertices[0].vertex]; const closestVerticesCount = closestVertices.length; + if (closestVerticesCount === 0) return []; + const filteredVerticesResult = [closestVertices[0].vertex]; for (let i = 1; i < closestVerticesCount; i++) { if (closestVertices[i].angle !== closestVertices[i - 1].angle) { filteredVerticesResult.push(closestVertices[i].vertex); diff --git a/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts b/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts index ad5cd6988fba..898ed46d60e5 100644 --- a/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts +++ b/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts @@ -358,17 +358,16 @@ namespace gdjs { setWindowSize(width: float, height: float): void { const remote = this.getElectronRemote(); if (remote) { - // Use Electron BrowserWindow API const browserWindow = remote.getCurrentWindow(); - if (browserWindow) { - try { + try { + if (browserWindow) { browserWindow.setContentSize(width, height); - } catch (error) { - logger.error( - `Window size setting to width ${width} and height ${height} failed. See error:`, - error - ); } + } catch (error) { + logger.error( + `Window size setting to width ${width} and height ${height} failed. See error:`, + error + ); } } else { logger.warn("Window size can't be changed on this platform."); @@ -381,16 +380,16 @@ namespace gdjs { centerWindow() { const remote = this.getElectronRemote(); if (remote) { - // Use Electron BrowserWindow API const browserWindow = remote.getCurrentWindow(); - if (browserWindow) { - try { + try { + if (browserWindow) { browserWindow.center(); - } catch (error) { - logger.error('Window centering failed. See error:', error); } + } catch (error) { + logger.error('Window centering failed. See error:', error); } } else { + logger.warn("Window can't be centered on this platform."); } } @@ -405,17 +404,16 @@ namespace gdjs { this._isFullscreen = !!enable; const remote = this.getElectronRemote(); if (remote) { - // Use Electron BrowserWindow API const browserWindow = remote.getCurrentWindow(); - if (browserWindow) { - try { + try { + if (browserWindow) { browserWindow.setFullScreen(this._isFullscreen); - } catch (error) { - logger.error( - `Full screen setting to ${this._isFullscreen} failed. See error:`, - error - ); } + } catch (error) { + logger.error( + `Full screen setting to ${this._isFullscreen} failed. See error:`, + error + ); } } else { // Use HTML5 Fullscreen API @@ -468,7 +466,12 @@ namespace gdjs { isFullScreen(): boolean { const remote = this.getElectronRemote(); if (remote) { - return remote.getCurrentWindow().isFullScreen(); + try { + return remote.getCurrentWindow().isFullScreen(); + } catch (error) { + logger.error(`Full screen detection failed. See error:`, error); + return false; + } } // Height check is used to detect user triggered full screen (for example F11 shortcut). diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 371cf8d08a17..9a4a0004ce0f 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -1768,6 +1768,7 @@ namespace gdjs { */ updateHitBoxes(): void { this.hitBoxes = this._defaultHitBoxes; + if (this.hitBoxes.length === 0) return; const width = this.getWidth(); const height = this.getHeight(); const centerX = this.getCenterX();