├── dist ├── map.png ├── monogram.ttf ├── spritesheet.png ├── index.html └── map.json ├── public ├── map.png ├── monogram.ttf ├── spritesheet.png └── map.json ├── developerportfoliothumbnail.png ├── newdeveloperportfoliothumbnail.png ├── vite.config.js ├── src ├── kaboomCtx.js ├── utils.js ├── constants.js └── main.js ├── .gitignore ├── package.json ├── HOW_TO_DEPLOY.MD ├── LICENSE ├── README.MD └── index.html /dist/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/dist/map.png -------------------------------------------------------------------------------- /public/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/public/map.png -------------------------------------------------------------------------------- /dist/monogram.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/dist/monogram.ttf -------------------------------------------------------------------------------- /dist/spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/dist/spritesheet.png -------------------------------------------------------------------------------- /public/monogram.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/public/monogram.ttf -------------------------------------------------------------------------------- /public/spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/public/spritesheet.png -------------------------------------------------------------------------------- /developerportfoliothumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/developerportfoliothumbnail.png -------------------------------------------------------------------------------- /newdeveloperportfoliothumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSLegendDev/2d-portfolio-kaboom/HEAD/newdeveloperportfoliothumbnail.png -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | export default defineConfig({ 4 | base: "./", 5 | build: { 6 | minify: "terser", 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /src/kaboomCtx.js: -------------------------------------------------------------------------------- 1 | import kaboom from "kaboom"; 2 | import { scaleFactor } from "./constants"; 3 | 4 | export const k = kaboom({ 5 | global: false, 6 | touchToMouse: true, 7 | canvas: document.getElementById("game"), 8 | debug: false, // set to false once ready for production 9 | }); 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "2d-portfolio-kaboom", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "terser": "^5.27.1", 13 | "vite": "^5.1.0" 14 | }, 15 | "dependencies": { 16 | "kaboom": "^3000.1.17" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /HOW_TO_DEPLOY.MD: -------------------------------------------------------------------------------- 1 | # How to deploy the project (on GitHub pages) 2 | 3 | There are 2 methods. 4 | 5 | ## Method 1: Using Github Actions 6 | 7 | 1. Update `vite.config.js` base property to match the name of the repository. For example, `base: "/2d-portfolio-kaboom"` 8 | 9 | 2. Navigate to the repository settings on GitHub and configure GitHub pages to use GitHub Actions by creating a custom workflow. Read [this](https://vitejs.dev/guide/static-deploy#github-pages) for more info. 10 | 11 | 3. After setting up the custom workflow, go to the Actions tab within the repository. From there, select the workflow you created in step 2 and trigger the deployment process. 12 | 13 | 4. The portfolio should now be live and accessible through GitHub pages. 14 | 15 | ## Method 2: Using Another Repository 16 | 17 | 1. Run `npm run build`. 18 | 2. Take the resulting content of the `dist` folder and put it in a new GitHub repository. 19 | 3. Activate GitHub pages in your new repository's settings. 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 JSLegend 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Developer portfolio that's a 2D game 2 | 3 | Inspired by the many creative 3D developer portfolios, I create one that's 2D instead. 4 | This is meant as a template that you can use to build your own. It works on both desktop 5 | and mobile. 6 | 7 | ![A screenshot of the project](./developerportfoliothumbnail.png) 8 | 9 | Live Demo : https://jslegenddev.github.io/portfolio/ 10 | 11 | Watch the tutorial I made on how to build this on YouTube : https://www.youtube.com/watch?v=gwtfWORCN0U 12 | 13 | I used a modified version of this original tileset (Giving credit where it's due) : https://momen-games.itch.io/happy-la-v2-ts 14 | 15 | # How to run 16 | 17 | Note: You need `Node.js` and `npm` installed on your machine. 18 | 19 | `npm install` then `npm run dev` 20 | 21 | # How to build 22 | 23 | `npm run build` and a dist folder should be created. 24 | 25 | # How to preview the build 26 | 27 | `npm run preview` 28 | 29 | # How to host? 30 | 31 | Here is a [guide](HOW_TO_DEPLOY.MD). 32 | 33 | # NEW! I made a new developer portfolio as a 2D game! 34 | 35 | ![A screenshot of the project](./newdeveloperportfoliothumbnail.png) 36 | 37 | Check out the new tutorial here : https://www.youtube.com/watch?v=OejpBl2s9OY 38 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | export function displayDialogue(text, onDisplayEnd) { 2 | const dialogueUI = document.getElementById("textbox-container"); 3 | const dialogue = document.getElementById("dialogue"); 4 | 5 | dialogueUI.style.display = "block"; 6 | let index = 0; 7 | let currentText = ""; 8 | const intervalRef = setInterval(() => { 9 | if (index < text.length) { 10 | currentText += text[index]; 11 | dialogue.innerHTML = currentText; 12 | index++; 13 | return; 14 | } 15 | 16 | clearInterval(intervalRef); 17 | }, 1); 18 | 19 | const closeBtn = document.getElementById("close"); 20 | 21 | function onCloseBtnClick() { 22 | onDisplayEnd(); 23 | dialogueUI.style.display = "none"; 24 | dialogue.innerHTML = ""; 25 | clearInterval(intervalRef); 26 | closeBtn.removeEventListener("click", onCloseBtnClick); 27 | } 28 | 29 | closeBtn.addEventListener("click", onCloseBtnClick); 30 | 31 | addEventListener("keypress", (key) => { 32 | if (key.code === "Enter") { 33 | closeBtn.click(); 34 | } 35 | }); 36 | } 37 | 38 | export function setCamScale(k) { 39 | const resizeFactor = k.width() / k.height(); 40 | if (resizeFactor < 1) { 41 | k.camScale(k.vec2(1)); 42 | } else { 43 | k.camScale(k.vec2(1.5)); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | export const scaleFactor = 4; 2 | 3 | export const dialogueData = { 4 | pc: `This is my PC. I work mostly in JavaScript/TypeScript these days. 5 | I've made a couple of games in that language. I also like Golang and Python. Anyway regardless of the language, I just like programming. 6 | Here is my Github!`, 7 | "cs-degree": `This is my CS degree. I hung it on the wall because I'm proud of it. It was a very theoretical degree but I think it gave me a good foundation.`, 8 | "sofa-table": `That's my sofa. I like to relax here and watch YouTube. 9 | I also make game programming tutorials on YouTube. Go sub to my channel! (If you like the content) 10 | You'll learn how I built this portfolio you're currently playing through!`, 11 | tv: `That's my TV. I've been watching tech youtubers a lot recently like : 12 | Theprimeagen, Theo - t3.gg, 13 | PirateSoftware (sometimes) and Melkey!`, 14 | bed: `This where I sleep. Great ideas comes when I'm lying on my bed. When an idea strikes, I often have to write it down or else I won't be able to sleep because my mental energy is consumed by it.`, 15 | resume: `This is my desk and on it is my resume. Check it out? 16 | Contact me at jslegend@protonmail.com if you have any interesting job opportunities!`, 17 | projects: `Info about this portfolio : It's made with the Kaboom.js library which is a library for making games in JavaScript. 18 | Text is rendered with HTML/CSS. So the textbox you're currently reading is not rendered within canvas. Learn more about how to use 19 | Kaboom.js by watching some of my tutorials here.`, 20 | library: `There are a lot of programming books on my shelves. There is even one in French (I also speak French btw). 21 | I probably only read one of them. Who else compulsively buys technical books without ever finishing them?`, 22 | exit: `If you want to exit JSLegendDev's portfolio, just close the tab.`, 23 | }; 24 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 75 |
76 |
77 |

Tap/Click around to move

78 | 79 | 87 |
88 | 89 |
90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 11 | 76 |
77 |
78 |

Tap/Click around to move

79 | 80 | 88 |
89 | 90 |
91 | 92 | 93 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { dialogueData, scaleFactor } from "./constants"; 2 | import { k } from "./kaboomCtx"; 3 | import { displayDialogue, setCamScale } from "./utils"; 4 | 5 | k.loadSprite("spritesheet", "./spritesheet.png", { 6 | sliceX: 39, 7 | sliceY: 31, 8 | anims: { 9 | "idle-down": 936, 10 | "walk-down": { from: 936, to: 939, loop: true, speed: 8 }, 11 | "idle-side": 975, 12 | "walk-side": { from: 975, to: 978, loop: true, speed: 8 }, 13 | "idle-up": 1014, 14 | "walk-up": { from: 1014, to: 1017, loop: true, speed: 8 }, 15 | }, 16 | }); 17 | 18 | k.loadSprite("map", "./map.png"); 19 | 20 | k.setBackground(k.Color.fromHex("#311047")); 21 | 22 | k.scene("main", async () => { 23 | const mapData = await (await fetch("./map.json")).json(); 24 | const layers = mapData.layers; 25 | 26 | const map = k.add([k.sprite("map"), k.pos(0), k.scale(scaleFactor)]); 27 | 28 | const player = k.make([ 29 | k.sprite("spritesheet", { anim: "idle-down" }), 30 | k.area({ 31 | shape: new k.Rect(k.vec2(0, 3), 10, 10), 32 | }), 33 | k.body(), 34 | k.anchor("center"), 35 | k.pos(), 36 | k.scale(scaleFactor), 37 | { 38 | speed: 250, 39 | direction: "down", 40 | isInDialogue: false, 41 | }, 42 | "player", 43 | ]); 44 | 45 | for (const layer of layers) { 46 | if (layer.name === "boundaries") { 47 | for (const boundary of layer.objects) { 48 | map.add([ 49 | k.area({ 50 | shape: new k.Rect(k.vec2(0), boundary.width, boundary.height), 51 | }), 52 | k.body({ isStatic: true }), 53 | k.pos(boundary.x, boundary.y), 54 | boundary.name, 55 | ]); 56 | 57 | if (boundary.name) { 58 | player.onCollide(boundary.name, () => { 59 | player.isInDialogue = true; 60 | displayDialogue( 61 | dialogueData[boundary.name], 62 | () => (player.isInDialogue = false) 63 | ); 64 | }); 65 | } 66 | } 67 | 68 | continue; 69 | } 70 | 71 | if (layer.name === "spawnpoints") { 72 | for (const entity of layer.objects) { 73 | if (entity.name === "player") { 74 | player.pos = k.vec2( 75 | (map.pos.x + entity.x) * scaleFactor, 76 | (map.pos.y + entity.y) * scaleFactor 77 | ); 78 | k.add(player); 79 | continue; 80 | } 81 | } 82 | } 83 | } 84 | 85 | setCamScale(k); 86 | 87 | k.onResize(() => { 88 | setCamScale(k); 89 | }); 90 | 91 | k.onUpdate(() => { 92 | k.camPos(player.worldPos().x, player.worldPos().y - 100); 93 | }); 94 | 95 | k.onMouseDown((mouseBtn) => { 96 | if (mouseBtn !== "left" || player.isInDialogue) return; 97 | 98 | const worldMousePos = k.toWorld(k.mousePos()); 99 | player.moveTo(worldMousePos, player.speed); 100 | 101 | const mouseAngle = player.pos.angle(worldMousePos); 102 | 103 | const lowerBound = 50; 104 | const upperBound = 125; 105 | 106 | if ( 107 | mouseAngle > lowerBound && 108 | mouseAngle < upperBound && 109 | player.curAnim() !== "walk-up" 110 | ) { 111 | player.play("walk-up"); 112 | player.direction = "up"; 113 | return; 114 | } 115 | 116 | if ( 117 | mouseAngle < -lowerBound && 118 | mouseAngle > -upperBound && 119 | player.curAnim() !== "walk-down" 120 | ) { 121 | player.play("walk-down"); 122 | player.direction = "down"; 123 | return; 124 | } 125 | 126 | if (Math.abs(mouseAngle) > upperBound) { 127 | player.flipX = false; 128 | if (player.curAnim() !== "walk-side") player.play("walk-side"); 129 | player.direction = "right"; 130 | return; 131 | } 132 | 133 | if (Math.abs(mouseAngle) < lowerBound) { 134 | player.flipX = true; 135 | if (player.curAnim() !== "walk-side") player.play("walk-side"); 136 | player.direction = "left"; 137 | return; 138 | } 139 | }); 140 | 141 | function stopAnims() { 142 | if (player.direction === "down") { 143 | player.play("idle-down"); 144 | return; 145 | } 146 | if (player.direction === "up") { 147 | player.play("idle-up"); 148 | return; 149 | } 150 | 151 | player.play("idle-side"); 152 | } 153 | 154 | k.onMouseRelease(stopAnims); 155 | 156 | k.onKeyRelease(() => { 157 | stopAnims(); 158 | }); 159 | k.onKeyDown((key) => { 160 | const keyMap = [ 161 | k.isKeyDown("right"), 162 | k.isKeyDown("left"), 163 | k.isKeyDown("up"), 164 | k.isKeyDown("down"), 165 | ]; 166 | 167 | let nbOfKeyPressed = 0; 168 | for (const key of keyMap) { 169 | if (key) { 170 | nbOfKeyPressed++; 171 | } 172 | } 173 | 174 | if (nbOfKeyPressed > 1) return; 175 | 176 | if (player.isInDialogue) return; 177 | if (keyMap[0]) { 178 | player.flipX = false; 179 | if (player.curAnim() !== "walk-side") player.play("walk-side"); 180 | player.direction = "right"; 181 | player.move(player.speed, 0); 182 | return; 183 | } 184 | 185 | if (keyMap[1]) { 186 | player.flipX = true; 187 | if (player.curAnim() !== "walk-side") player.play("walk-side"); 188 | player.direction = "left"; 189 | player.move(-player.speed, 0); 190 | return; 191 | } 192 | 193 | if (keyMap[2]) { 194 | if (player.curAnim() !== "walk-up") player.play("walk-up"); 195 | player.direction = "up"; 196 | player.move(0, -player.speed); 197 | return; 198 | } 199 | 200 | if (keyMap[3]) { 201 | if (player.curAnim() !== "walk-down") player.play("walk-down"); 202 | player.direction = "down"; 203 | player.move(0, player.speed); 204 | } 205 | }); 206 | }); 207 | 208 | k.go("main"); 209 | -------------------------------------------------------------------------------- /dist/map.json: -------------------------------------------------------------------------------- 1 | { "compressionlevel":-1, 2 | "height":13, 3 | "infinite":false, 4 | "layers":[ 5 | { 6 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 | 0, 0, 0, 0, 27, 28, 28, 28, 28, 28, 29, 0, 0, 0, 27, 28, 28, 28, 28, 28, 29, 0, 0, 0, 0, 0, 0, 11 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 12 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 13 | 0, 0, 0, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 14 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 15 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 17 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 19 | "height":13, 20 | "id":1, 21 | "name":"ground", 22 | "opacity":1, 23 | "type":"tilelayer", 24 | "visible":true, 25 | "width":27, 26 | "x":0, 27 | "y":0 28 | }, 29 | { 30 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34 | 0, 0, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 35 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 | 0, 0, 0, 0, 0, 302, 303, 303, 303, 304, 0, 0, 0, 0, 0, 0, 302, 303, 304, 0, 0, 0, 0, 0, 0, 0, 0, 37 | 0, 0, 0, 0, 0, 341, 342, 342, 342, 343, 0, 0, 0, 0, 0, 0, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 38 | 0, 0, 0, 0, 0, 380, 381, 381, 381, 382, 0, 0, 0, 0, 0, 0, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 39 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 381, 382, 0, 0, 0, 0, 0, 0, 0, 0, 40 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 43 | "height":13, 44 | "id":2, 45 | "name":"ground-2", 46 | "opacity":1, 47 | "type":"tilelayer", 48 | "visible":true, 49 | "width":27, 50 | "x":0, 51 | "y":0 52 | }, 53 | { 54 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58 | 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 229, 0, 0, 0, 347, 348, 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 386, 387, 0, 389, 0, 185, 188, 0, 0, 0, 0, 0, 0, 60 | 0, 0, 0, 0, 0, 0, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61 | 0, 0, 0, 0, 0, 0, 265, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62 | 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63 | 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 67 | "height":13, 68 | "id":3, 69 | "name":"props", 70 | "opacity":1, 71 | "type":"tilelayer", 72 | "visible":true, 73 | "width":27, 74 | "x":0, 75 | "y":0 76 | }, 77 | { 78 | "draworder":"topdown", 79 | "id":4, 80 | "name":"boundaries", 81 | "objects":[ 82 | { 83 | "height":48, 84 | "id":1, 85 | "name":"", 86 | "rotation":0, 87 | "type":"", 88 | "visible":true, 89 | "width":0, 90 | "x":48, 91 | "y":64 92 | }, 93 | { 94 | "height":16, 95 | "id":2, 96 | "name":"exit", 97 | "rotation":0, 98 | "type":"", 99 | "visible":true, 100 | "width":16, 101 | "x":32, 102 | "y":112 103 | }, 104 | { 105 | "height":32, 106 | "id":3, 107 | "name":"", 108 | "rotation":0, 109 | "type":"", 110 | "visible":true, 111 | "width":16, 112 | "x":48, 113 | "y":128 114 | }, 115 | { 116 | "height":16, 117 | "id":4, 118 | "name":"", 119 | "rotation":0, 120 | "type":"", 121 | "visible":true, 122 | "width":112, 123 | "x":64, 124 | "y":160 125 | }, 126 | { 127 | "height":15.9090909090909, 128 | "id":5, 129 | "name":"", 130 | "rotation":0, 131 | "type":"", 132 | "visible":true, 133 | "width":48, 134 | "x":176, 135 | "y":144.090909090909 136 | }, 137 | { 138 | "height":15.8181818181818, 139 | "id":6, 140 | "name":"", 141 | "rotation":0, 142 | "type":"", 143 | "visible":true, 144 | "width":16, 145 | "x":208, 146 | "y":160.181818181818 147 | }, 148 | { 149 | "height":48, 150 | "id":8, 151 | "name":"", 152 | "rotation":0, 153 | "type":"", 154 | "visible":true, 155 | "width":0, 156 | "x":208, 157 | "y":64 158 | }, 159 | { 160 | "height":14.6363636363636, 161 | "id":12, 162 | "name":"", 163 | "rotation":0, 164 | "type":"", 165 | "visible":true, 166 | "width":47.9090909090909, 167 | "x":176, 168 | "y":96 169 | }, 170 | { 171 | "height":16, 172 | "id":13, 173 | "name":"", 174 | "rotation":0, 175 | "type":"", 176 | "visible":true, 177 | "width":112, 178 | "x":224, 179 | "y":64 180 | }, 181 | { 182 | "height":80.0909090909091, 183 | "id":14, 184 | "name":"", 185 | "rotation":0, 186 | "type":"", 187 | "visible":true, 188 | "width":16, 189 | "x":336, 190 | "y":95.9090909090909 191 | }, 192 | { 193 | "height":16, 194 | "id":15, 195 | "name":"", 196 | "rotation":0, 197 | "type":"", 198 | "visible":true, 199 | "width":112, 200 | "x":224, 201 | "y":176 202 | }, 203 | { 204 | "height":16, 205 | "id":16, 206 | "name":"", 207 | "rotation":0, 208 | "type":"", 209 | "visible":true, 210 | "width":47.7840909090909, 211 | "x":64, 212 | "y":64 213 | }, 214 | { 215 | "height":32, 216 | "id":17, 217 | "name":"", 218 | "rotation":0, 219 | "type":"", 220 | "visible":true, 221 | "width":16, 222 | "x":48, 223 | "y":80 224 | }, 225 | { 226 | "height":16, 227 | "id":19, 228 | "name":"bed", 229 | "rotation":0, 230 | "type":"", 231 | "visible":true, 232 | "width":32, 233 | "x":304, 234 | "y":80 235 | }, 236 | { 237 | "height":17.4119318181818, 238 | "id":23, 239 | "name":"sofa-table", 240 | "rotation":0, 241 | "type":"", 242 | "visible":true, 243 | "width":27.5909090909091, 244 | "x":98.1157361660079, 245 | "y":98.4877717391304 246 | }, 247 | { 248 | "height":23.399209486166, 249 | "id":26, 250 | "name":"tv", 251 | "rotation":0, 252 | "type":"", 253 | "visible":true, 254 | "width":13.7391304347826, 255 | "x":113.130434782609, 256 | "y":136.600790513834 257 | }, 258 | { 259 | "height":22.8125, 260 | "id":29, 261 | "name":"pc", 262 | "rotation":0, 263 | "type":"", 264 | "visible":true, 265 | "width":13.875, 266 | "x":161, 267 | "y":72.0625 268 | }, 269 | { 270 | "height":14.117527173913, 271 | "id":30, 272 | "name":"cs-degree", 273 | "rotation":0, 274 | "type":"", 275 | "visible":true, 276 | "width":15.125, 277 | "x":112.375, 278 | "y":65.375 279 | }, 280 | { 281 | "height":0.125, 282 | "id":31, 283 | "name":"", 284 | "rotation":0, 285 | "type":"", 286 | "visible":true, 287 | "width":0, 288 | "x":127.5, 289 | "y":79.75 290 | }, 291 | { 292 | "height":15.875, 293 | "id":32, 294 | "name":"", 295 | "rotation":0, 296 | "type":"", 297 | "visible":true, 298 | "width":32.0625, 299 | "x":128.0625, 300 | "y":64 301 | }, 302 | { 303 | "height":10.375, 304 | "id":33, 305 | "name":"resume", 306 | "rotation":0, 307 | "type":"", 308 | "visible":true, 309 | "width":14.25, 310 | "x":225.53125, 311 | "y":80.0625 312 | }, 313 | { 314 | "height":7.03125, 315 | "id":34, 316 | "name":"library", 317 | "rotation":0, 318 | "type":"", 319 | "visible":true, 320 | "width":11.75, 321 | "x":274.125, 322 | "y":80.125 323 | }, 324 | { 325 | "height":9.90625, 326 | "id":35, 327 | "name":"projects", 328 | "rotation":0, 329 | "type":"", 330 | "visible":true, 331 | "width":13.25, 332 | "x":240.34375, 333 | "y":80.25 334 | }], 335 | "opacity":1, 336 | "type":"objectgroup", 337 | "visible":true, 338 | "x":0, 339 | "y":0 340 | }, 341 | { 342 | "draworder":"topdown", 343 | "id":5, 344 | "name":"spawnpoints", 345 | "objects":[ 346 | { 347 | "height":0, 348 | "id":27, 349 | "name":"player", 350 | "point":true, 351 | "rotation":0, 352 | "type":"", 353 | "visible":true, 354 | "width":0, 355 | "x":72.5454545454545, 356 | "y":111.818181818182 357 | }], 358 | "opacity":1, 359 | "type":"objectgroup", 360 | "visible":true, 361 | "x":0, 362 | "y":0 363 | }], 364 | "nextlayerid":6, 365 | "nextobjectid":36, 366 | "orientation":"orthogonal", 367 | "renderorder":"right-down", 368 | "tiledversion":"1.10.2", 369 | "tileheight":16, 370 | "tilesets":[ 371 | { 372 | "columns":39, 373 | "firstgid":1, 374 | "image":"spritesheet.png", 375 | "imageheight":496, 376 | "imagewidth":624, 377 | "margin":0, 378 | "name":"spritesheet", 379 | "spacing":0, 380 | "tilecount":1209, 381 | "tileheight":16, 382 | "tilewidth":16 383 | }], 384 | "tilewidth":16, 385 | "type":"map", 386 | "version":"1.10", 387 | "width":27 388 | } -------------------------------------------------------------------------------- /public/map.json: -------------------------------------------------------------------------------- 1 | { "compressionlevel":-1, 2 | "height":13, 3 | "infinite":false, 4 | "layers":[ 5 | { 6 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 | 0, 0, 0, 0, 27, 28, 28, 28, 28, 28, 29, 0, 0, 0, 27, 28, 28, 28, 28, 28, 29, 0, 0, 0, 0, 0, 0, 11 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 12 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 13 | 0, 0, 0, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 14 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 15 | 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 17 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 19 | "height":13, 20 | "id":1, 21 | "name":"ground", 22 | "opacity":1, 23 | "type":"tilelayer", 24 | "visible":true, 25 | "width":27, 26 | "x":0, 27 | "y":0 28 | }, 29 | { 30 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34 | 0, 0, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 35 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 | 0, 0, 0, 0, 0, 302, 303, 303, 303, 304, 0, 0, 0, 0, 0, 0, 302, 303, 304, 0, 0, 0, 0, 0, 0, 0, 0, 37 | 0, 0, 0, 0, 0, 341, 342, 342, 342, 343, 0, 0, 0, 0, 0, 0, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 38 | 0, 0, 0, 0, 0, 380, 381, 381, 381, 382, 0, 0, 0, 0, 0, 0, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 39 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 381, 382, 0, 0, 0, 0, 0, 0, 0, 0, 40 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 43 | "height":13, 44 | "id":2, 45 | "name":"ground-2", 46 | "opacity":1, 47 | "type":"tilelayer", 48 | "visible":true, 49 | "width":27, 50 | "x":0, 51 | "y":0 52 | }, 53 | { 54 | "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58 | 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 229, 0, 0, 0, 347, 348, 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 386, 387, 0, 389, 0, 185, 188, 0, 0, 0, 0, 0, 0, 60 | 0, 0, 0, 0, 0, 0, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61 | 0, 0, 0, 0, 0, 0, 265, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62 | 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63 | 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 67 | "height":13, 68 | "id":3, 69 | "name":"props", 70 | "opacity":1, 71 | "type":"tilelayer", 72 | "visible":true, 73 | "width":27, 74 | "x":0, 75 | "y":0 76 | }, 77 | { 78 | "draworder":"topdown", 79 | "id":4, 80 | "name":"boundaries", 81 | "objects":[ 82 | { 83 | "height":48, 84 | "id":1, 85 | "name":"", 86 | "rotation":0, 87 | "type":"", 88 | "visible":true, 89 | "width":0, 90 | "x":48, 91 | "y":64 92 | }, 93 | { 94 | "height":16, 95 | "id":2, 96 | "name":"exit", 97 | "rotation":0, 98 | "type":"", 99 | "visible":true, 100 | "width":16, 101 | "x":32, 102 | "y":112 103 | }, 104 | { 105 | "height":32, 106 | "id":3, 107 | "name":"", 108 | "rotation":0, 109 | "type":"", 110 | "visible":true, 111 | "width":16, 112 | "x":48, 113 | "y":128 114 | }, 115 | { 116 | "height":16, 117 | "id":4, 118 | "name":"", 119 | "rotation":0, 120 | "type":"", 121 | "visible":true, 122 | "width":112, 123 | "x":64, 124 | "y":160 125 | }, 126 | { 127 | "height":15.9090909090909, 128 | "id":5, 129 | "name":"", 130 | "rotation":0, 131 | "type":"", 132 | "visible":true, 133 | "width":48, 134 | "x":176, 135 | "y":144.090909090909 136 | }, 137 | { 138 | "height":15.8181818181818, 139 | "id":6, 140 | "name":"", 141 | "rotation":0, 142 | "type":"", 143 | "visible":true, 144 | "width":16, 145 | "x":208, 146 | "y":160.181818181818 147 | }, 148 | { 149 | "height":48, 150 | "id":8, 151 | "name":"", 152 | "rotation":0, 153 | "type":"", 154 | "visible":true, 155 | "width":0, 156 | "x":208, 157 | "y":64 158 | }, 159 | { 160 | "height":14.6363636363636, 161 | "id":12, 162 | "name":"", 163 | "rotation":0, 164 | "type":"", 165 | "visible":true, 166 | "width":47.9090909090909, 167 | "x":176, 168 | "y":96 169 | }, 170 | { 171 | "height":16, 172 | "id":13, 173 | "name":"", 174 | "rotation":0, 175 | "type":"", 176 | "visible":true, 177 | "width":112, 178 | "x":224, 179 | "y":64 180 | }, 181 | { 182 | "height":80.0909090909091, 183 | "id":14, 184 | "name":"", 185 | "rotation":0, 186 | "type":"", 187 | "visible":true, 188 | "width":16, 189 | "x":336, 190 | "y":95.9090909090909 191 | }, 192 | { 193 | "height":16, 194 | "id":15, 195 | "name":"", 196 | "rotation":0, 197 | "type":"", 198 | "visible":true, 199 | "width":112, 200 | "x":224, 201 | "y":176 202 | }, 203 | { 204 | "height":16, 205 | "id":16, 206 | "name":"", 207 | "rotation":0, 208 | "type":"", 209 | "visible":true, 210 | "width":47.7840909090909, 211 | "x":64, 212 | "y":64 213 | }, 214 | { 215 | "height":32, 216 | "id":17, 217 | "name":"", 218 | "rotation":0, 219 | "type":"", 220 | "visible":true, 221 | "width":16, 222 | "x":48, 223 | "y":80 224 | }, 225 | { 226 | "height":16, 227 | "id":19, 228 | "name":"bed", 229 | "rotation":0, 230 | "type":"", 231 | "visible":true, 232 | "width":32, 233 | "x":304, 234 | "y":80 235 | }, 236 | { 237 | "height":17.4119318181818, 238 | "id":23, 239 | "name":"sofa-table", 240 | "rotation":0, 241 | "type":"", 242 | "visible":true, 243 | "width":27.5909090909091, 244 | "x":98.1157361660079, 245 | "y":98.4877717391304 246 | }, 247 | { 248 | "height":23.399209486166, 249 | "id":26, 250 | "name":"tv", 251 | "rotation":0, 252 | "type":"", 253 | "visible":true, 254 | "width":13.7391304347826, 255 | "x":113.130434782609, 256 | "y":136.600790513834 257 | }, 258 | { 259 | "height":22.8125, 260 | "id":29, 261 | "name":"pc", 262 | "rotation":0, 263 | "type":"", 264 | "visible":true, 265 | "width":13.875, 266 | "x":161, 267 | "y":72.0625 268 | }, 269 | { 270 | "height":14.117527173913, 271 | "id":30, 272 | "name":"cs-degree", 273 | "rotation":0, 274 | "type":"", 275 | "visible":true, 276 | "width":15.125, 277 | "x":112.375, 278 | "y":65.375 279 | }, 280 | { 281 | "height":0.125, 282 | "id":31, 283 | "name":"", 284 | "rotation":0, 285 | "type":"", 286 | "visible":true, 287 | "width":0, 288 | "x":127.5, 289 | "y":79.75 290 | }, 291 | { 292 | "height":15.875, 293 | "id":32, 294 | "name":"", 295 | "rotation":0, 296 | "type":"", 297 | "visible":true, 298 | "width":32.0625, 299 | "x":128.0625, 300 | "y":64 301 | }, 302 | { 303 | "height":10.375, 304 | "id":33, 305 | "name":"resume", 306 | "rotation":0, 307 | "type":"", 308 | "visible":true, 309 | "width":14.25, 310 | "x":225.53125, 311 | "y":80.0625 312 | }, 313 | { 314 | "height":7.03125, 315 | "id":34, 316 | "name":"library", 317 | "rotation":0, 318 | "type":"", 319 | "visible":true, 320 | "width":11.75, 321 | "x":274.125, 322 | "y":80.125 323 | }, 324 | { 325 | "height":9.90625, 326 | "id":35, 327 | "name":"projects", 328 | "rotation":0, 329 | "type":"", 330 | "visible":true, 331 | "width":13.25, 332 | "x":240.34375, 333 | "y":80.25 334 | }], 335 | "opacity":1, 336 | "type":"objectgroup", 337 | "visible":true, 338 | "x":0, 339 | "y":0 340 | }, 341 | { 342 | "draworder":"topdown", 343 | "id":5, 344 | "name":"spawnpoints", 345 | "objects":[ 346 | { 347 | "height":0, 348 | "id":27, 349 | "name":"player", 350 | "point":true, 351 | "rotation":0, 352 | "type":"", 353 | "visible":true, 354 | "width":0, 355 | "x":72.5454545454545, 356 | "y":111.818181818182 357 | }], 358 | "opacity":1, 359 | "type":"objectgroup", 360 | "visible":true, 361 | "x":0, 362 | "y":0 363 | }], 364 | "nextlayerid":6, 365 | "nextobjectid":36, 366 | "orientation":"orthogonal", 367 | "renderorder":"right-down", 368 | "tiledversion":"1.10.2", 369 | "tileheight":16, 370 | "tilesets":[ 371 | { 372 | "columns":39, 373 | "firstgid":1, 374 | "image":"spritesheet.png", 375 | "imageheight":496, 376 | "imagewidth":624, 377 | "margin":0, 378 | "name":"spritesheet", 379 | "spacing":0, 380 | "tilecount":1209, 381 | "tileheight":16, 382 | "tilewidth":16 383 | }], 384 | "tilewidth":16, 385 | "type":"map", 386 | "version":"1.10", 387 | "width":27 388 | } --------------------------------------------------------------------------------