From 62fd8f432d0daff29fd21dafef150bb85940edf8 Mon Sep 17 00:00:00 2001 From: Zyie <24736175+Zyie@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:34:04 +0000 Subject: [PATCH] update to remove game references --- .gitignore | 6 +- README.md | 11 +- .../guide/{games => creations}/_category_.yml | 2 +- .../guide/{games => creations}/engine.mdx | 44 ++--- docs/docs/guide/creations/intro.md | 52 +++++ docs/docs/guide/games/intro.md | 46 ----- docs/docs/guide/installation.mdx | 54 ++++-- docs/src/pages/index.tsx | 11 ++ docs/static/img/demo.gif | Bin 0 -> 68266 bytes docs/static/img/devtool-screenshot.png | Bin 87907 -> 0 bytes package-lock.json | 10 +- src/index.ts | 30 +-- .../public/index.html | 2 +- .../template-bundler-esbuild/src/main.ts | 2 +- .../template-bundler-import-map/index.html | 2 +- .../template-bundler-import-map/src/main.mjs | 2 +- templates/template-bundler-vite/index.html | 2 +- templates/template-bundler-vite/src/main.ts | 2 +- templates/template-bundler-webpack/index.ejs | 2 +- .../template-bundler-webpack/src/main.ts | 2 +- .../_gitignore | 0 .../eslint__config.mjs | 0 .../index.html | 2 +- .../package.json | 2 +- .../public/favicon.png | Bin .../public/style.css | 0 .../raw-assets/main{m}}/logo-white.svg | 0 .../raw-assets/main{m}/sounds/bgm-main.mp3} | Bin .../raw-assets/main{m}}/sounds/sfx-hover.wav | Bin .../raw-assets/main{m}}/sounds/sfx-press.wav | Bin .../main{m}}/ui{tps}/button-large-press.png | Bin .../main{m}}/ui{tps}/button-large.png | Bin .../main{m}}/ui{tps}/icon-pause.png | Bin .../main{m}}/ui{tps}/icon-settings.png | Bin .../main{m}}/ui{tps}/rounded-rectangle.png | Bin .../raw-assets/preload{m}/logo.svg | 0 .../scripts/assetpack-vite-plugin.ts | 0 .../src/app/getEngine.ts | 15 ++ .../src/app}/popups/PausePopup.ts | 14 +- .../src/app}/popups/SettingsPopup.ts | 18 +- .../src/app}/screens/LoadScreen.ts | 0 .../src/app/screens/main}/Bouncer.ts | 10 +- .../src/app/screens/main}/Logo.ts | 0 .../src/app/screens/main/MainScreen.ts} | 29 +-- .../src/app}/ui/Label.ts | 0 .../src/app}/ui/LargeButton.ts | 4 +- .../src/app}/ui/RoundedBox.ts | 0 .../src/app}/ui/VolumeSlider.ts | 0 .../src/app}/utils/userSettings.ts | 14 +- .../src/engine/audio/AudioPlugin.ts | 49 +++++ .../src/engine/audio}/audio.ts | 0 .../src/engine/engine.ts | 74 +++++++ .../src/engine/navigation/NavigationPlugin.ts | 41 ++++ .../src/engine/navigation}/navigation.ts | 6 +- .../src/engine/resize/ResizePlugin.ts | 168 ++++++++++++++++ .../src/engine/resize/resize.ts | 37 ++++ .../src/engine/utils/maths.ts | 0 .../src/engine/utils/random.ts | 0 .../src/engine/utils/storage.ts | 0 .../src/engine/utils/waitFor.ts | 0 templates/template-creation-web/src/main.ts | 31 +++ .../src/pixi-mixins.d.ts | 24 +++ .../src/vite-env.d.ts} | 1 + .../tsconfig.json | 0 .../vite.config.ts | 0 .../template-game-web/src/engine/engine.ts | 181 ------------------ .../template-game-web/src/game/getEngine.ts | 11 -- templates/template-game-web/src/main.ts | 31 --- templates/template-game-web/src/vite-env.d.ts | 1 - 69 files changed, 648 insertions(+), 397 deletions(-) rename docs/docs/guide/{games => creations}/_category_.yml (52%) rename docs/docs/guide/{games => creations}/engine.mdx (64%) create mode 100644 docs/docs/guide/creations/intro.md delete mode 100644 docs/docs/guide/games/intro.md create mode 100644 docs/static/img/demo.gif delete mode 100644 docs/static/img/devtool-screenshot.png rename templates/{template-game-web => template-creation-web}/_gitignore (100%) rename templates/{template-game-web => template-creation-web}/eslint__config.mjs (100%) rename templates/{template-game-web => template-creation-web}/index.html (91%) rename templates/{template-game-web => template-creation-web}/package.json (93%) rename templates/{template-game-web => template-creation-web}/public/favicon.png (100%) rename templates/{template-game-web => template-creation-web}/public/style.css (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/logo-white.svg (100%) rename templates/{template-game-web/raw-assets/game{m}/sounds/bgm-game.mp3 => template-creation-web/raw-assets/main{m}/sounds/bgm-main.mp3} (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/sounds/sfx-hover.wav (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/sounds/sfx-press.wav (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/ui{tps}/button-large-press.png (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/ui{tps}/button-large.png (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/ui{tps}/icon-pause.png (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/ui{tps}/icon-settings.png (100%) rename templates/{template-game-web/raw-assets/game{m} => template-creation-web/raw-assets/main{m}}/ui{tps}/rounded-rectangle.png (100%) rename templates/{template-game-web => template-creation-web}/raw-assets/preload{m}/logo.svg (100%) rename templates/{template-game-web => template-creation-web}/scripts/assetpack-vite-plugin.ts (100%) create mode 100644 templates/template-creation-web/src/app/getEngine.ts rename templates/{template-game-web/src/game => template-creation-web/src/app}/popups/PausePopup.ts (86%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/popups/SettingsPopup.ts (91%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/screens/LoadScreen.ts (100%) rename templates/{template-game-web/src/game/screens/game => template-creation-web/src/app/screens/main}/Bouncer.ts (92%) rename templates/{template-game-web/src/game/screens/game => template-creation-web/src/app/screens/main}/Logo.ts (100%) rename templates/{template-game-web/src/game/screens/game/GameScreen.ts => template-creation-web/src/app/screens/main/MainScreen.ts} (85%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/ui/Label.ts (100%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/ui/LargeButton.ts (94%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/ui/RoundedBox.ts (100%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/ui/VolumeSlider.ts (100%) rename templates/{template-game-web/src/game => template-creation-web/src/app}/utils/userSettings.ts (77%) create mode 100644 templates/template-creation-web/src/engine/audio/AudioPlugin.ts rename templates/{template-game-web/src/engine => template-creation-web/src/engine/audio}/audio.ts (100%) create mode 100644 templates/template-creation-web/src/engine/engine.ts create mode 100644 templates/template-creation-web/src/engine/navigation/NavigationPlugin.ts rename templates/{template-game-web/src/engine => template-creation-web/src/engine/navigation}/navigation.ts (97%) create mode 100644 templates/template-creation-web/src/engine/resize/ResizePlugin.ts create mode 100644 templates/template-creation-web/src/engine/resize/resize.ts rename templates/{template-game-web => template-creation-web}/src/engine/utils/maths.ts (100%) rename templates/{template-game-web => template-creation-web}/src/engine/utils/random.ts (100%) rename templates/{template-game-web => template-creation-web}/src/engine/utils/storage.ts (100%) rename templates/{template-game-web => template-creation-web}/src/engine/utils/waitFor.ts (100%) create mode 100644 templates/template-creation-web/src/main.ts create mode 100644 templates/template-creation-web/src/pixi-mixins.d.ts rename templates/{template-game-web/src/typings.d.ts => template-creation-web/src/vite-env.d.ts} (66%) rename templates/{template-game-web => template-creation-web}/tsconfig.json (100%) rename templates/{template-game-web => template-creation-web}/vite.config.ts (100%) delete mode 100644 templates/template-game-web/src/engine/engine.ts delete mode 100644 templates/template-game-web/src/game/getEngine.ts delete mode 100644 templates/template-game-web/src/main.ts delete mode 100644 templates/template-game-web/src/vite-env.d.ts diff --git a/.gitignore b/.gitignore index eff6610..7f71e8f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,6 @@ dist docs/build -templates/template-game-web/public/assets -templates/template-game-web/.assetpack -templates/template-game-web/manifest.json +templates/template-creation-web/public/assets +templates/template-creation-web/.assetpack +templates/template-creation-web/src/manifest.json diff --git a/README.md b/README.md index d672a08..678dcff 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ $ bun create pixi.js Then follow the prompts! +### Advanced Usage + You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a PixiJS + Vite project, run: ```bash @@ -60,14 +62,7 @@ Currently supported template presets include: - `bundler-webpack` - `bundler-esbuild` - `bundler-import-map` - -We also have some additional templates that you can use for creating games for specific platforms: -- `game-web` - -**Coming soon:** -- `game-discord` -- `game-facebook` -- `game-youtube` +- `creation-web` You can use `.` for the project name to scaffold in the current directory. diff --git a/docs/docs/guide/games/_category_.yml b/docs/docs/guide/creations/_category_.yml similarity index 52% rename from docs/docs/guide/games/_category_.yml rename to docs/docs/guide/creations/_category_.yml index 1bc97c3..dc6e5ed 100644 --- a/docs/docs/guide/games/_category_.yml +++ b/docs/docs/guide/creations/_category_.yml @@ -1,3 +1,3 @@ -label: Games +label: Creation Templates position: 1 collapsed: false diff --git a/docs/docs/guide/games/engine.mdx b/docs/docs/guide/creations/engine.mdx similarity index 64% rename from docs/docs/guide/games/engine.mdx rename to docs/docs/guide/creations/engine.mdx index dfcde94..cd3e469 100644 --- a/docs/docs/guide/games/engine.mdx +++ b/docs/docs/guide/creations/engine.mdx @@ -3,14 +3,14 @@ sidebar_position: 1 title: Engine --- -## Initializing the Game Engine +## Initializing the Creation Engine -To initialize the game engine, you need to create an instance of the GameEngine class and call its init method. This method sets up the PixiJS application, initializes the screen manager, and loads the necessary assets. +To initialize the engine, you need to create an instance of the CreationEngine class and call its init method. This method sets up the PixiJS application, initializes the screen manager, and loads the necessary assets. ```ts -import { GameEngine } from './engine/engine'; +import { CreationEngine } from './engine/engine'; -const engine = new GameEngine(); +const engine = new CreationEngine(); (async () => { await engine.init({ @@ -22,7 +22,7 @@ const engine = new GameEngine(); ## Handling Resizing -The game engine automatically handles resizing of the application. The resize behavior can be customized by passing options to the init method. +The engine automatically handles resizing of the application. The resize behavior can be customized by passing options to the init method. ```ts await engine.init({ @@ -36,13 +36,13 @@ await engine.init({ ## Navigation & Screens -The game engine provides a screen manager that allows you to manage different screens in your game. Each screen is a PixiJS Container that implements the Screen interface. +The engine provides a screen manager that allows you to manage different screens in your application. Each screen is a PixiJS Container that implements the Screen interface. ```ts import { Container } from 'pixi.js'; import { Screen } from './engine/navigation'; -export class GameScreen extends Container implements Screen { +export class MyScreen extends Container implements Screen { /** Show the screen */ show?(): Promise; /** Hide the screen */ @@ -66,14 +66,14 @@ export class GameScreen extends Container implements Screen { } ``` -To show different screens in your game, you can use the `showScreen` method of the Navigation class. This method hides the current screen and presents a new screen. +To show different screens in your app, you can use the `showScreen` method of the Navigation class. This method hides the current screen and presents a new screen. ```ts -import { GameScreen } from './game/screens/game/GameScreen'; -import { LoadScreen } from './game/screens/LoadScreen'; +import { MainScreen } from './app/screens/main/MainScreen'; +import { LoadScreen } from './app/screens/LoadScreen'; await engine.navigation.showScreen(LoadScreen); -await engine.navigation.showScreen(GameScreen); +await engine.navigation.showScreen(MainScreen); ``` ### Popup Screens @@ -81,7 +81,7 @@ await engine.navigation.showScreen(GameScreen); You can also show popup screens on top of the current screen. Popup screens are displayed in a separate layer above the main screen. ```ts -import { PauseScreen } from './game/screens/PauseScreen'; +import { PauseScreen } from './app/screens/PauseScreen'; await engine.navigation.presentPopup(PauseScreen); ``` @@ -94,29 +94,29 @@ await engine.navigation.dismissPopup(); ### Asset Loading -Using AssetPack you can define bundles of assets for your game. These bundles can be loaded individually to avoid loading all assets at once. -Typically you would define a bundle for each screen in your game, and load them as needed. +Using AssetPack you can define bundles of assets for your application. These bundles can be loaded individually to avoid loading all assets at once. +Typically you would define a bundle for each screen in your application, and load them as needed. To help with this a screen can implements a `static assetBundles: string[]` property that defines the bundles required for that screen. The engine will automatically load these bundles when the screen is shown. ```ts -export class GameScreen extends Container { +export class MainScreen extends Container { /** Assets bundles required by this screen */ - public static assetBundles = ["game"]; + public static assetBundles = ["main"]; } ``` ## Audio -The game engine includes built-in support for managing background music (bgm) and sound effects (sfx). You can control audio playback using the `bgm` and `sfx` properties of the `GameEngine`. +The engine includes built-in support for managing background music (bgm) and sound effects (sfx). You can control audio playback using the `audio` property on the `CreationEngine`. ```ts // Play background music -engine.bgm.play('background-music.mp3', { volume: 0.5 }); +engine.audio.bgm.play('background-music.mp3', { volume: 0.5 }); // Play sound effect -engine.sfx.play('explosion.mp3', { volume: 0.8 }); +engine.audio.sfx.play('explosion.mp3', { volume: 0.8 }); ``` ### Background Music (bgm) @@ -129,13 +129,13 @@ Handles short sound special effects, mainly for having its own volume settings. While you can control the volume of each audio type, you can also control the global volume of all audio the exposed global volume functions ```ts -engine.setMasterVolume(0.5); -const volume = engine.getMasterVolume(); +engine.audio.setMasterVolume(0.5); +const volume = engine.audio.getMasterVolume(); ``` ## Utility Functions -The game engine provides several utility functions for common tasks, such as calculating distances, interpolating values, and generating random numbers. +The engine provides several utility functions for common tasks, such as calculating distances, interpolating values, and generating random numbers. This is not an exhaustive list, but here are some examples: diff --git a/docs/docs/guide/creations/intro.md b/docs/docs/guide/creations/intro.md new file mode 100644 index 0000000..72f4334 --- /dev/null +++ b/docs/docs/guide/creations/intro.md @@ -0,0 +1,52 @@ +--- +sidebar_position: 0 +title: Getting Started +--- + +We have put together a simple "creation template" that takes advantage of the PixiJS ecosystem to help you get started with building web-based applications. + +This template provides a solid foundation for a variety of applications, including game development. It includes essential features such as screen management, audio, and resize handling. It is designed to streamline your development process and make it easier for you to create engaging web based content. While it is not a full-fledged "game engine", we hope that it will help you get started quickly and build amazing content. + +## Overview + +The creation template is built on top of PixiJS, as well as other libraries in the PixiJS ecosystem. Lets take a quick look at the technologies used in the template: + +- **[PixiJS](https://github.com/pixijs/pixijs)**: A powerful 2D rendering engine that provides a fast and flexible rendering pipeline for creating games and interactive applications. +- **[AssetPack](https://github.com/pixijs/assetpack)**: A library for managing assets in PixiJS applications. It simplifies the creation of assets such as images, sounds, and spritesheets. +- **[PixiJS UI](https://github.com/pixijs/ui)**: A library that contains commonly used UI components, that are extensible to allow them to be used in any project +- **[PixiJS Sound](https://github.com/pixijs/sound)**: A WebAudio API playback library, with filters. Modern audio playback for modern browsers. +- **[Vite](https://vitejs.dev/)**: A fast and lightweight build tool that provides instant server start-up. It is used to build and run the project. + +We highly recommend that you familiarize yourself with these libraries to get the most out of the creation template + +### Additional Libraries + +- **[Spine](https://github.com/EsotericSoftware/spine-runtimes)**: A 2D skeletal animation tool that allows you to create animations for games and other interactive applications. The game template includes support for Spine animations. +- **[motion](https://motion.dev/)**: A simple and powerful tweening library. It allows you to create smooth animations and transitions with minimal code. + +## Creation Engine + +Included in the template is a simple "creation engine" that provides a set of features to help you build your application. The engine provides features that new users typically struggle with such as screen management, asset loading, audio playback. + +You can find more information about the engine in the [Engine Guide](/docs/guide/creations/engine). + + +## Template Types + +We are slowly building up templates to help you build a game for different platforms. Currently, we have the following templates: + +- **Web**: A general template for building web-based applications. + +**Coming Soon**: +- **[Discord](https://github.com/discord/embedded-app-sdk)**: A multiplayer template for building applications that can be run on the Discord platform. +- **[Facebook](https://www.facebook.com/fbgaminghome/developers)**: A template for building applications that can be run on the Facebook instant games platform. +- **[YouTube](https://developers.google.com/youtube/gaming/playables/reference/sdk)**: A template for building applications that can be run on the YouTube Playables platform. + + +You can find the specific documentation for each template in the sidebar. + +## More Examples? + +If you are looking for more examples, you can check out the [Open Games](https://github.com/pixijs/open-games) repo. It contains a collection of open-source games built with PixiJS that you can use as a reference for your own projects. + +These examples use the same tech stack as the game template, however, these where built before this tool was created, so there are some differences to be aware of. diff --git a/docs/docs/guide/games/intro.md b/docs/docs/guide/games/intro.md deleted file mode 100644 index e758084..0000000 --- a/docs/docs/guide/games/intro.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -sidebar_position: 0 -title: Introduction ---- - -Welcome to the Game Template documentation! - -We have put together a simple game template that takes advantage of the PixiJS ecosystem to help you get started with building web-based games. - -This template provides a solid foundation for game development and includes essential features such as screens, audio, and resize handling. It is designed to streamline your game development process and make it easier for you to create engaging games. While it is not a full-fledged game engine, we hope that it will help you get started quickly and build amazing games. - -## Overview - -The game template is built on top of PixiJS, as well as other libraries in the PixiJS ecosystem. Lets take a quick look at the technologies used in the template: - -- **[PixiJS](https://github.com/pixijs/pixijs)**: A powerful 2D rendering engine that provides a fast and flexible rendering pipeline for creating games and interactive applications. -- **[AssetPack](https://github.com/pixijs/assetpack)**: A library for managing assets in PixiJS applications. It simplifies the creation of assets such as images, sounds, and spritesheets. -- **[PixiJS UI](https://github.com/pixijs/ui)**: A library that contains commonly used UI components, that are extensible to allow them to be used in any project -- **[PixiJS Sound](https://github.com/pixijs/sound)**: A WebAudio API playback library, with filters. Modern audio playback for modern browsers. -- **[Game Engine](/docs/guide/games/engine)**: A simple game engine that provides features such as screen management, asset loading, audio playback, and utility functions. - -We highly recommend that you familiarize yourself with these libraries to get the most out of the game template - -### Additional Libraries - -- **[Spine](https://github.com/EsotericSoftware/spine-runtimes)**: A 2D skeletal animation tool that allows you to create animations for games and other interactive applications. The game template includes support for Spine animations. -- **[motion](https://motion.dev/)**: A simple and powerful tweening library. It allows you to create smooth animations and transitions with minimal code. - -## Template Types - -We are slowly building up templates to help you build a game for different platforms. Currently, we have the following templates: - -- **Web**: A general template for building web-based games. - -**Coming Soon**: -- **Discord**: A template for building games that can be run on the Discord platform. -- **Facebook**: A template for building games that can be run on the Facebook platform. -- **YouTube**: A template for building games that can be run on the YouTube platform. - -You can find the specific documentation for each template in the sidebar. - -## More Examples? - -If you are looking for more examples, you can check out the [Open Games](https://github.com/pixijs/open-games) repo. It contains a collection of open-source games built with PixiJS that you can use as a reference for your own projects. - -These examples use the same tech stack as the game template, however, these where built before this tool was created, so there are some differences to be aware of. diff --git a/docs/docs/guide/installation.mdx b/docs/docs/guide/installation.mdx index 0c9bcf4..03b0b6f 100644 --- a/docs/docs/guide/installation.mdx +++ b/docs/docs/guide/installation.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 0 -title: Installation +title: Getting Started --- :::info **Compatibility Note** @@ -33,6 +33,39 @@ bun create pixi.js Then follow the prompts! +## Bundler Templates + +Bundler templates are general templates that you can use to scaffold a PixiJS project with a specific bundler. +They include the necessary configurations and dependencies to get you started however they are not particularly opinionated about the project structure. + +Currently supported template presets include: + +- **[Vite](https://vite.dev)** + PixiJS (Recommended) +- **[Webpack](https://webpack.js.org/)** + PixiJS +- **[esbuild](https://esbuild.github.io/)** + PixiJS +- PixiJS imported via **[import maps](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap)** + +## Creation Templates (Recommended) + +We have created some additional templates that you can use for creating projects for specific platforms. +These templates include additional configurations and dependencies to help you get started with your app development. +As such they are more opinionated than the general bundler templates. + +The goal of these templates is to provide a more tailored experience for developers who are less experienced with setting up a PixiJS project from scratch. + +Find out more about these templates in the [Creation Template](/docs/guide/creations/intro) section. + +Currently supported creation templates include: +- Web: A general template for building web-based applications. + +**Coming soon:** +- **[Discord](https://github.com/discord/embedded-app-sdk)**: A multiplayer template for building applications that can be run on the Discord platform. +- **[Facebook](https://www.facebook.com/fbgaminghome/developers)**: A template for building applications that can be run on the Facebook instant games platform. +- **[YouTube](https://developers.google.com/youtube/gaming/playables/reference/sdk)**: A template for building applications that can be run on the YouTube Playables platform. + + +## Advanced Usage + You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a PixiJS + Vite project, run: ```bash @@ -51,28 +84,13 @@ bun create pixi.js pixi-project --template bundler-vite You can use `.` for the project name to scaffold in the current directory. -### Templates - -Currently supported template presets include: +### Template List - `bundler-vite` - `bundler-webpack` - `bundler-esbuild` - `bundler-import-map` - -### Games - -We also have some additional templates that you can use for creating games for specific platforms: -- `game-web` - -**Coming soon:** -- `game-discord` -- `game-facebook` -- `game-youtube` - -These templates include additional configurations and dependencies to help you get started with your game development. As such they are more opinionated than the general bundler templates. - -Find out more about the templates in the [Games](/docs/guide/games/intro) section. +- `creation-web` ## License diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index 21a1491..d711e3c 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -51,6 +51,17 @@ export default function Home(): JSX.Element { padding: 20, }} > + Demo GIF

With NPM:

             npm create pixi.js@latest
diff --git a/docs/static/img/demo.gif b/docs/static/img/demo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..891d1b462bc75e938df4aae7bc07df1d149d3b51
GIT binary patch
literal 68266
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
K{y!`&m;VMbQG|{F

literal 0
HcmV?d00001

diff --git a/docs/static/img/devtool-screenshot.png b/docs/static/img/devtool-screenshot.png
deleted file mode 100644
index 91461b1f368ffa0503d053a52e9c7d5b6c0bd0f5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 87907
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%0D%KjFG$i8Or;^1g)5=HY7D5EwtTpHb3<
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 string;
 type Framework = {
@@ -61,7 +61,7 @@ type FrameworkVariant = {
 const FRAMEWORKS: Framework[] = [
   {
     name: "bundlers",
-    display: "Bundler",
+    display: "Bundler Templates",
     color: yellow,
     variants: [
       {
@@ -87,27 +87,27 @@ const FRAMEWORKS: Framework[] = [
     ],
   },
   {
-    name: "game",
-    display: "Games",
+    name: "creation",
+    display: "Creation Templates",
     color: cyan,
     variants: [
       {
-        name: "game-web",
+        name: "creation-web",
         display: "Web",
         color: yellow,
       },
       // {
-      //   name: "game-discord",
+      //   name: "creation-discord",
       //   display: "Discord",
       //   color: blue,
       // },
       // {
-      //   name: "game-facebook",
+      //   name: "creation-facebook",
       //   display: "Facebook",
       //   color: blueBright,
       // },
       // {
-      //   name: "game-youtube",
+      //   name: "creation-youtube",
       //   display: "YouTube",
       //   color: red,
       // },
diff --git a/templates/template-bundler-esbuild/public/index.html b/templates/template-bundler-esbuild/public/index.html
index 4d58dd0..3f49431 100644
--- a/templates/template-bundler-esbuild/public/index.html
+++ b/templates/template-bundler-esbuild/public/index.html
@@ -10,7 +10,7 @@
 
 
     
-
+
diff --git a/templates/template-bundler-esbuild/src/main.ts b/templates/template-bundler-esbuild/src/main.ts index d8c341b..083ac19 100644 --- a/templates/template-bundler-esbuild/src/main.ts +++ b/templates/template-bundler-esbuild/src/main.ts @@ -8,7 +8,7 @@ import { Application, Assets, Sprite } from "pixi.js"; await app.init({ background: "#1099bb", resizeTo: window }); // Append the application canvas to the document body - document.getElementById("game-container")!.appendChild(app.canvas); + document.getElementById("pixi-container")!.appendChild(app.canvas); // Load the bunny texture const texture = await Assets.load("/assets/bunny.png"); diff --git a/templates/template-bundler-import-map/index.html b/templates/template-bundler-import-map/index.html index a7526cd..215b7e7 100644 --- a/templates/template-bundler-import-map/index.html +++ b/templates/template-bundler-import-map/index.html @@ -10,7 +10,7 @@
-
+
diff --git a/templates/template-bundler-vite/src/main.ts b/templates/template-bundler-vite/src/main.ts index d8c341b..083ac19 100644 --- a/templates/template-bundler-vite/src/main.ts +++ b/templates/template-bundler-vite/src/main.ts @@ -8,7 +8,7 @@ import { Application, Assets, Sprite } from "pixi.js"; await app.init({ background: "#1099bb", resizeTo: window }); // Append the application canvas to the document body - document.getElementById("game-container")!.appendChild(app.canvas); + document.getElementById("pixi-container")!.appendChild(app.canvas); // Load the bunny texture const texture = await Assets.load("/assets/bunny.png"); diff --git a/templates/template-bundler-webpack/index.ejs b/templates/template-bundler-webpack/index.ejs index ab3e4e1..0794238 100644 --- a/templates/template-bundler-webpack/index.ejs +++ b/templates/template-bundler-webpack/index.ejs @@ -10,7 +10,7 @@
-
+
diff --git a/templates/template-bundler-webpack/src/main.ts b/templates/template-bundler-webpack/src/main.ts index d8c341b..083ac19 100644 --- a/templates/template-bundler-webpack/src/main.ts +++ b/templates/template-bundler-webpack/src/main.ts @@ -8,7 +8,7 @@ import { Application, Assets, Sprite } from "pixi.js"; await app.init({ background: "#1099bb", resizeTo: window }); // Append the application canvas to the document body - document.getElementById("game-container")!.appendChild(app.canvas); + document.getElementById("pixi-container")!.appendChild(app.canvas); // Load the bunny texture const texture = await Assets.load("/assets/bunny.png"); diff --git a/templates/template-game-web/_gitignore b/templates/template-creation-web/_gitignore similarity index 100% rename from templates/template-game-web/_gitignore rename to templates/template-creation-web/_gitignore diff --git a/templates/template-game-web/eslint__config.mjs b/templates/template-creation-web/eslint__config.mjs similarity index 100% rename from templates/template-game-web/eslint__config.mjs rename to templates/template-creation-web/eslint__config.mjs diff --git a/templates/template-game-web/index.html b/templates/template-creation-web/index.html similarity index 91% rename from templates/template-game-web/index.html rename to templates/template-creation-web/index.html index e1ae2c4..c618e96 100644 --- a/templates/template-game-web/index.html +++ b/templates/template-creation-web/index.html @@ -10,7 +10,7 @@
-
+
diff --git a/templates/template-game-web/package.json b/templates/template-creation-web/package.json similarity index 93% rename from templates/template-game-web/package.json rename to templates/template-creation-web/package.json index 9f6252e..006d31f 100644 --- a/templates/template-game-web/package.json +++ b/templates/template-creation-web/package.json @@ -1,5 +1,5 @@ { - "name": "template-game-web", + "name": "template-creation-web", "version": "0.0.0", "private": true, "type": "module", diff --git a/templates/template-game-web/public/favicon.png b/templates/template-creation-web/public/favicon.png similarity index 100% rename from templates/template-game-web/public/favicon.png rename to templates/template-creation-web/public/favicon.png diff --git a/templates/template-game-web/public/style.css b/templates/template-creation-web/public/style.css similarity index 100% rename from templates/template-game-web/public/style.css rename to templates/template-creation-web/public/style.css diff --git a/templates/template-game-web/raw-assets/game{m}/logo-white.svg b/templates/template-creation-web/raw-assets/main{m}/logo-white.svg similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/logo-white.svg rename to templates/template-creation-web/raw-assets/main{m}/logo-white.svg diff --git a/templates/template-game-web/raw-assets/game{m}/sounds/bgm-game.mp3 b/templates/template-creation-web/raw-assets/main{m}/sounds/bgm-main.mp3 similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/sounds/bgm-game.mp3 rename to templates/template-creation-web/raw-assets/main{m}/sounds/bgm-main.mp3 diff --git a/templates/template-game-web/raw-assets/game{m}/sounds/sfx-hover.wav b/templates/template-creation-web/raw-assets/main{m}/sounds/sfx-hover.wav similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/sounds/sfx-hover.wav rename to templates/template-creation-web/raw-assets/main{m}/sounds/sfx-hover.wav diff --git a/templates/template-game-web/raw-assets/game{m}/sounds/sfx-press.wav b/templates/template-creation-web/raw-assets/main{m}/sounds/sfx-press.wav similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/sounds/sfx-press.wav rename to templates/template-creation-web/raw-assets/main{m}/sounds/sfx-press.wav diff --git a/templates/template-game-web/raw-assets/game{m}/ui{tps}/button-large-press.png b/templates/template-creation-web/raw-assets/main{m}/ui{tps}/button-large-press.png similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/ui{tps}/button-large-press.png rename to templates/template-creation-web/raw-assets/main{m}/ui{tps}/button-large-press.png diff --git a/templates/template-game-web/raw-assets/game{m}/ui{tps}/button-large.png b/templates/template-creation-web/raw-assets/main{m}/ui{tps}/button-large.png similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/ui{tps}/button-large.png rename to templates/template-creation-web/raw-assets/main{m}/ui{tps}/button-large.png diff --git a/templates/template-game-web/raw-assets/game{m}/ui{tps}/icon-pause.png b/templates/template-creation-web/raw-assets/main{m}/ui{tps}/icon-pause.png similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/ui{tps}/icon-pause.png rename to templates/template-creation-web/raw-assets/main{m}/ui{tps}/icon-pause.png diff --git a/templates/template-game-web/raw-assets/game{m}/ui{tps}/icon-settings.png b/templates/template-creation-web/raw-assets/main{m}/ui{tps}/icon-settings.png similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/ui{tps}/icon-settings.png rename to templates/template-creation-web/raw-assets/main{m}/ui{tps}/icon-settings.png diff --git a/templates/template-game-web/raw-assets/game{m}/ui{tps}/rounded-rectangle.png b/templates/template-creation-web/raw-assets/main{m}/ui{tps}/rounded-rectangle.png similarity index 100% rename from templates/template-game-web/raw-assets/game{m}/ui{tps}/rounded-rectangle.png rename to templates/template-creation-web/raw-assets/main{m}/ui{tps}/rounded-rectangle.png diff --git a/templates/template-game-web/raw-assets/preload{m}/logo.svg b/templates/template-creation-web/raw-assets/preload{m}/logo.svg similarity index 100% rename from templates/template-game-web/raw-assets/preload{m}/logo.svg rename to templates/template-creation-web/raw-assets/preload{m}/logo.svg diff --git a/templates/template-game-web/scripts/assetpack-vite-plugin.ts b/templates/template-creation-web/scripts/assetpack-vite-plugin.ts similarity index 100% rename from templates/template-game-web/scripts/assetpack-vite-plugin.ts rename to templates/template-creation-web/scripts/assetpack-vite-plugin.ts diff --git a/templates/template-creation-web/src/app/getEngine.ts b/templates/template-creation-web/src/app/getEngine.ts new file mode 100644 index 0000000..3dc2080 --- /dev/null +++ b/templates/template-creation-web/src/app/getEngine.ts @@ -0,0 +1,15 @@ +import type { CreationEngine } from "../engine/engine"; + +let instance: CreationEngine | null = null; + +/** + * Get the main application engine + * This is a simple way to access the engine instance from anywhere in the app + */ +export function engine(): CreationEngine { + return instance!; +} + +export function setEngine(app: CreationEngine) { + instance = app; +} diff --git a/templates/template-game-web/src/game/popups/PausePopup.ts b/templates/template-creation-web/src/app/popups/PausePopup.ts similarity index 86% rename from templates/template-game-web/src/game/popups/PausePopup.ts rename to templates/template-creation-web/src/app/popups/PausePopup.ts index aea8035..52d8bd1 100644 --- a/templates/template-game-web/src/game/popups/PausePopup.ts +++ b/templates/template-creation-web/src/app/popups/PausePopup.ts @@ -56,9 +56,11 @@ export class PausePopup extends Container { /** Present the popup, animated */ public async show() { - const game = engine(); - if (game.navigation.currentScreen) { - game.navigation.currentScreen.filters = [new BlurFilter({ strength: 5 })]; + const currentEngine = engine(); + if (currentEngine.navigation.currentScreen) { + currentEngine.navigation.currentScreen.filters = [ + new BlurFilter({ strength: 5 }), + ]; } this.bg.alpha = 0; this.panel.pivot.y = -400; @@ -72,9 +74,9 @@ export class PausePopup extends Container { /** Dismiss the popup, animated */ public async hide() { - const game = engine(); - if (game.navigation.currentScreen) { - game.navigation.currentScreen.filters = []; + const currentEngine = engine(); + if (currentEngine.navigation.currentScreen) { + currentEngine.navigation.currentScreen.filters = []; } animate(this.bg, { alpha: 0 }, { duration: 0.2, ease: "linear" }); await animate( diff --git a/templates/template-game-web/src/game/popups/SettingsPopup.ts b/templates/template-creation-web/src/app/popups/SettingsPopup.ts similarity index 91% rename from templates/template-game-web/src/game/popups/SettingsPopup.ts rename to templates/template-creation-web/src/app/popups/SettingsPopup.ts index ee25d35..d4e6ad7 100644 --- a/templates/template-game-web/src/game/popups/SettingsPopup.ts +++ b/templates/template-creation-web/src/app/popups/SettingsPopup.ts @@ -10,7 +10,7 @@ import { RoundedBox } from "../ui/RoundedBox"; import { VolumeSlider } from "../ui/VolumeSlider"; import { userSettings } from "../utils/userSettings"; -/** Popup for volume and game mode settings - game mode cannot be changed during gameplay */ +/** Popup for volume */ export class SettingsPopup extends Container { /** The dark semi-transparent background covering current screen */ private bg: Sprite; @@ -22,7 +22,7 @@ export class SettingsPopup extends Container { private doneButton: LargeButton; /** The panel background */ private panelBase: RoundedBox; - /** The game build version label */ + /** The build version label */ private versionLabel: Text; /** Layout that organises the UI components */ private layout: List; @@ -114,9 +114,11 @@ export class SettingsPopup extends Container { /** Present the popup, animated */ public async show() { - const game = engine(); - if (game.navigation.currentScreen) { - game.navigation.currentScreen.filters = [new BlurFilter({ strength: 4 })]; + const currentEngine = engine(); + if (currentEngine.navigation.currentScreen) { + currentEngine.navigation.currentScreen.filters = [ + new BlurFilter({ strength: 4 }), + ]; } this.bg.alpha = 0; @@ -131,9 +133,9 @@ export class SettingsPopup extends Container { /** Dismiss the popup, animated */ public async hide() { - const game = engine(); - if (game.navigation.currentScreen) { - game.navigation.currentScreen.filters = []; + const currentEngine = engine(); + if (currentEngine.navigation.currentScreen) { + currentEngine.navigation.currentScreen.filters = []; } animate(this.bg, { alpha: 0 }, { duration: 0.2, ease: "linear" }); await animate( diff --git a/templates/template-game-web/src/game/screens/LoadScreen.ts b/templates/template-creation-web/src/app/screens/LoadScreen.ts similarity index 100% rename from templates/template-game-web/src/game/screens/LoadScreen.ts rename to templates/template-creation-web/src/app/screens/LoadScreen.ts diff --git a/templates/template-game-web/src/game/screens/game/Bouncer.ts b/templates/template-creation-web/src/app/screens/main/Bouncer.ts similarity index 92% rename from templates/template-game-web/src/game/screens/game/Bouncer.ts rename to templates/template-creation-web/src/app/screens/main/Bouncer.ts index f1eb396..54010c7 100644 --- a/templates/template-game-web/src/game/screens/game/Bouncer.ts +++ b/templates/template-creation-web/src/app/screens/main/Bouncer.ts @@ -3,15 +3,15 @@ import { animate } from "motion"; import { randomFloat } from "../../../engine/utils/random"; import { waitFor } from "../../../engine/utils/waitFor"; -import type { GameScreen } from "./GameScreen"; import { DIRECTION, Logo } from "./Logo"; +import type { MainScreen } from "./MainScreen"; export class Bouncer { private static readonly LOGO_COUNT = 3; private static readonly ANIMATION_DURATION = 1; private static readonly WAIT_DURATION = 0.5; - public screen!: GameScreen; + public screen!: MainScreen; private allLogoArray: Logo[] = []; private activeLogoArray: Logo[] = []; @@ -20,7 +20,7 @@ export class Bouncer { private xMin = -400; private xMax = 400; - public async show(screen: GameScreen): Promise { + public async show(screen: MainScreen): Promise { this.screen = screen; for (let i = 0; i < Bouncer.LOGO_COUNT; i++) { this.add(); @@ -36,7 +36,7 @@ export class Bouncer { logo.alpha = 0; logo.position.set(width, height); animate(logo, { alpha: 1 }, { duration: Bouncer.ANIMATION_DURATION }); - this.screen.gameContainer.addChild(logo); + this.screen.mainContainer.addChild(logo); this.allLogoArray.push(logo); this.activeLogoArray.push(logo); } @@ -46,7 +46,7 @@ export class Bouncer { if (logo) { animate(logo, { alpha: 0 }, { duration: Bouncer.ANIMATION_DURATION }) .then(() => { - this.screen.gameContainer.removeChild(logo); + this.screen.mainContainer.removeChild(logo); const index = this.allLogoArray.indexOf(logo); if (index !== -1) this.allLogoArray.splice(index, 1); }) diff --git a/templates/template-game-web/src/game/screens/game/Logo.ts b/templates/template-creation-web/src/app/screens/main/Logo.ts similarity index 100% rename from templates/template-game-web/src/game/screens/game/Logo.ts rename to templates/template-creation-web/src/app/screens/main/Logo.ts diff --git a/templates/template-game-web/src/game/screens/game/GameScreen.ts b/templates/template-creation-web/src/app/screens/main/MainScreen.ts similarity index 85% rename from templates/template-game-web/src/game/screens/game/GameScreen.ts rename to templates/template-creation-web/src/app/screens/main/MainScreen.ts index 3a30a19..f412c6b 100644 --- a/templates/template-game-web/src/game/screens/game/GameScreen.ts +++ b/templates/template-creation-web/src/app/screens/main/MainScreen.ts @@ -8,14 +8,15 @@ import { engine } from "../../getEngine"; import { PausePopup } from "../../popups/PausePopup"; import { SettingsPopup } from "../../popups/SettingsPopup"; import { LargeButton } from "../../ui/LargeButton"; -import { Bouncer } from "../game/Bouncer"; -/** The screen tha holds the Match3 game */ -export class GameScreen extends Container { +import { Bouncer } from "./Bouncer"; + +/** The screen that holds the app */ +export class MainScreen extends Container { /** Assets bundles required by this screen */ - public static assetBundles = ["game"]; + public static assetBundles = ["main"]; - public gameContainer: Container; + public mainContainer: Container; private pauseButton: FancyButton; private settingsButton: FancyButton; private addButton: FancyButton; @@ -26,8 +27,8 @@ export class GameScreen extends Container { constructor() { super(); - this.gameContainer = new Container(); - this.addChild(this.gameContainer); + this.mainContainer = new Container(); + this.addChild(this.mainContainer); this.bouncer = new Bouncer(); const buttonAnimations = { @@ -93,17 +94,17 @@ export class GameScreen extends Container { /** Pause gameplay - automatically fired when a popup is presented */ public async pause() { - this.gameContainer.interactiveChildren = false; + this.mainContainer.interactiveChildren = false; this.paused = true; } /** Resume gameplay */ public async resume() { - this.gameContainer.interactiveChildren = true; + this.mainContainer.interactiveChildren = true; this.paused = false; } - /** Fully reset the game, clearing all pieces and shelf blocks */ + /** Fully reset */ public reset() {} /** Resize the screen, fired whenever window size changes */ @@ -111,8 +112,8 @@ export class GameScreen extends Container { const centerX = width * 0.5; const centerY = height * 0.5; - this.gameContainer.x = centerX; - this.gameContainer.y = centerY; + this.mainContainer.x = centerX; + this.mainContainer.y = centerY; this.pauseButton.x = 30; this.pauseButton.y = 30; this.settingsButton.x = width - 30; @@ -127,7 +128,7 @@ export class GameScreen extends Container { /** Show screen with animations */ public async show(): Promise { - engine().bgm.play("game/sounds/bgm-game.mp3", { volume: 0.5 }); + engine().audio.bgm.play("main/sounds/bgm-main.mp3", { volume: 0.5 }); const elementsToAnimate = [ this.pauseButton, @@ -153,7 +154,7 @@ export class GameScreen extends Container { /** Hide screen with animations */ public async hide() {} - /** Auto pause the game when window go out of focus */ + /** Auto pause the app when window go out of focus */ public blur() { if (!engine().navigation.currentPopup) { engine().navigation.presentPopup(PausePopup); diff --git a/templates/template-game-web/src/game/ui/Label.ts b/templates/template-creation-web/src/app/ui/Label.ts similarity index 100% rename from templates/template-game-web/src/game/ui/Label.ts rename to templates/template-creation-web/src/app/ui/Label.ts diff --git a/templates/template-game-web/src/game/ui/LargeButton.ts b/templates/template-creation-web/src/app/ui/LargeButton.ts similarity index 94% rename from templates/template-game-web/src/game/ui/LargeButton.ts rename to templates/template-creation-web/src/app/ui/LargeButton.ts index a91ffed..fd43118 100644 --- a/templates/template-game-web/src/game/ui/LargeButton.ts +++ b/templates/template-creation-web/src/app/ui/LargeButton.ts @@ -78,11 +78,11 @@ export class LargeButton extends FancyButton { } private handleHover() { - engine().sfx.play("game/sounds/sfx-hover.wav"); + engine().audio.sfx.play("main/sounds/sfx-hover.wav"); } private handleDown() { - engine().sfx.play("game/sounds/sfx-press.wav"); + engine().audio.sfx.play("main/sounds/sfx-press.wav"); this.textOffset = { x: 0, y: -7 }; } diff --git a/templates/template-game-web/src/game/ui/RoundedBox.ts b/templates/template-creation-web/src/app/ui/RoundedBox.ts similarity index 100% rename from templates/template-game-web/src/game/ui/RoundedBox.ts rename to templates/template-creation-web/src/app/ui/RoundedBox.ts diff --git a/templates/template-game-web/src/game/ui/VolumeSlider.ts b/templates/template-creation-web/src/app/ui/VolumeSlider.ts similarity index 100% rename from templates/template-game-web/src/game/ui/VolumeSlider.ts rename to templates/template-creation-web/src/app/ui/VolumeSlider.ts diff --git a/templates/template-game-web/src/game/utils/userSettings.ts b/templates/template-creation-web/src/app/utils/userSettings.ts similarity index 77% rename from templates/template-game-web/src/game/utils/userSettings.ts rename to templates/template-creation-web/src/app/utils/userSettings.ts index 508ff52..f96361a 100644 --- a/templates/template-game-web/src/game/utils/userSettings.ts +++ b/templates/template-creation-web/src/app/utils/userSettings.ts @@ -7,13 +7,13 @@ const KEY_VOLUME_BGM = "volume-bgm"; const KEY_VOLUME_SFX = "volume-sfx"; /** - * Persistent user settings of volumes and game mode. + * Persistent user settings of volumes. */ class UserSettings { public init() { - engine().setMasterVolume(this.getMasterVolume()); - engine().bgm.setVolume(this.getBgmVolume()); - engine().sfx.setVolume(this.getSfxVolume()); + engine().audio.setMasterVolume(this.getMasterVolume()); + engine().audio.bgm.setVolume(this.getBgmVolume()); + engine().audio.sfx.setVolume(this.getSfxVolume()); } /** Get overall sound volume */ @@ -23,7 +23,7 @@ class UserSettings { /** Set overall sound volume */ public setMasterVolume(value: number) { - engine().setMasterVolume(value); + engine().audio.setMasterVolume(value); storage.setNumber(KEY_VOLUME_MASTER, value); } @@ -34,7 +34,7 @@ class UserSettings { /** Set background music volume */ public setBgmVolume(value: number) { - engine().bgm.setVolume(value); + engine().audio.bgm.setVolume(value); storage.setNumber(KEY_VOLUME_BGM, value); } @@ -45,7 +45,7 @@ class UserSettings { /** Set sound effects volume */ public setSfxVolume(value: number) { - engine().sfx.setVolume(value); + engine().audio.sfx.setVolume(value); storage.setNumber(KEY_VOLUME_SFX, value); } } diff --git a/templates/template-creation-web/src/engine/audio/AudioPlugin.ts b/templates/template-creation-web/src/engine/audio/AudioPlugin.ts new file mode 100644 index 0000000..98c12a6 --- /dev/null +++ b/templates/template-creation-web/src/engine/audio/AudioPlugin.ts @@ -0,0 +1,49 @@ +import { sound } from "@pixi/sound"; +import { ExtensionType } from "pixi.js"; +import type { Application, ExtensionMetadata } from "pixi.js"; + +import { BGM, SFX } from "./audio"; + +/** + * Middleware for Application's audio functionality. + * + * Adds the following methods to Application: + * * Application#audio + * * Application#audio.bgm + * * Application#audio.sfx + * * Application#audio.getMasterVolume + * * Application#audio.setMasterVolume + */ +export class CreationAudioPlugin { + /** @ignore */ + public static extension: ExtensionMetadata = ExtensionType.Application; + + /** + * Initialize the plugin with scope of application instance + */ + public static init(): void { + const app = this as unknown as Application; + + app.audio = { + bgm: new BGM(), + sfx: new SFX(), + getMasterVolume: () => sound.volumeAll, + setMasterVolume: (volume: number) => { + sound.volumeAll = volume; + if (!volume) { + sound.muteAll(); + } else { + sound.unmuteAll(); + } + }, + }; + } + + /** + * Clean up the ticker, scoped to application + */ + public static destroy(): void { + const app = this as unknown as Application; + app.audio = null as unknown as Application["audio"]; + } +} diff --git a/templates/template-game-web/src/engine/audio.ts b/templates/template-creation-web/src/engine/audio/audio.ts similarity index 100% rename from templates/template-game-web/src/engine/audio.ts rename to templates/template-creation-web/src/engine/audio/audio.ts diff --git a/templates/template-creation-web/src/engine/engine.ts b/templates/template-creation-web/src/engine/engine.ts new file mode 100644 index 0000000..e39c851 --- /dev/null +++ b/templates/template-creation-web/src/engine/engine.ts @@ -0,0 +1,74 @@ +import { sound } from "@pixi/sound"; +import type { + ApplicationOptions, + DestroyOptions, + RendererDestroyOptions, +} from "pixi.js"; +import { Application, Assets, extensions, ResizePlugin } from "pixi.js"; +import "pixi.js/app"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - This is a dynamically generated file by AssetPack +import manifest from "../manifest.json"; + +import { CreationAudioPlugin } from "./audio/AudioPlugin"; +import { CreationNavigationPlugin } from "./navigation/NavigationPlugin"; +import { CreationResizePlugin } from "./resize/ResizePlugin"; + +extensions.remove(ResizePlugin); +extensions.add(CreationResizePlugin); +extensions.add(CreationAudioPlugin); +extensions.add(CreationNavigationPlugin); + +/** + * The main creation engine class. + * + * This is a lightweight wrapper around the PixiJS Application class. + * It provides a few additional features such as: + * - Navigation manager + * - Audio manager + * - Resize handling + * - Visibility change handling (pause/resume sounds) + * + * It also initializes the PixiJS application and loads any assets in the `preload` bundle. + */ +export class CreationEngine extends Application { + /** Initialize the application */ + public async init(opts: Partial): Promise { + opts.resizeTo ??= window; + await super.init(opts); + + // Append the application canvas to the document body + document.getElementById("pixi-container")!.appendChild(this.canvas); + // Add a visibility listener, so the app can pause sounds and screens + document.addEventListener("visibilitychange", this.visibilityChange); + + // Init PixiJS assets with this asset manifest + await Assets.init({ manifest, basePath: "assets" }); + await Assets.loadBundle("preload"); + + // List all existing bundles names + const allBundles = manifest.bundles.map((item) => item.name); + // Start up background loading of all bundles + Assets.backgroundLoadBundle(allBundles); + } + + public override destroy( + rendererDestroyOptions: RendererDestroyOptions = false, + options: DestroyOptions = false, + ): void { + document.removeEventListener("visibilitychange", this.visibilityChange); + super.destroy(rendererDestroyOptions, options); + } + + /** Fire when document visibility changes - lose or regain focus */ + protected visibilityChange = () => { + if (document.hidden) { + sound.pauseAll(); + this.navigation.blur(); + } else { + sound.resumeAll(); + this.navigation.focus(); + } + }; +} diff --git a/templates/template-creation-web/src/engine/navigation/NavigationPlugin.ts b/templates/template-creation-web/src/engine/navigation/NavigationPlugin.ts new file mode 100644 index 0000000..02125f9 --- /dev/null +++ b/templates/template-creation-web/src/engine/navigation/NavigationPlugin.ts @@ -0,0 +1,41 @@ +import { ExtensionType } from "pixi.js"; +import type { Application, ExtensionMetadata } from "pixi.js"; + +import type { CreationEngine } from "../engine"; + +import { Navigation } from "./navigation"; + +/** + * Middleware for Application's navigation functionality. + * + * Adds the following methods to Application: + * * Application#navigation + */ +export class CreationNavigationPlugin { + /** @ignore */ + public static extension: ExtensionMetadata = ExtensionType.Application; + + private static _onResize: (() => void) | null; + + /** + * Initialize the plugin with scope of application instance + */ + public static init(): void { + const app = this as unknown as CreationEngine; + + app.navigation = new Navigation(); + app.navigation.init(app); + this._onResize = () => + app.navigation.resize(app.renderer.width, app.renderer.height); + app.renderer.on("resize", this._onResize); + app.resize(); + } + + /** + * Clean up the ticker, scoped to application + */ + public static destroy(): void { + const app = this as unknown as Application; + app.navigation = null as unknown as Navigation; + } +} diff --git a/templates/template-game-web/src/engine/navigation.ts b/templates/template-creation-web/src/engine/navigation/navigation.ts similarity index 97% rename from templates/template-game-web/src/engine/navigation.ts rename to templates/template-creation-web/src/engine/navigation/navigation.ts index 49906ec..c13868f 100644 --- a/templates/template-game-web/src/engine/navigation.ts +++ b/templates/template-creation-web/src/engine/navigation/navigation.ts @@ -1,7 +1,7 @@ import type { Ticker } from "pixi.js"; import { Assets, BigPool, Container } from "pixi.js"; -import type { GameEngine } from "./engine"; +import type { CreationEngine } from "../engine"; /** Interface for app screens */ interface AppScreen extends Container { @@ -36,7 +36,7 @@ interface AppScreenConstructor { export class Navigation { /** Reference to the main application */ - public app!: GameEngine; + public app!: CreationEngine; /** Container for screens */ public container = new Container(); @@ -56,7 +56,7 @@ export class Navigation { /** Current popup being displayed */ public currentPopup?: AppScreen; - public init(app: GameEngine) { + public init(app: CreationEngine) { this.app = app; } diff --git a/templates/template-creation-web/src/engine/resize/ResizePlugin.ts b/templates/template-creation-web/src/engine/resize/ResizePlugin.ts new file mode 100644 index 0000000..667c5f5 --- /dev/null +++ b/templates/template-creation-web/src/engine/resize/ResizePlugin.ts @@ -0,0 +1,168 @@ +import { ExtensionType } from "pixi.js"; +import type { + Application, + ApplicationOptions, + ExtensionMetadata, + ResizePluginOptions, +} from "pixi.js"; + +import { resize } from "./resize"; + +// Custom utility type: +export type DeepRequired = Required<{ + [K in keyof T]: DeepRequired; +}>; + +/** + * Application options for the CreationResizePlugin. + */ +export interface CreationResizePluginOptions extends ResizePluginOptions { + /** Options for controlling the resizing of the application */ + resizeOptions?: { + /** Minimum width of the application */ + minWidth?: number; + /** Minimum height of the application */ + minHeight?: number; + /** Whether to letterbox the application when resizing */ + letterbox?: boolean; + }; +} + +/** + * Middleware for Application's resize functionality. + * + * Adds the following methods to Application: + * * Application#resizeTo + * * Application#resize + * * Application#queueResize + * * Application#cancelResize + * * Application#resizeOptions + */ +export class CreationResizePlugin { + /** @ignore */ + public static extension: ExtensionMetadata = ExtensionType.Application; + + private static _resizeId: number | null; + private static _resizeTo: Window | HTMLElement | null; + private static _cancelResize: (() => void) | null; + + /** + * Initialize the plugin with scope of application instance + * @param {object} [options] - See application options + */ + public static init(options: ApplicationOptions): void { + const app = this as unknown as Application; + + Object.defineProperty( + app, + "resizeTo", + /** + * The HTML element or window to automatically resize the + * renderer's view element to match width and height. + */ + { + set(dom: Window | HTMLElement) { + globalThis.removeEventListener("resize", app.queueResize); + this._resizeTo = dom; + if (dom) { + globalThis.addEventListener("resize", app.queueResize); + app.resize(); + } + }, + get() { + return this._resizeTo; + }, + }, + ); + + /** + * Resize is throttled, so it's safe to call this multiple times per frame and it'll + * only be called once. + */ + app.queueResize = (): void => { + if (!this._resizeTo) { + return; + } + + this._cancelResize!(); + + // Throttle resize events per raf + this._resizeId = requestAnimationFrame(() => app.resize!()); + }; + + /** + * Execute an immediate resize on the renderer, this is not + * throttled and can be expensive to call many times in a row. + * Will resize only if `resizeTo` property is set. + */ + app.resize = (): void => { + if (!this._resizeTo) { + return; + } + + // clear queue resize + this._cancelResize!(); + + let canvasWidth: number; + let canvasHeight: number; + + // Resize to the window + if (this._resizeTo === globalThis.window) { + canvasWidth = globalThis.innerWidth; + canvasHeight = globalThis.innerHeight; + } + // Resize to other HTML entities + else { + const { clientWidth, clientHeight } = this._resizeTo as HTMLElement; + + canvasWidth = clientWidth; + canvasHeight = clientHeight; + } + + const { width, height } = resize( + canvasWidth, + canvasHeight, + app.resizeOptions.minWidth, + app.resizeOptions.minHeight, + app.resizeOptions.letterbox, + ); + + app.renderer.canvas.style.width = `${canvasWidth}px`; + app.renderer.canvas.style.height = `${canvasHeight}px`; + window.scrollTo(0, 0); + + app.renderer.resize(width, height); + }; + + this._cancelResize = (): void => { + if (this._resizeId) { + cancelAnimationFrame(this._resizeId); + this._resizeId = null; + } + }; + this._resizeId = null; + this._resizeTo = null; + app.resizeOptions = { + minWidth: 768, + minHeight: 1024, + letterbox: true, + ...options.resizeOptions, + }; + app.resizeTo = + options.resizeTo || (null as unknown as Window | HTMLElement); + } + + /** + * Clean up the ticker, scoped to application + */ + public static destroy(): void { + const app = this as unknown as Application; + + globalThis.removeEventListener("resize", app.queueResize); + this._cancelResize!(); + this._cancelResize = null; + app.queueResize = null as unknown as () => void; + app.resizeTo = null as unknown as Window | HTMLElement; + app.resize = null as unknown as () => void; + } +} diff --git a/templates/template-creation-web/src/engine/resize/resize.ts b/templates/template-creation-web/src/engine/resize/resize.ts new file mode 100644 index 0000000..a2450a6 --- /dev/null +++ b/templates/template-creation-web/src/engine/resize/resize.ts @@ -0,0 +1,37 @@ +export function resize( + w: number, + h: number, + minWidth: number, + minHeight: number, + letterbox: boolean, +) { + const aspectRatio = minWidth / minHeight; + let canvasWidth = w; + let canvasHeight = h; + + if (letterbox) { + if (minWidth < minHeight) { + canvasHeight = window.innerHeight; + canvasWidth = Math.min( + window.innerWidth, + minWidth, + canvasHeight * aspectRatio, + ); + } else { + canvasWidth = window.innerWidth; + canvasHeight = Math.min( + window.innerHeight, + minHeight, + canvasWidth / aspectRatio, + ); + } + } + + const scaleX = canvasWidth < minWidth ? minWidth / canvasWidth : 1; + const scaleY = canvasHeight < minHeight ? minHeight / canvasHeight : 1; + const scale = scaleX > scaleY ? scaleX : scaleY; + const width = Math.floor(canvasWidth * scale); + const height = Math.floor(canvasHeight * scale); + + return { width, height }; +} diff --git a/templates/template-game-web/src/engine/utils/maths.ts b/templates/template-creation-web/src/engine/utils/maths.ts similarity index 100% rename from templates/template-game-web/src/engine/utils/maths.ts rename to templates/template-creation-web/src/engine/utils/maths.ts diff --git a/templates/template-game-web/src/engine/utils/random.ts b/templates/template-creation-web/src/engine/utils/random.ts similarity index 100% rename from templates/template-game-web/src/engine/utils/random.ts rename to templates/template-creation-web/src/engine/utils/random.ts diff --git a/templates/template-game-web/src/engine/utils/storage.ts b/templates/template-creation-web/src/engine/utils/storage.ts similarity index 100% rename from templates/template-game-web/src/engine/utils/storage.ts rename to templates/template-creation-web/src/engine/utils/storage.ts diff --git a/templates/template-game-web/src/engine/utils/waitFor.ts b/templates/template-creation-web/src/engine/utils/waitFor.ts similarity index 100% rename from templates/template-game-web/src/engine/utils/waitFor.ts rename to templates/template-creation-web/src/engine/utils/waitFor.ts diff --git a/templates/template-creation-web/src/main.ts b/templates/template-creation-web/src/main.ts new file mode 100644 index 0000000..3839442 --- /dev/null +++ b/templates/template-creation-web/src/main.ts @@ -0,0 +1,31 @@ +import { setEngine } from "./app/getEngine"; +import { LoadScreen } from "./app/screens/LoadScreen"; +import { MainScreen } from "./app/screens/main/MainScreen"; +import { userSettings } from "./app/utils/userSettings"; +import { CreationEngine } from "./engine/engine"; + +/** + * Importing these modules will automatically register there plugins with the engine. + */ +import "@pixi/sound"; +// import "@esotericsoftware/spine-pixi-v8"; + +// Create a new creation engine instance +const engine = new CreationEngine(); +setEngine(engine); + +(async () => { + // Initialize the creation engine instance + await engine.init({ + background: "#1E1E1E", + resizeOptions: { minWidth: 768, minHeight: 1024, letterbox: false }, + }); + + // Initialize the user settings + userSettings.init(); + + // Show the load screen + await engine.navigation.showScreen(LoadScreen); + // Show the main screen once the load screen is dismissed + await engine.navigation.showScreen(MainScreen); +})(); diff --git a/templates/template-creation-web/src/pixi-mixins.d.ts b/templates/template-creation-web/src/pixi-mixins.d.ts new file mode 100644 index 0000000..db115ba --- /dev/null +++ b/templates/template-creation-web/src/pixi-mixins.d.ts @@ -0,0 +1,24 @@ +import type { BGM, SFX } from "./engine/audio/audio"; +import type { Navigation } from "./engine/navigation/navigation"; +import type { + CreationResizePluginOptions, + DeepRequired, +} from "./engine/resize/ResizePlugin"; + +declare global { + namespace PixiMixins { + interface Application extends DeepRequired { + audio: { + bgm: BGM; + sfx: SFX; + getMasterVolume: () => number; + setMasterVolume: (volume: number) => void; + }; + navigation: Navigation; + } + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface ApplicationOptions extends CreationResizePluginOptions {} + } +} + +export {}; diff --git a/templates/template-game-web/src/typings.d.ts b/templates/template-creation-web/src/vite-env.d.ts similarity index 66% rename from templates/template-game-web/src/typings.d.ts rename to templates/template-creation-web/src/vite-env.d.ts index 97fa627..e80e47f 100644 --- a/templates/template-game-web/src/typings.d.ts +++ b/templates/template-creation-web/src/vite-env.d.ts @@ -1,2 +1,3 @@ +/// /** Injected by ViteJS define plugin */ declare const APP_VERSION: string; diff --git a/templates/template-game-web/tsconfig.json b/templates/template-creation-web/tsconfig.json similarity index 100% rename from templates/template-game-web/tsconfig.json rename to templates/template-creation-web/tsconfig.json diff --git a/templates/template-game-web/vite.config.ts b/templates/template-creation-web/vite.config.ts similarity index 100% rename from templates/template-game-web/vite.config.ts rename to templates/template-creation-web/vite.config.ts diff --git a/templates/template-game-web/src/engine/engine.ts b/templates/template-game-web/src/engine/engine.ts deleted file mode 100644 index acd5182..0000000 --- a/templates/template-game-web/src/engine/engine.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { sound } from "@pixi/sound"; -import type { ApplicationOptions } from "pixi.js"; -import { Application, Assets } from "pixi.js"; - -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore - This is a dynamically generated file by AssetPack -import manifest from "../manifest.json"; - -import { BGM, SFX } from "./audio"; -import { Navigation } from "./navigation"; - -/** - * The main game engine class. - * - * This is a lightweight wrapper around the PixiJS Application class. - * It provides a few additional features such as: - * - Navigation manager - * - Audio manager - * - Resize handling - * - Visibility change handling (pause/resume sounds) - * - * It also initializes the PixiJS application and loads any assets in the `preload` bundle. - */ -export class GameEngine { - /** Reference to the PixiJS application */ - public readonly pixiApp = new Application(); - - /** Options for resizing the application */ - public resizeOptions: { - /** Minimum width of the application */ - minWidth: number; - /** Minimum height of the application */ - minHeight: number; - /** Whether to letterbox the application when resizing */ - letterbox?: boolean; - } = { minWidth: 768, minHeight: 1024, letterbox: true }; - - /** Navigation manager */ - public readonly navigation = new Navigation(); - - /** The background music audio manager */ - public bgm = new BGM(); - /** The sound effects audio manager */ - public sfx = new SFX(); - - /** Initialize the application */ - public async init( - opts: Partial & { - resizeOptions?: Partial; - }, - ): Promise { - await this.pixiApp.init(opts); - - // Append the application canvas to the document body - document.getElementById("game-container")!.appendChild(this.pixiApp.canvas); - - this.navigation.init(this); - - // Store the resize options - this.resizeOptions = { - ...this.resizeOptions, - ...(opts.resizeOptions || {}), - }; - - // Whenever the window resizes, call the 'resize' function - window.addEventListener("resize", () => this.resize()); - - // Trigger the first resize - this.resize(); - - // Add a visibility listener, so the app can pause sounds and screens - document.addEventListener("visibilitychange", this.visibilityChange); - - // Init PixiJS assets with this asset manifest - await Assets.init({ manifest, basePath: "assets" }); - await Assets.loadBundle("preload"); - - // List all existing bundles names - const allBundles = manifest.bundles.map((item) => item.name); - // Start up background loading of all bundles - Assets.backgroundLoadBundle(allBundles); - } - - /** Reference to the renderer's screen rectangle. Its safe to use as filterArea or hitArea for the whole screen. */ - public get screen() { - return this.pixiApp.screen; - } - - /** - * Get the root container that is rendered. - * This stage also contains the container for navigation - */ - public get stage() { - return this.pixiApp.stage; - } - - /** Get the shared pixi ticker */ - public get ticker() { - return this.pixiApp.ticker; - } - - /** Reference to the current renderer. */ - public get renderer() { - return this.pixiApp.renderer; - } - - /** Reference to the renderer's canvas element. */ - public get canvas() { - return this.pixiApp.canvas; - } - - /** Get overall sound volume */ - public getMasterVolume() { - return sound.volumeAll; - } - - /** Set the overall sound volume, affecting all music and sound effects */ - public setMasterVolume(v: number) { - sound.volumeAll = v; - if (!v) { - sound.muteAll(); - } else { - sound.unmuteAll(); - } - } - - /** - * Resize the application ensuring that the minimum width and height are maintained. - * @param w - The new width to resize to - * @param h - The new height to resize to - */ - public resize(w?: number, h?: number) { - const minWidth = this.resizeOptions.minWidth; - const minHeight = this.resizeOptions.minHeight; - const aspectRatio = minWidth / minHeight; - let canvasWidth = w ?? window.innerWidth; - let canvasHeight = h ?? window.innerHeight; - - if (this.resizeOptions.letterbox) { - if (minWidth < minHeight) { - canvasHeight = window.innerHeight; - canvasWidth = Math.min( - window.innerWidth, - minWidth, - canvasHeight * aspectRatio, - ); - } else { - canvasWidth = window.innerWidth; - canvasHeight = Math.min( - window.innerHeight, - minHeight, - canvasWidth / aspectRatio, - ); - } - } - - const scaleX = canvasWidth < minWidth ? minWidth / canvasWidth : 1; - const scaleY = canvasHeight < minHeight ? minHeight / canvasHeight : 1; - const scale = scaleX > scaleY ? scaleX : scaleY; - const width = Math.floor(canvasWidth * scale); - const height = Math.floor(canvasHeight * scale); - - this.pixiApp.renderer.canvas.style.width = `${canvasWidth}px`; - this.pixiApp.renderer.canvas.style.height = `${canvasHeight}px`; - window.scrollTo(0, 0); - - this.pixiApp.renderer.resize(width, height); - this.navigation.resize(width, height); - } - - /** Fire when document visibility changes - lose or regain focus */ - protected visibilityChange = () => { - if (document.hidden) { - sound.pauseAll(); - this.navigation.blur(); - } else { - sound.resumeAll(); - this.navigation.focus(); - } - }; -} diff --git a/templates/template-game-web/src/game/getEngine.ts b/templates/template-game-web/src/game/getEngine.ts deleted file mode 100644 index 165c0c7..0000000 --- a/templates/template-game-web/src/game/getEngine.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { GameEngine } from "../engine/engine"; - -let instance: GameEngine | null = null; - -export function engine(): GameEngine { - return instance!; -} - -export function setEngine(app: GameEngine) { - instance = app; -} diff --git a/templates/template-game-web/src/main.ts b/templates/template-game-web/src/main.ts deleted file mode 100644 index 8325646..0000000 --- a/templates/template-game-web/src/main.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { GameEngine } from "./engine/engine"; -import { setEngine } from "./game/getEngine"; -import { GameScreen } from "./game/screens/game/GameScreen"; -import { LoadScreen } from "./game/screens/LoadScreen"; -import { userSettings } from "./game/utils/userSettings"; - -/** - * Importing these modules will automatically register there plugins with the engine. - */ -// import "@esotericsoftware/spine-pixi-v8"; -import "@pixi/sound"; - -// Create a new game engine instance -const engine = new GameEngine(); -setEngine(engine); - -(async () => { - // Initialize the game engine instance - await engine.init({ - background: "#1E1E1E", - resizeOptions: { minWidth: 768, minHeight: 1024, letterbox: false }, - }); - - // Initialize the user settings - userSettings.init(); - - // Show the load screen - await engine.navigation.showScreen(LoadScreen); - // Show the game screen once the load screen is dismissed - await engine.navigation.showScreen(GameScreen); -})(); diff --git a/templates/template-game-web/src/vite-env.d.ts b/templates/template-game-web/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/templates/template-game-web/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -///