From eab2639263bef00bf4fe87ee591fb18af9d6e473 Mon Sep 17 00:00:00 2001 From: Scott Westover Date: Sun, 15 Dec 2024 07:15:33 -0500 Subject: [PATCH] added infinite jumper game Signed-off-by: Scott Westover --- .../infinite-jumper/assets/animations.json | 154 ++++++++++ .../infinite-jumper/assets/asset-pack.json | 56 ++++ .../assets/background/background.png | Bin 0 -> 6624 bytes .../background/middleground-no-fungus.png | Bin 0 -> 10216 bytes .../assets/font/PressStart2P-Regular.ttf | Bin 0 -> 116008 bytes .../infinite-jumper/assets/other/ground.png | Bin 0 -> 3193 bytes .../infinite-jumper/assets/other/platform.png | Bin 0 -> 780 bytes .../infinite-jumper/assets/other/wall.png | Bin 0 -> 2292 bytes .../infinite-jumper/assets/player/player.json | 275 ++++++++++++++++++ .../infinite-jumper/assets/player/player.png | Bin 0 -> 8001 bytes .../static/games/infinite-jumper/index.html | 31 ++ .../ActionTargetComp.js | 46 +++ .../ScriptNode.js | 95 ++++++ .../UserComponent.js | 43 +++ .../phaserjs_editor_scripts_base/index.js | 3 + .../static/games/infinite-jumper/src/main.js | 36 +++ .../src/prefabs/BackgroundPrefab.js | 31 ++ .../src/prefabs/ForegroundPrefab.js | 31 ++ .../src/prefabs/PlatformGroupPrefab.js | 86 ++++++ .../src/prefabs/PlatformPrefab.js | 69 +++++ .../src/prefabs/PlayerPrefab.js | 34 +++ .../infinite-jumper/src/prefabs/WallPrefab.js | 38 +++ .../infinite-jumper/src/scenes/GameOver.js | 95 ++++++ .../games/infinite-jumper/src/scenes/Level.js | 247 ++++++++++++++++ .../infinite-jumper/src/scenes/Preload.js | 81 ++++++ .../games/infinite-jumper/src/scenes/Title.js | 181 ++++++++++++ .../games/infinite-jumper/src/scenes/UI.js | 54 ++++ .../animation/TweenActionScript.js | 65 +++++ .../camera/FadeEffectCameraActionScript.js | 50 ++++ .../PlaySpriteAnimationActionScript.js | 23 ++ .../gameobject/UpdateTextureActionScript.js | 41 +++ .../scene/LaunchSceneActionScript.js | 37 +++ .../scene/SceneOnPointerDownActionScript.js | 48 +++ .../scene/StartSceneActionScript.js | 37 +++ .../scene/StopSceneActionScript.js | 37 +++ .../timer/TimeEventActionScript.js | 47 +++ .../scriptnodes/utils/CallbackActionScript.js | 35 +++ .../scriptnodes/utils/OnAwakeActionScript.js | 32 ++ 38 files changed, 2138 insertions(+) create mode 100755 hugo-site/static/games/infinite-jumper/assets/animations.json create mode 100755 hugo-site/static/games/infinite-jumper/assets/asset-pack.json create mode 100644 hugo-site/static/games/infinite-jumper/assets/background/background.png create mode 100644 hugo-site/static/games/infinite-jumper/assets/background/middleground-no-fungus.png create mode 100644 hugo-site/static/games/infinite-jumper/assets/font/PressStart2P-Regular.ttf create mode 100644 hugo-site/static/games/infinite-jumper/assets/other/ground.png create mode 100644 hugo-site/static/games/infinite-jumper/assets/other/platform.png create mode 100644 hugo-site/static/games/infinite-jumper/assets/other/wall.png create mode 100644 hugo-site/static/games/infinite-jumper/assets/player/player.json create mode 100644 hugo-site/static/games/infinite-jumper/assets/player/player.png create mode 100644 hugo-site/static/games/infinite-jumper/index.html create mode 100644 hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ActionTargetComp.js create mode 100644 hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ScriptNode.js create mode 100644 hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/UserComponent.js create mode 100644 hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/index.js create mode 100644 hugo-site/static/games/infinite-jumper/src/main.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/BackgroundPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/ForegroundPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/PlatformGroupPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/PlatformPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/PlayerPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/prefabs/WallPrefab.js create mode 100755 hugo-site/static/games/infinite-jumper/src/scenes/GameOver.js create mode 100755 hugo-site/static/games/infinite-jumper/src/scenes/Level.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scenes/Preload.js create mode 100755 hugo-site/static/games/infinite-jumper/src/scenes/Title.js create mode 100755 hugo-site/static/games/infinite-jumper/src/scenes/UI.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/animation/TweenActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/camera/FadeEffectCameraActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/PlaySpriteAnimationActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/UpdateTextureActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/LaunchSceneActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/SceneOnPointerDownActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StartSceneActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StopSceneActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/timer/TimeEventActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/CallbackActionScript.js create mode 100644 hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/OnAwakeActionScript.js diff --git a/hugo-site/static/games/infinite-jumper/assets/animations.json b/hugo-site/static/games/infinite-jumper/assets/animations.json new file mode 100755 index 00000000..fdde262a --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/assets/animations.json @@ -0,0 +1,154 @@ +{ + "anims": [ + { + "key": "playerIdle", + "type": "frame", + "frames": [ + { + "key": "player", + "frame": "player-idle-1.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-idle-2.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-idle-3.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-idle-4.png", + "duration": 0, + "keyframe": false + } + ], + "frameRate": 8, + "skipMissedFrames": true, + "repeat": -1, + "randomFrame": false + }, + { + "key": "playerJump", + "type": "frame", + "frames": [ + { + "key": "player", + "frame": "player-jump-1.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-2.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-3.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-4.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-5.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-6.png", + "duration": 0, + "keyframe": false + } + ], + "frameRate": 18, + "skipMissedFrames": true, + "randomFrame": false + }, + { + "key": "playerSpin", + "type": "frame", + "frames": [ + { + "key": "player", + "frame": "player-jump-2.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-3.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-4.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-5.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-jump-6.png", + "duration": 0, + "keyframe": false + } + ], + "frameRate": 16, + "skipMissedFrames": true, + "repeat": -1, + "randomFrame": false + }, + { + "key": "playerHurt", + "type": "frame", + "frames": [ + { + "key": "player", + "frame": "player-hurt-1.png", + "duration": 0, + "keyframe": false + }, + { + "key": "player", + "frame": "player-hurt-2.png", + "duration": 0, + "keyframe": false + } + ], + "frameRate": 8, + "skipMissedFrames": true, + "randomFrame": false + } + ], + "globalTimeScale": 1, + "meta": { + "app": "Phaser Editor 2D v3", + "contentType": "Phaser v3 Animations" + }, + "settings": { + "sourceLang": "JAVA_SCRIPT", + "esModule": false, + "generateCode": false + } +} \ No newline at end of file diff --git a/hugo-site/static/games/infinite-jumper/assets/asset-pack.json b/hugo-site/static/games/infinite-jumper/assets/asset-pack.json new file mode 100755 index 00000000..025824b5 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/assets/asset-pack.json @@ -0,0 +1,56 @@ +{ + "section1": { + "files": [ + { + "url": "assets/animations.json", + "type": "animation", + "key": "animations" + }, + { + "url": "assets/background/background.png", + "type": "image", + "key": "background" + }, + { + "url": "assets/other/ground.png", + "type": "image", + "key": "ground" + }, + { + "url": "assets/background/middleground-no-fungus.png", + "type": "image", + "key": "middleground-no-fungus" + }, + { + "url": "assets/other/platform.png", + "type": "image", + "key": "platform" + }, + { + "atlasURL": "assets/player/player.json", + "textureURL": "assets/player/player.png", + "type": "atlas", + "key": "player" + }, + { + "url": "assets/font/PressStart2P-Regular.ttf", + "format": "truetype", + "descriptors": {}, + "type": "font", + "key": "PressStart2P-Regular" + }, + { + "url": "assets/other/wall.png", + "type": "image", + "key": "wall" + } + ] + }, + "meta": { + "app": "Phaser Editor 2D - Asset Pack Editor", + "contentType": "phasereditor2d.pack.core.AssetContentType", + "url": "https://phasereditor2d.com", + "version": 2, + "showAllFilesInBlocks": false + } +} \ No newline at end of file diff --git a/hugo-site/static/games/infinite-jumper/assets/background/background.png b/hugo-site/static/games/infinite-jumper/assets/background/background.png new file mode 100644 index 0000000000000000000000000000000000000000..b7aa395add4075145d44c3504e2970dadaada907 GIT binary patch literal 6624 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 G2mb;0Y##Lh literal 0 HcmV?d00001 diff --git a/hugo-site/static/games/infinite-jumper/assets/background/middleground-no-fungus.png b/hugo-site/static/games/infinite-jumper/assets/background/middleground-no-fungus.png new file mode 100644 index 0000000000000000000000000000000000000000..5f778a59de3b259180cfaa99eaff709a970f9b42 GIT binary patch literal 10216 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 z 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∓eYz|5P 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 literal 0 HcmV?d00001 diff --git a/hugo-site/static/games/infinite-jumper/assets/player/player.json b/hugo-site/static/games/infinite-jumper/assets/player/player.json new file mode 100644 index 00000000..e71c9ef3 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/assets/player/player.json @@ -0,0 +1,275 @@ +{ + "frames": { + "player-duck.png": { + "frame": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-hurt-1.png": { + "frame": { + "x": 80, + "y": 0, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-hurt-2.png": { + "frame": { + "x": 160, + "y": 0, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-idle-1.png": { + "frame": { + "x": 0, + "y": 80, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-idle-2.png": { + "frame": { + "x": 80, + "y": 80, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-idle-3.png": { + "frame": { + "x": 160, + "y": 80, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-idle-4.png": { + "frame": { + "x": 0, + "y": 160, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-1.png": { + "frame": { + "x": 80, + "y": 160, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-2.png": { + "frame": { + "x": 160, + "y": 160, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-3.png": { + "frame": { + "x": 240, + "y": 0, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-4.png": { + "frame": { + "x": 240, + "y": 80, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-5.png": { + "frame": { + "x": 240, + "y": 160, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + }, + "player-jump-6.png": { + "frame": { + "x": 0, + "y": 240, + "w": 80, + "h": 80 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 80, + "h": 80 + }, + "sourceSize": { + "w": 80, + "h": 80 + } + } + }, + "meta": { + "app": "http://www.codeandweb.com/texturepacker", + "version": "1.0", + "image": "spritesheet.png", + "format": "RGBA8888", + "size": { + "w": 320, + "h": 320 + }, + "scale": "1" + } +} \ No newline at end of file diff --git a/hugo-site/static/games/infinite-jumper/assets/player/player.png b/hugo-site/static/games/infinite-jumper/assets/player/player.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb9b8766e79017b4fd80c870cee20f7ebbe232c GIT binary patch literal 8001 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 Ye9F0~xNyG{&=Uu=ZtJO+tJ;M9FC;x0n*aa+ literal 0 HcmV?d00001 diff --git a/hugo-site/static/games/infinite-jumper/index.html b/hugo-site/static/games/infinite-jumper/index.html new file mode 100644 index 00000000..c35d6dea --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/index.html @@ -0,0 +1,31 @@ + + + + + + + + My Game + + + + + + + + + + + + + + diff --git a/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ActionTargetComp.js b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ActionTargetComp.js new file mode 100644 index 00000000..bece6761 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ActionTargetComp.js @@ -0,0 +1,46 @@ +// You can write more code here +/* END-USER-IMPORTS */ +export default class ActionTargetComp { + constructor(gameObject) { + this.gameObject = gameObject; + gameObject["__ActionTargetComp"] = this; + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + static getComponent(gameObject) { + return gameObject["__ActionTargetComp"]; + } + gameObject; + target = "GAME_OBJECT"; + targetName = ""; + /* START-USER-CODE */ + static getTargetGameObject(scriptNode, args) { + const comp = ActionTargetComp.getComponent(scriptNode); + if (comp) { + switch (comp.target) { + case "GAME_OBJECT": + return scriptNode.gameObject; + case "ARG_1": + return args[0]; + case "ARG_2": + return args[1]; + case "ARG_3": + return args[2]; + case "ARG_4": + return args[3]; + case "ARG_5": + return args[4]; + case "ARG_6": + return args[5]; + case "ARG_7": + return args[6]; + case "ARG_8": + return args[7]; + } + } + return scriptNode.gameObject; + } +} +/* END OF COMPILED CODE */ +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ScriptNode.js b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ScriptNode.js new file mode 100644 index 00000000..b4b97dea --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/ScriptNode.js @@ -0,0 +1,95 @@ +import ActionTargetComp from "./ActionTargetComp.js"; +export default class ScriptNode { + _scene; + _gameObject; + _parent; + _children; + constructor(parent) { + this._parent = parent; + if (parent instanceof ScriptNode) { + this._scene = parent.scene; + this._gameObject = parent.gameObject; + parent.add(this); + } + else if (parent instanceof Phaser.GameObjects.GameObject) { + this._scene = parent.scene; + this._gameObject = parent; + } + else { + this._scene = parent; + } + const listenAwake = this.awake !== ScriptNode.prototype.awake; + const listenStart = this.start !== ScriptNode.prototype.start; + const listenUpdate = this.update !== ScriptNode.prototype.update; + const listenDestroy = this.destroy !== ScriptNode.prototype.destroy; + if (listenAwake) { + this.scene.events.once("scene-awake", this.awake, this); + } + if (listenStart) { + this.scene.events.once(Phaser.Scenes.Events.UPDATE, this.start, this); + } + if (listenUpdate) { + this.scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + } + if (listenAwake || listenStart || listenUpdate || listenDestroy) { + const destroyCallback = () => { + this.scene.events.off("scene-awake", this.awake, this); + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.start, this); + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + if (listenDestroy) { + this.destroy(); + } + }; + if (this.gameObject) { + this.gameObject.on(Phaser.GameObjects.Events.DESTROY, destroyCallback); + } + else { + this.scene.events.on(Phaser.Scenes.Events.SHUTDOWN, destroyCallback); + } + } + } + getActionTargetObject(args) { + const target = ActionTargetComp.getTargetGameObject(this, args); + return target; + } + get scene() { + return this._scene; + } + get gameObject() { + return this._gameObject; + } + get parent() { + return this._parent; + } + get children() { + if (!this._children) { + this._children = []; + } + return this._children; + } + add(child) { + this.children.push(child); + } + executeChildren(...args) { + if (this._children) { + for (const child of this._children) { + child.execute(...args); + } + } + } + execute(...args) { + // override this on executable nodes + } + awake() { + // override this + } + start() { + // override this + } + update() { + // override this + } + destroy() { + // override this + } +} diff --git a/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/UserComponent.js b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/UserComponent.js new file mode 100644 index 00000000..a9cf7729 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/UserComponent.js @@ -0,0 +1,43 @@ +export default class UserComponent { + /** + * @param gameObject The entity. + */ + constructor(gameObject) { + this.scene = gameObject.scene; + const listenAwake = this.awake !== UserComponent.prototype.awake; + const listenStart = this.start !== UserComponent.prototype.start; + const listenUpdate = this.update !== UserComponent.prototype.update; + const listenDestroy = this.destroy !== UserComponent.prototype.destroy; + if (listenAwake) { + this.scene.events.once("scene-awake", this.awake, this); + } + if (listenStart) { + this.scene.events.once(Phaser.Scenes.Events.UPDATE, this.start, this); + } + if (listenUpdate) { + this.scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + } + if (listenStart || listenUpdate || listenDestroy) { + gameObject.on(Phaser.GameObjects.Events.DESTROY, () => { + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.start, this); + this.scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + if (listenDestroy) { + this.destroy(); + } + }); + } + } + scene; + awake() { + // override this + } + start() { + // override this + } + update() { + // override this + } + destroy() { + // override this + } +} diff --git a/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/index.js b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/index.js new file mode 100644 index 00000000..b33a7528 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/phaserjs_editor_scripts_base/index.js @@ -0,0 +1,3 @@ +export { default as ScriptNode } from "./ScriptNode.js"; +export { default as UserComponent } from "./UserComponent.js"; +export { default as ActionTargetComp } from "./ActionTargetComp.js"; diff --git a/hugo-site/static/games/infinite-jumper/src/main.js b/hugo-site/static/games/infinite-jumper/src/main.js new file mode 100644 index 00000000..0051b561 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/main.js @@ -0,0 +1,36 @@ +import Level from "./scenes/Level.js"; +import Preload from "./scenes/Preload.js"; +import UI from "./scenes/UI.js"; +import GameOver from "./scenes/GameOver.js"; +import Title from "./scenes/Title.js"; + +window.addEventListener('load', function () { + + var game = new Phaser.Game({ + width: 240, + height: 176, + type: Phaser.AUTO, + backgroundColor: "#000000", + scale: { + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH + }, + pixelArt: true, + physics: { + default: 'arcade', + arcade: { + gravity: { + x: 0, + y: 300 + }, + debug: false + } + } + }); + + game.scene.add("Level", Level); + game.scene.add("UI", UI); + game.scene.add("GameOver", GameOver); + game.scene.add("Title", Title); + game.scene.add("Preload", Preload, true); +}); diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/BackgroundPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/BackgroundPrefab.js new file mode 100755 index 00000000..a9d0c3f5 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/BackgroundPrefab.js @@ -0,0 +1,31 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class BackgroundPrefab extends Phaser.GameObjects.TileSprite { + + constructor(scene, x, y, width, height, texture, frame) { + super(scene, x ?? 0, y ?? 0, width ?? 240, height ?? 176, texture || "background", frame); + + this.setOrigin(0, 0); + + /* START-USER-CTR-CODE */ + // Write your code here. + this.setScrollFactor(0); + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/ForegroundPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/ForegroundPrefab.js new file mode 100755 index 00000000..62553b87 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/ForegroundPrefab.js @@ -0,0 +1,31 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class ForegroundPrefab extends Phaser.GameObjects.TileSprite { + + constructor(scene, x, y, width, height, texture, frame) { + super(scene, x ?? 0, y ?? 0, width ?? 240, height ?? 176, texture || "middleground-no-fungus", frame); + + this.setOrigin(0, 0); + + /* START-USER-CTR-CODE */ + // Write your code here. + this.setScrollFactor(0); + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformGroupPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformGroupPrefab.js new file mode 100755 index 00000000..8fd53b96 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformGroupPrefab.js @@ -0,0 +1,86 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +import PlatformPrefab from "./PlatformPrefab.js"; +/* END-USER-IMPORTS */ + +export default class PlatformGroupPrefab extends Phaser.GameObjects.Layer { + + constructor(scene) { + super(scene); + + /* START-USER-CTR-CODE */ + // Write your code here. + /** @type {Phaser.Scene} */ + const _scene = scene; + this.group = _scene.add.group({ + classType: PlatformPrefab, + runChildUpdate: true, + }); + + this.group.get(120, 0); + + for (let i = 1; i < 5; i += 1) { + const x = Phaser.Math.Between(10, 200); + const y = -150 * i; + this.group.get(x, y); + } + + this.maxPlatformDistance = scene.scale.height * 3; + this.bottomMostPlatformYPosition = 0; + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + /** @type {Phaser.GameObjects.Group} */ + group; + /** @type {number} */ + maxPlatformDistance; + /** @type {number} */ + bottomMostPlatformYPosition; + /** @type {boolean} */ + enableMovingPlatforms = false; + + // Write your code here. + + update() { + const scrollY = this.scene.cameras.main.scrollY; + const children = this.group.getChildren(); + const childrenToMove = []; + this.bottomMostPlatformYPosition = children[0].y; + + children.forEach((child) => { + if (child.y >= scrollY + this.maxPlatformDistance) { + childrenToMove.push(child); + } + if (child.y > this.bottomMostPlatformYPosition) { + this.bottomMostPlatformYPosition = child.y; + } + }); + + let childrenToMoveYOffset = 0; + childrenToMove.forEach((child) => { + child.x = Phaser.Math.Between(10, 200); + childrenToMoveYOffset += Phaser.Math.Between(10, 40) + child.y = scrollY - childrenToMoveYOffset; + + if (this.enableMovingPlatforms) { + if (Phaser.Math.RND.between(0, 1) === 1) { + child.startPlatformMovement(); + } else { + child.stopPlatformMovement(); + } + } + }); + + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformPrefab.js new file mode 100755 index 00000000..0496177d --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/PlatformPrefab.js @@ -0,0 +1,69 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class PlatformPrefab extends Phaser.Physics.Arcade.Image { + + constructor(scene, x, y, texture, frame) { + super(scene, x ?? 0, y ?? 0, texture || "platform", frame); + + this.scaleX = 0.75; + this.scaleY = 0.5; + scene.physics.add.existing(this, false); + this.body.allowGravity = false; + this.body.checkCollision.down = false; + this.body.checkCollision.left = false; + this.body.checkCollision.right = false; + this.body.pushable = false; + this.body.setSize(80, 16, false); + + /* START-USER-CTR-CODE */ + // Write your code here. + this.enablePlatformMovement = false; + this.horizontalVelocity = 50; + this.minXPosition = 10; + this.maxXPosition = 200; + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + horizontalVelocity; + minXPosition; + maxXPosition; + enablePlatformMovement; + + update() { + if (!this.enablePlatformMovement) { + return; + } + + const velocity = this.body.velocity; + if (this.x < this.minXPosition) { + velocity.x = this.horizontalVelocity; + } else if (this.x > this.maxXPosition) { + velocity.x = this.horizontalVelocity * -1; + } + } + + startPlatformMovement() { + this.body.velocity.x = this.horizontalVelocity; + this.enablePlatformMovement = true; + } + + stopPlatformMovement() { + this.body.velocity.x = 0; + this.enablePlatformMovement = false; + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/PlayerPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/PlayerPrefab.js new file mode 100755 index 00000000..9f285cd0 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/PlayerPrefab.js @@ -0,0 +1,34 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class PlayerPrefab extends Phaser.Physics.Arcade.Sprite { + + constructor(scene, x, y, texture, frame) { + super(scene, x ?? 0, y ?? 0, texture || "player", frame ?? "player-idle-1.png"); + + scene.physics.add.existing(this, false); + this.body.checkCollision.up = false; + this.body.setOffset(35, 20); + this.body.setSize(11, 44, false); + this.play("playerIdle"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/prefabs/WallPrefab.js b/hugo-site/static/games/infinite-jumper/src/prefabs/WallPrefab.js new file mode 100755 index 00000000..ffb00074 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/prefabs/WallPrefab.js @@ -0,0 +1,38 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class WallPrefab extends Phaser.GameObjects.TileSprite { + + constructor(scene, x, y, width, height, texture, frame) { + super(scene, x ?? 0, y ?? 0, width ?? 32, height ?? 176, texture || "wall", frame); + + this.setOrigin(0, 0); + + /* START-USER-CTR-CODE */ + // Write your code here. + this.setScrollFactor(0); + /** @type {Phaser.Scene} */ + const _scene = scene; + _scene.physics.world.enable(this); + this.body.setImmovable(true).setAllowGravity(false).setSize(16, this.height).setOffset(0, 0); + /* END-USER-CTR-CODE */ + } + + /** @type {number} */ + tileOffsetY = 0; + + /* START-USER-CODE */ + + // Write your code here. + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scenes/GameOver.js b/hugo-site/static/games/infinite-jumper/src/scenes/GameOver.js new file mode 100755 index 00000000..2a241f46 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scenes/GameOver.js @@ -0,0 +1,95 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import OnAwakeActionScript from "../scriptnodes/utils/OnAwakeActionScript.js"; +import FadeEffectCameraActionScript from "../scriptnodes/camera/FadeEffectCameraActionScript.js"; +import TimeEventActionScript from "../scriptnodes/timer/TimeEventActionScript.js"; +import StartSceneActionScript from "../scriptnodes/scene/StartSceneActionScript.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class GameOver extends Phaser.Scene { + + constructor() { + super("GameOver"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @returns {void} */ + editorCreate() { + + // gameOverTextGameObject + const gameOverTextGameObject = this.add.text(30, 39, "", {}); + gameOverTextGameObject.text = "Game Over"; + gameOverTextGameObject.setStyle({ "fontFamily": "PressStart2P-Regular", "fontSize": "20px" }); + + // scoreTextGameObject + const scoreTextGameObject = this.add.text(95, 97, "", {}); + scoreTextGameObject.text = "Score"; + scoreTextGameObject.setStyle({ "fontFamily": "PressStart2P-Regular", "fontSize": "10px" }); + + // scoreValueTextGameObject + const scoreValueTextGameObject = this.add.text(120, 122, "", {}); + scoreValueTextGameObject.setOrigin(0.5, 0.5); + scoreValueTextGameObject.text = "0"; + scoreValueTextGameObject.setStyle({ "fontFamily": "PressStart2P-Regular", "fontSize": "10px" }); + + // onAwakeActionScript + const onAwakeActionScript = new OnAwakeActionScript(this); + + // fadeEffectCameraActionScript + const fadeEffectCameraActionScript = new FadeEffectCameraActionScript(onAwakeActionScript); + + // timeEventActionScript + const timeEventActionScript = new TimeEventActionScript(onAwakeActionScript); + + // fadeEffectCameraActionScript_1 + const fadeEffectCameraActionScript_1 = new FadeEffectCameraActionScript(timeEventActionScript); + + // startSceneActionScript + const startSceneActionScript = new StartSceneActionScript(fadeEffectCameraActionScript_1); + + // fadeEffectCameraActionScript (prefab fields) + fadeEffectCameraActionScript.duration = 500; + fadeEffectCameraActionScript.fadeEvent = "camerafadeincomplete"; + + // timeEventActionScript (prefab fields) + timeEventActionScript.delay = 3000; + + // fadeEffectCameraActionScript_1 (prefab fields) + fadeEffectCameraActionScript_1.duration = 500; + fadeEffectCameraActionScript_1.fadeEvent = "camerafadeoutcomplete"; + + // startSceneActionScript (prefab fields) + startSceneActionScript.sceneKey = "Title"; + + this.scoreValueTextGameObject = scoreValueTextGameObject; + + this.events.emit("scene-awake"); + } + + /** @type {Phaser.GameObjects.Text} */ + scoreValueTextGameObject; + + /* START-USER-CODE */ + + // Write your code here + + create() { + + this.editorCreate(); + const score = this.registry.get('score'); + this.scoreValueTextGameObject.setText(score); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scenes/Level.js b/hugo-site/static/games/infinite-jumper/src/scenes/Level.js new file mode 100755 index 00000000..9ddea392 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scenes/Level.js @@ -0,0 +1,247 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import BackgroundPrefab from "../prefabs/BackgroundPrefab.js"; +import ForegroundPrefab from "../prefabs/ForegroundPrefab.js"; +import WallPrefab from "../prefabs/WallPrefab.js"; +import PlayerPrefab from "../prefabs/PlayerPrefab.js"; +import PlatformGroupPrefab from "../prefabs/PlatformGroupPrefab.js"; +import OnAwakeActionScript from "../scriptnodes/utils/OnAwakeActionScript.js"; +import FadeEffectCameraActionScript from "../scriptnodes/camera/FadeEffectCameraActionScript.js"; +import LaunchSceneActionScript from "../scriptnodes/scene/LaunchSceneActionScript.js"; +import TimeEventActionScript from "../scriptnodes/timer/TimeEventActionScript.js"; +import StartSceneActionScript from "../scriptnodes/scene/StartSceneActionScript.js"; +import StopSceneActionScript from "../scriptnodes/scene/StopSceneActionScript.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class Level extends Phaser.Scene { + + constructor() { + super("Level"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @returns {void} */ + editorCreate() { + + // leftKeyboardKey + const leftKeyboardKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.LEFT); + + // rightKeyboardKey + const rightKeyboardKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.RIGHT); + + // levelLayer + const levelLayer = this.add.layer(); + + // backgroundPrefab + const backgroundPrefab = new BackgroundPrefab(this, 0, 0); + levelLayer.add(backgroundPrefab); + + // foregroundPrefab + const foregroundPrefab = new ForegroundPrefab(this, 0, 0); + levelLayer.add(foregroundPrefab); + + // leftWallTileSprite + const leftWallTileSprite = new WallPrefab(this, 0, 0); + levelLayer.add(leftWallTileSprite); + + // rightWallTileSprite + const rightWallTileSprite = new WallPrefab(this, 208, 0); + rightWallTileSprite.flipX = true; + rightWallTileSprite.flipY = false; + levelLayer.add(rightWallTileSprite); + + // playerLayer + const playerLayer = this.add.layer(); + + // player + const player = new PlayerPrefab(this, 120, -84); + playerLayer.add(player); + + // platformGroupPrefab + const platformGroupPrefab = new PlatformGroupPrefab(this); + this.add.existing(platformGroupPrefab); + + // onAwakeActionScript + const onAwakeActionScript = new OnAwakeActionScript(this); + + // fadeEffectCameraActionScript_1 + const fadeEffectCameraActionScript_1 = new FadeEffectCameraActionScript(onAwakeActionScript); + + // launchSceneActionScript + const launchSceneActionScript = new LaunchSceneActionScript(fadeEffectCameraActionScript_1); + + // timeEventActionScriptForSceneTransition + const timeEventActionScriptForSceneTransition = new TimeEventActionScript(this); + + // fadeEffectCameraActionScript + const fadeEffectCameraActionScript = new FadeEffectCameraActionScript(timeEventActionScriptForSceneTransition); + + // startSceneActionScript + const startSceneActionScript = new StartSceneActionScript(fadeEffectCameraActionScript); + + // stopSceneActionScript + const stopSceneActionScript = new StopSceneActionScript(timeEventActionScriptForSceneTransition); + + // lists + const movingLevelTileSprites = [rightWallTileSprite, leftWallTileSprite, foregroundPrefab]; + const walls = [leftWallTileSprite, rightWallTileSprite]; + + // playerWithPlatformsCollider + this.physics.add.collider(player, platformGroupPrefab.group); + + // playerWIthWallsCollider + this.physics.add.collider(player, walls); + + // rightWallTileSprite (prefab fields) + rightWallTileSprite.tileOffsetY = -120; + + // fadeEffectCameraActionScript_1 (prefab fields) + fadeEffectCameraActionScript_1.duration = 500; + fadeEffectCameraActionScript_1.fadeEvent = "camerafadeincomplete"; + + // launchSceneActionScript (prefab fields) + launchSceneActionScript.sceneKey = "UI"; + + // fadeEffectCameraActionScript (prefab fields) + fadeEffectCameraActionScript.duration = 500; + fadeEffectCameraActionScript.fadeEvent = "camerafadeoutcomplete"; + + // startSceneActionScript (prefab fields) + startSceneActionScript.sceneKey = "GameOver"; + + // stopSceneActionScript (prefab fields) + stopSceneActionScript.sceneKey = "UI"; + + this.player = player; + this.platformGroupPrefab = platformGroupPrefab; + this.timeEventActionScriptForSceneTransition = timeEventActionScriptForSceneTransition; + this.leftKeyboardKey = leftKeyboardKey; + this.rightKeyboardKey = rightKeyboardKey; + this.movingLevelTileSprites = movingLevelTileSprites; + this.walls = walls; + + this.events.emit("scene-awake"); + } + + /** @type {PlayerPrefab} */ + player; + /** @type {PlatformGroupPrefab} */ + platformGroupPrefab; + /** @type {TimeEventActionScript} */ + timeEventActionScriptForSceneTransition; + /** @type {Phaser.Input.Keyboard.Key} */ + leftKeyboardKey; + /** @type {Phaser.Input.Keyboard.Key} */ + rightKeyboardKey; + /** @type {Array} */ + movingLevelTileSprites; + /** @type {WallPrefab[]} */ + walls; + + /* START-USER-CODE */ + firstJumpMade = false; + isGameOver = false; + currentScore = 0; + maxHeight = 0; + startingMaxHeight = 0; + level = 0; + + // Write more your code here + + create() { + + this.editorCreate(); + this.cameras.main.startFollow(this.player, false, 0.1, 1, 0.1); + this.cameras.main.setDeadzone(this.scale.width); + this.firstJumpMade = false; + this.isGameOver = false; + this.currentScore = 0; + this.maxHeight = 0; + this.startingMaxHeight = 0; + this.level = 0; + } + + update() { + const distance = Math.floor(Math.abs(this.player.body.bottom)); + const isTouchingDown = this.player.body.touching.down; + if (isTouchingDown) { + this.player.play("playerJump"); + this.player.once(Phaser.Animations.Events.ANIMATION_COMPLETE_KEY + "playerJump", () => { + this.player.play("playerSpin"); + }); + this.player.setVelocityY(-350); + if (!this.firstJumpMade) { + this.firstJumpMade = true; + this.startingMaxHeight = distance; + } + } + + if (this.leftKeyboardKey.isDown && !isTouchingDown && this.firstJumpMade && !this.isGameOver) { + this.player.setVelocityX(-150); + this.player.setFlipX(true); + } else if (this.rightKeyboardKey.isDown && !isTouchingDown && this.firstJumpMade && !this.isGameOver) { + this.player.setVelocityX(150); + this.player.setFlipX(false); + } else { + this.player.setVelocityX(0); + } + + this.movingLevelTileSprites.forEach((tileSprite) => { + tileSprite.tilePositionY = this.player.y * 0.2 + (tileSprite.tileOffsetY || 0); + }); + + this.walls.forEach((tileSprite) => { + if (tileSprite.flipX) { + tileSprite.body.setOffset(16, this.cameras.main.worldView.y); + } else { + tileSprite.body.setOffset(0, this.cameras.main.worldView.y); + } + }); + + if (this.isGameOver) { + this.player.setVelocityY(15); + return; + } + if (distance > this.maxHeight && this.firstJumpMade) { + this.maxHeight = distance; + this.currentScore = Math.floor((this.maxHeight - this.startingMaxHeight) / 10); + this.scene.get("UI").updateScoreText(this.currentScore); + + if (this.level === 0 && this.currentScore > 200) { + this.platformGroupPrefab.enableMovingPlatforms = true; + } + } + + if (this.player.y > this.platformGroupPrefab.bottomMostPlatformYPosition + 50) { + this.isGameOver = true; + this.player.play("playerHurt"); + this.player.setVelocityY(15); + const wipeFx = this.player.postFX.addWipe(0.1, 0, 1); + this.tweens.add({ + targets: wipeFx, + progress: 1, + duration: 3000, + onComplete: () => { + this.player.body.enable = false; + this.registry.set('score', this.currentScore); + this.timeEventActionScriptForSceneTransition.execute(); + } + }); + } + + this.platformGroupPrefab.update(); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scenes/Preload.js b/hugo-site/static/games/infinite-jumper/src/scenes/Preload.js new file mode 100644 index 00000000..da2ec355 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scenes/Preload.js @@ -0,0 +1,81 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class Preload extends Phaser.Scene { + + constructor() { + super("Preload"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @returns {void} */ + editorPreload() { + + this.load.pack("asset-pack", "assets/asset-pack.json"); + } + + /** @returns {void} */ + editorCreate() { + + // progressBar + const progressBar = this.add.rectangle(553, 361, 256, 20); + progressBar.setOrigin(0, 0); + progressBar.isFilled = true; + progressBar.fillColor = 14737632; + + // progressBarBg + const progressBarBg = this.add.rectangle(553.0120849609375, 361, 256, 20); + progressBarBg.setOrigin(0, 0); + progressBarBg.fillColor = 14737632; + progressBarBg.isStroked = true; + + // loadingText + const loadingText = this.add.text(552.0120849609375, 329, "", {}); + loadingText.text = "Loading..."; + loadingText.setStyle({ "color": "#e0e0e0", "fontFamily": "arial", "fontSize": "20px" }); + + this.progressBar = progressBar; + + this.events.emit("scene-awake"); + } + + /** @type {Phaser.GameObjects.Rectangle} */ + progressBar; + + /* START-USER-CODE */ + + // Write your code here + + preload() { + + this.editorCreate(); + + this.editorPreload(); + + const width = this.progressBar.width; + + this.load.on("progress", (progress) => { + + this.progressBar.width = progress * width; + }); + } + + create() { + + this.scene.start("Title"); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scenes/Title.js b/hugo-site/static/games/infinite-jumper/src/scenes/Title.js new file mode 100755 index 00000000..f111d3b5 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scenes/Title.js @@ -0,0 +1,181 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import BackgroundPrefab from "../prefabs/BackgroundPrefab.js"; +import ForegroundPrefab from "../prefabs/ForegroundPrefab.js"; +import WallPrefab from "../prefabs/WallPrefab.js"; +import PlayerPrefab from "../prefabs/PlayerPrefab.js"; +import OnAwakeActionScript from "../scriptnodes/utils/OnAwakeActionScript.js"; +import FadeEffectCameraActionScript from "../scriptnodes/camera/FadeEffectCameraActionScript.js"; +import TweenActionScript from "../scriptnodes/animation/TweenActionScript.js"; +import SceneOnPointerDownActionScript from "../scriptnodes/scene/SceneOnPointerDownActionScript.js"; +import CallbackActionScript from "../scriptnodes/utils/CallbackActionScript.js"; +import TimeEventActionScript from "../scriptnodes/timer/TimeEventActionScript.js"; +import StartSceneActionScript from "../scriptnodes/scene/StartSceneActionScript.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class Title extends Phaser.Scene { + + constructor() { + super("Title"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @returns {void} */ + editorCreate() { + + // levelLayer + const levelLayer = this.add.layer(); + + // backgroundPrefab + const backgroundPrefab = new BackgroundPrefab(this, 0, 0); + levelLayer.add(backgroundPrefab); + + // foregroundPrefab + const foregroundPrefab = new ForegroundPrefab(this, 0, 0); + levelLayer.add(foregroundPrefab); + + // leftWallTileSprite + const leftWallTileSprite = new WallPrefab(this, 0, 0); + levelLayer.add(leftWallTileSprite); + + // rightWallTileSprite + const rightWallTileSprite = new WallPrefab(this, 208, 0); + rightWallTileSprite.flipX = true; + rightWallTileSprite.flipY = false; + rightWallTileSprite.tilePositionX = 0; + rightWallTileSprite.tilePositionY = -120; + levelLayer.add(rightWallTileSprite); + + // ground + const ground = this.add.image(0, 144, "ground"); + ground.setOrigin(0, 0); + levelLayer.add(ground); + + // playerLayer + const playerLayer = this.add.layer(); + + // player + const player = new PlayerPrefab(this, 120, 136); + playerLayer.add(player); + + // titleTextGameObject + const titleTextGameObject = this.add.text(32, 15, "", {}); + titleTextGameObject.text = "Warped Cave\nEscape"; + titleTextGameObject.setStyle({ "align": "center", "color": "#00ace1ff", "fontFamily": "PressStart2P-Regular", "stroke": "#00ffff", "shadow.offsetX": 3, "shadow.offsetY": 1, "shadow.stroke": true, "shadow.fill": true }); + titleTextGameObject.setLineSpacing(3); + + // clickToPlayTextGameObject + const clickToPlayTextGameObject = this.add.text(68, 81, "", {}); + clickToPlayTextGameObject.text = "Click to Play"; + clickToPlayTextGameObject.setStyle({ "color": "#59006eff", "fontFamily": "PressStart2P-Regular", "fontSize": "8px", "stroke": "#000000" }); + + // onAwakeActionScript + const onAwakeActionScript = new OnAwakeActionScript(this); + + // fadeEffectCameraActionScript + const fadeEffectCameraActionScript = new FadeEffectCameraActionScript(onAwakeActionScript); + + // tweenActionScript + const tweenActionScript = new TweenActionScript(onAwakeActionScript); + + // sceneOnPointerDownActionScript + const sceneOnPointerDownActionScript = new SceneOnPointerDownActionScript(onAwakeActionScript); + + // callbackActionScript + const callbackActionScript = new CallbackActionScript(sceneOnPointerDownActionScript); + + // timeEventActionScriptForSceneTransition + const timeEventActionScriptForSceneTransition = new TimeEventActionScript(this); + + // fadeEffectCameraActionScript_1 + const fadeEffectCameraActionScript_1 = new FadeEffectCameraActionScript(timeEventActionScriptForSceneTransition); + + // startSceneActionScript + const startSceneActionScript = new StartSceneActionScript(fadeEffectCameraActionScript_1); + + // rightWallTileSprite (prefab fields) + rightWallTileSprite.tileOffsetY = -120; + + // fadeEffectCameraActionScript (prefab fields) + fadeEffectCameraActionScript.duration = 500; + fadeEffectCameraActionScript.fadeEvent = "camerafadeincomplete"; + + // tweenActionScript (prefab fields) + tweenActionScript.target = clickToPlayTextGameObject; + tweenActionScript.duration = 1200; + tweenActionScript.yoyo = true; + tweenActionScript.repeat = -1; + tweenActionScript.delay = 500; + tweenActionScript.loopDelay = 500; + tweenActionScript.tweenProperty = "alpha"; + tweenActionScript.tweenPropertyValue = 0.2; + + // sceneOnPointerDownActionScript (prefab fields) + sceneOnPointerDownActionScript.once = true; + + // callbackActionScript (prefab fields) + callbackActionScript.callback = () => { this.startGame(); }; + + // fadeEffectCameraActionScript_1 (prefab fields) + fadeEffectCameraActionScript_1.duration = 500; + fadeEffectCameraActionScript_1.fadeEvent = "camerafadeoutcomplete"; + + // startSceneActionScript (prefab fields) + startSceneActionScript.sceneKey = "Level"; + + this.player = player; + this.timeEventActionScriptForSceneTransition = timeEventActionScriptForSceneTransition; + + this.events.emit("scene-awake"); + } + + /** @type {PlayerPrefab} */ + player; + /** @type {TimeEventActionScript} */ + timeEventActionScriptForSceneTransition; + + /* START-USER-CODE */ + + // Write your code here + glowTween; + + create() { + + this.editorCreate(); + this.player.body.enable = false; + const glowFx = this.player.postFX.addGlow(0x00ffff, 1, 0, false, 0.1, 5); + this.glowTween = this.tweens.add({ + targets: glowFx, + outerStrength: 4, + duration: 800, + yoyo: true, + repeat: -1 + }); + } + + startGame() { + this.player.stop(); + this.player.setFrame("player-duck.png"); + this.time.delayedCall(1000, () => { + this.player.play("playerIdle"); + this.glowTween.destroy(); + this.player.postFX.clear(); + this.player.body.enable = true; + this.player.body.velocity.y = -1000; + this.timeEventActionScriptForSceneTransition.execute(); + }); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scenes/UI.js b/hugo-site/static/games/infinite-jumper/src/scenes/UI.js new file mode 100755 index 00000000..dfead71a --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scenes/UI.js @@ -0,0 +1,54 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class UI extends Phaser.Scene { + + constructor() { + super("UI"); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @returns {void} */ + editorCreate() { + + // scoreTextGameObject + const scoreTextGameObject = this.add.text(235, 5, "", {}); + scoreTextGameObject.setOrigin(1, 0); + scoreTextGameObject.text = "0"; + scoreTextGameObject.setStyle({ "fontFamily": "PressStart2P-Regular" }); + + this.scoreTextGameObject = scoreTextGameObject; + + this.events.emit("scene-awake"); + } + + /** @type {Phaser.GameObjects.Text} */ + scoreTextGameObject; + + /* START-USER-CODE */ + + // Write your code here + + create() { + + this.editorCreate(); + } + + updateScoreText(text) { + this.scoreTextGameObject.setText(text); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/animation/TweenActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/animation/TweenActionScript.js new file mode 100644 index 00000000..8af370c6 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/animation/TweenActionScript.js @@ -0,0 +1,65 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class TweenActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {Phaser.GameObjects.GameObject} */ + target; + /** @type {number} */ + duration = 0; + /** @type {boolean} */ + yoyo = false; + /** @type {number} */ + repeat = 0; + /** @type {number} */ + delay = 0; + /** @type {number} */ + loopDelay = 0; + /** @type {string} */ + tweenProperty = ""; + /** @type {any} */ + tweenPropertyValue; + + /* START-USER-CODE */ + /** @type {Phaser.Tweens.Tween} */ + tween; + + // Write your code here. + execute(...args) { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + + this.tween = _scene.tweens.add({ + targets: this.target, + duration: this.duration, + yoyo: this.yoyo, + repeat: this.repeat, + delay: this.delay, + loopDelay: this.loopDelay, + [this.tweenProperty]: this.tweenPropertyValue, + onComplete: () => { + this.executeChildren(args); + } + }); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/camera/FadeEffectCameraActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/camera/FadeEffectCameraActionScript.js new file mode 100644 index 00000000..bfe46023 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/camera/FadeEffectCameraActionScript.js @@ -0,0 +1,50 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class FadeEffectCameraActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {number} */ + duration = 1000; + /** @type {"camerafadeincomplete"|"camerafadeoutcomplete"} */ + fadeEvent = "camerafadeincomplete"; + + /* START-USER-CODE */ + + // Write your code here. + execute() { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + const camera = _scene.cameras.main; + if (this.fadeEvent === "camerafadeincomplete") { + camera.once(Phaser.Cameras.Scene2D.Events.FADE_IN_COMPLETE, () => { + this.executeChildren(); + }) + camera.fadeIn(this.duration, 0, 0, 0); + return; + } + camera.once(Phaser.Cameras.Scene2D.Events.FADE_OUT_COMPLETE, () => { + this.executeChildren(); + }) + camera.fadeOut(this.duration, 0, 0, 0); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/PlaySpriteAnimationActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/PlaySpriteAnimationActionScript.js new file mode 100644 index 00000000..28bd4350 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/PlaySpriteAnimationActionScript.js @@ -0,0 +1,23 @@ +// You can write more code here +/* START OF COMPILED CODE */ +import ScriptNode from "../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ +export default class PlaySpriteAnimationActionScript extends ScriptNode { + constructor(parent) { + super(parent); + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + animationKey = ""; + ignoreIfPlaying = false; + /* START-USER-CODE */ + execute(...args) { + const obj = this.getActionTargetObject(args); + obj.once("animationcomplete-" + this.animationKey, () => this.executeChildren(...args)); + obj.play(this.animationKey, this.ignoreIfPlaying); + } +} +/* END OF COMPILED CODE */ +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/UpdateTextureActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/UpdateTextureActionScript.js new file mode 100644 index 00000000..5709ef6d --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/gameobject/UpdateTextureActionScript.js @@ -0,0 +1,41 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class UpdateTextureActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {{key:string,frame?:string|number}} */ + textureConfig; + + /* START-USER-CODE */ + + // Write your code here. + execute() { + if (this.gameObject === undefined) { + return; + } + if (this.textureConfig === undefined) { + return; + } + this.gameObject.setTexture(this.textureConfig.key); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/LaunchSceneActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/LaunchSceneActionScript.js new file mode 100644 index 00000000..2c10084a --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/LaunchSceneActionScript.js @@ -0,0 +1,37 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class LaunchSceneActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {string} */ + sceneKey = ""; + + /* START-USER-CODE */ + + // Write your code here. + execute() { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + _scene.scene.launch(this.sceneKey); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/SceneOnPointerDownActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/SceneOnPointerDownActionScript.js new file mode 100644 index 00000000..9164a550 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/SceneOnPointerDownActionScript.js @@ -0,0 +1,48 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class SceneOnPointerDownActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {boolean} */ + once = false; + + /* START-USER-CODE */ + + // Write your code here. + execute(...args) { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + + const eventName = Phaser.Input.Events.POINTER_DOWN; + if (this.once) { + _scene.input.once(eventName, () => { + this.executeChildren(); + }); + return; + } + + _scene.input.on(eventName, () => { + this.executeChildren(); + }); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StartSceneActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StartSceneActionScript.js new file mode 100644 index 00000000..ab097616 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StartSceneActionScript.js @@ -0,0 +1,37 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class StartSceneActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {string} */ + sceneKey = ""; + + /* START-USER-CODE */ + + // Write your code here. + execute() { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + _scene.scene.start(this.sceneKey); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StopSceneActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StopSceneActionScript.js new file mode 100644 index 00000000..74d8dcd7 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/scene/StopSceneActionScript.js @@ -0,0 +1,37 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class StopSceneActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {string} */ + sceneKey = ""; + + /* START-USER-CODE */ + + // Write your code here. + execute() { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + _scene.scene.stop(this.sceneKey); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/timer/TimeEventActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/timer/TimeEventActionScript.js new file mode 100644 index 00000000..7f0b12b9 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/timer/TimeEventActionScript.js @@ -0,0 +1,47 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class TimeEventActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /** @type {number} */ + delay = 1000; + /** @type {number} */ + repeat = 0; + /** @type {boolean} */ + loop = false; + + /* START-USER-CODE */ + + // Write your code here. + execute(...args) { + /** @type {Phaser.Scene} */ + const _scene = this.scene; + _scene.time.addEvent({ + delay: this.delay, + loop: this.loop, + callback: () => { + this.executeChildren(args); + }, + repeat: this.repeat, + }); + } + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/CallbackActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/CallbackActionScript.js new file mode 100644 index 00000000..e270cfc8 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/CallbackActionScript.js @@ -0,0 +1,35 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class CallbackActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + callback; + /* START-USER-CODE */ + + // Write your code here. + execute(...args) { + if (this.callback) { + this.callback(...args); + } + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here diff --git a/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/OnAwakeActionScript.js b/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/OnAwakeActionScript.js new file mode 100644 index 00000000..a2dbca08 --- /dev/null +++ b/hugo-site/static/games/infinite-jumper/src/scriptnodes/utils/OnAwakeActionScript.js @@ -0,0 +1,32 @@ + +// You can write more code here + +/* START OF COMPILED CODE */ + +import ScriptNode from "../../../phaserjs_editor_scripts_base/ScriptNode.js"; +/* START-USER-IMPORTS */ +/* END-USER-IMPORTS */ + +export default class OnAwakeActionScript extends ScriptNode { + + constructor(parent) { + super(parent); + + /* START-USER-CTR-CODE */ + // Write your code here. + /* END-USER-CTR-CODE */ + } + + /* START-USER-CODE */ + + // Write your code here. + awake() { + this.executeChildren(); + } + + /* END-USER-CODE */ +} + +/* END OF COMPILED CODE */ + +// You can write more code here