initial commit

This commit is contained in:
2026-04-24 11:24:04 +02:00
commit acf80258ae
138 changed files with 5209 additions and 0 deletions
Executable
+47
View File
@@ -0,0 +1,47 @@
Copyright (c) 2013, 2014, 2015, 2016 Jake Gordon and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
# Javascript Tiny-Platformer
A very minimal javascript platform game
- [play the game](http://codeincomplete.com/projects/tiny-platformer/index.html)
- read the [original article](http://codeincomplete.com/posts/2013/5/27/tiny_platformer/)
- read a [follow up article](http://codeincomplete.com/posts/2013/6/2/tiny_platformer_revisited/) about adding monsters and treasure
- view the [source](https://github.com/jakesgordon/javascript-tiny-platformer)
Just a sinple example of how to have a tiny rectangle run around some rectangle platforms,
collecting rectangular gold and avoiding rectangular monsters.
# SUPPORTED BROWSERS
Should work in any modern browser with canvas support
# DEVELOPMENT
The game is 100% client side javascript, html and css. It should run when served up by any web server.
# License
[MIT](http://en.wikipedia.org/wiki/MIT_License) license.
---
Executable
+124
View File
@@ -0,0 +1,124 @@
# Readme
Simple JS platformer to modify and extend.
## Welche VS Code Extensions sollten installiert sein
- Better Comments
- Color Highlight
- Atom One Dark Theme
- Material Icon Theme
## Grundideen
- Camera Setup kann ich erstmal auslassen. Dann mache ich stattdessen single rooms (vgl. Lykia).
- Overworld und Levels?
- Character selection?
- Inventory System mit durchsuchbaren Kisten, Content bleibt erhalten.
- Auflösung von Gameboy, GBC, Game Gear ist 160 × 144 pixel.
- Sprite Animation kann ich genauso machen wie bei Pico-8 (<https://nerdyteachers.com/Explain/AnimateSprite/>, <https://www.youtube.com/watch?v=rtWGZ1uiBLY>)!
- Setting ist ein Space Adventure. Mit einem Raumschiff kann man viele verschiedene Umgebungen erreichen (Dschungel, Techno, Unterwasser, Höhlen,...)
- Commander Keen trifft Metroidvania + UFO: Terror from the Deep!
## Todo
- [x] Refactor code. Alles sortieren (Helper, Utils, Functions, Main Function, Objects usw.)
- [x] Robuste collision checks und collision maps bauen
- [x] Irgendeine Art Dev Function bauen, die mir übersichtliche console logs ausgibt.
- [x] "Doors" System entwickeln.
- [x] Die Camera funktioniert in Level2 noch nicht mit Begrenzung nach Rechts und Unten. Liegt das am Level selbst?
- [x] Pause Function
- [x] Sprite Animation (<https://codehs.com/tutorial/andy/Programming_Sprites_in_JavaScript>)
- [x] Maps umrüsten auf 16x16 px tiles. Ist in den Variablen schon vorbereitet, muss nur die Maps noch mal aus Tiled exportieren
- [x] Aus Tiled werden die Custom Properties nicht richtig exportiert
- [x] "type" muss ich ändern in "class" in der setup Funktion
- [x] Die properties werden als Array exportiert. Da brauche ich in der setup Funktion noch eine Function um die zu Konviertieren.
- [x] Globales Objekt bauen mit einem einzigen Wert ("life = 3" z.B.), den ich immer Anzeige und der über die Level hinaus bestehen bleibt.
- [ ] Gravity Variable für verschiedene Umgebungen (Land, Wasser, Space)
- [ ] Verschiedene Biomes
- [ ] Ice World
- [ ] Desert World
- [ ] Lava World
- [ ] Underwater
- [ ] Forest World
- [ ] Techno World
- [ ] Fix Scaling bei verschiedenen Level-Größen (protrait ist broken)
### Welche Assets nutze ich
- "Grotto Escape Pack" by Ansimuz
- "8-Bit Cave Loop" by Wolfgang
## Welche Tools nutze ich
- Beepbox für Musik <https://www.beepbox.co/>
- Tiled für Sprites und Maps <https://www.mapeditor.org/>
### Beepbox
- Stonehenge
- Suspiria
### Tiled
Map Setup:
- Orthogonal
- CSV
- Left Down (! das ist wichtig)
Layer in folgender Reihenfolge:
- foreground
- Object Layer 1
- tileLayer
- background
Export als ".tmj"
## Feature Roadmap
[Roadmap](./docs/roadmap.md)
- [x] zweite Map
- [x] Variablen für alle Props, die die Map betreffen (MAP.tw/.th, Scaling, HUD-Scaling, TileAtlas)
- [x] Alphabet TileMap (oder font!)
- [x] Map Layers (CollisionLayer, Background, Foreground, Object-Layer) inkl. Anleitung für Tiled
- [x] Map Transitions (mit einem Doors Object)
- [x] Map Layers
- [x] Global Player Object
- [x] Shooting
- [x] Swimming
- [x] Ammo
- [ ] Destructibles (haben eigenes "destructibles = {}" Objekt wie monsters oder treasure und haben hitpoints, eigener Layer oder gehören die zu Objects?)
- [ ] moving Platforms
- [ ] Vehicles
- [ ] mehr Weapons
- [ ] Player upgrade 16x32 px
- [ ] animated Tiles
- [ ] Upgrades/Powerups
- [ ] Ladders/Poles
- [ ] mehr Enemy Types (flying, wallcrawler, shooting)
- [ ] Game Start/Game Over Screen
- [ ] Inventory System
- [ ] CameraBox
- [ ] Sprites
- [ ] Player
- [ ] Enemies
- [ ] Items
- [ ] Map Tiles
## Possible Story
Biff Bolton, sidekick to intergalactic space adventurer Ace Hunter, is stranded on a strange planet after several parts of his ship fail and he has to make an emergency landing. To repair his ship he must explore the planet and delve deep into its mysterious caves and catacombs.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Executable
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+683
View File
@@ -0,0 +1,683 @@
{
"format": "BeepBox",
"version": 9,
"scale": "easy :)",
"key": "C",
"introBars": 0,
"loopBars": 4,
"beatsPerBar": 8,
"ticksPerBeat": 4,
"beatsPerMinute": 150,
"layeredInstruments": false,
"patternInstruments": false,
"channels": [
{
"type": "pitch",
"instruments": [
{
"type": "FM",
"volume": 80,
"eqFilter": [],
"preset": 325,
"effects": [
"chord type",
"note filter",
"reverb"
],
"chord": "strum",
"noteFilter": [
{
"type": "low-pass",
"cutoffHz": 19027.31,
"linearGain": 0.3536
}
],
"reverb": 33,
"fadeInSeconds": 0,
"fadeOutTicks": -3,
"algorithm": "1←2←3←4",
"feedbackType": "3⟲",
"feedbackAmplitude": 4,
"operators": [
{
"frequency": "3×",
"amplitude": 13
},
{
"frequency": "1×",
"amplitude": 7
},
{
"frequency": "13×",
"amplitude": 3
},
{
"frequency": "1×",
"amplitude": 11
}
],
"envelopes": [
{
"target": "noteFilterAllFreqs",
"envelope": "twang 1"
}
]
}
],
"patterns": [
{
"notes": [
{
"pitches": [
57
],
"points": [
{
"tick": 4,
"pitchBend": 0,
"volume": 100
},
{
"tick": 6,
"pitchBend": 0,
"volume": 100
}
]
}
]
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
}
],
"sequence": [
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"octaveScrollBar": 3
},
{
"type": "pitch",
"instruments": [
{
"type": "FM",
"volume": 80,
"eqFilter": [],
"preset": 649,
"effects": [
"transition type",
"vibrato",
"reverb"
],
"transition": "slide",
"vibrato": "delayed",
"reverb": 33,
"fadeInSeconds": 0.0263,
"fadeOutTicks": -3,
"algorithm": "1←(234)",
"feedbackType": "1⟲",
"feedbackAmplitude": 2,
"operators": [
{
"frequency": "2×",
"amplitude": 15
},
{
"frequency": "1×",
"amplitude": 7
},
{
"frequency": "~1×",
"amplitude": 7
},
{
"frequency": "1×",
"amplitude": 0
}
],
"envelopes": [
{
"target": "operatorAmplitude",
"envelope": "punch",
"index": 1
},
{
"target": "feedbackAmplitude",
"envelope": "twang 3"
}
]
}
],
"patterns": [
{
"notes": [
{
"pitches": [
38
],
"points": [
{
"tick": 4,
"pitchBend": 0,
"volume": 100
},
{
"tick": 6,
"pitchBend": 0,
"volume": 100
}
]
}
]
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
}
],
"sequence": [
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"octaveScrollBar": 2
},
{
"type": "pitch",
"instruments": [
{
"type": "FM",
"volume": 80,
"eqFilter": [],
"preset": 322,
"effects": [
"chord type",
"note filter",
"reverb"
],
"chord": "strum",
"noteFilter": [
{
"type": "low-pass",
"cutoffHz": 13454.34,
"linearGain": 0.25
}
],
"reverb": 33,
"fadeInSeconds": 0,
"fadeOutTicks": 48,
"algorithm": "1←(23←4)",
"feedbackType": "3⟲",
"feedbackAmplitude": 4,
"operators": [
{
"frequency": "1×",
"amplitude": 15
},
{
"frequency": "1×",
"amplitude": 5
},
{
"frequency": "11×",
"amplitude": 1
},
{
"frequency": "1×",
"amplitude": 9
}
],
"envelopes": [
{
"target": "noteFilterAllFreqs",
"envelope": "twang 1"
},
{
"target": "operatorAmplitude",
"envelope": "twang 3",
"index": 2
},
{
"target": "feedbackAmplitude",
"envelope": "twang 1"
}
]
}
],
"patterns": [
{
"notes": [
{
"pitches": [
19
],
"points": [
{
"tick": 4,
"pitchBend": 0,
"volume": 100
},
{
"tick": 6,
"pitchBend": 0,
"volume": 100
}
]
},
{
"pitches": [
19
],
"points": [
{
"tick": 8,
"pitchBend": 0,
"volume": 100
},
{
"tick": 10,
"pitchBend": 0,
"volume": 100
}
]
},
{
"pitches": [
28
],
"points": [
{
"tick": 12,
"pitchBend": 0,
"volume": 100
},
{
"tick": 14,
"pitchBend": 0,
"volume": 100
}
]
},
{
"pitches": [
19
],
"points": [
{
"tick": 20,
"pitchBend": 0,
"volume": 100
},
{
"tick": 22,
"pitchBend": 0,
"volume": 100
}
]
},
{
"pitches": [
19
],
"points": [
{
"tick": 24,
"pitchBend": 0,
"volume": 100
},
{
"tick": 26,
"pitchBend": 0,
"volume": 100
}
]
},
{
"pitches": [
28
],
"points": [
{
"tick": 28,
"pitchBend": 0,
"volume": 100
},
{
"tick": 30,
"pitchBend": 0,
"volume": 100
}
]
}
]
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
}
],
"sequence": [
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"octaveScrollBar": 1
},
{
"type": "drum",
"instruments": [
{
"type": "noise",
"volume": 80,
"eqFilter": [
{
"type": "low-pass",
"cutoffHz": 16000,
"linearGain": 0.3536
}
],
"preset": 69,
"effects": [
"chord type"
],
"chord": "arpeggio",
"fadeInSeconds": 0,
"fadeOutTicks": -3,
"wave": "retro",
"envelopes": []
}
],
"patterns": [
{
"notes": [
{
"pitches": [
9
],
"points": [
{
"tick": 0,
"pitchBend": 0,
"volume": 100
},
{
"tick": 2,
"pitchBend": 0,
"volume": 0
}
],
"continuesLastPattern": false
},
{
"pitches": [
6
],
"points": [
{
"tick": 4,
"pitchBend": 0,
"volume": 100
},
{
"tick": 6,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
6
],
"points": [
{
"tick": 6,
"pitchBend": 0,
"volume": 100
},
{
"tick": 8,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
9
],
"points": [
{
"tick": 8,
"pitchBend": 0,
"volume": 100
},
{
"tick": 10,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
2
],
"points": [
{
"tick": 10,
"pitchBend": 0,
"volume": 100
},
{
"tick": 12,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
2
],
"points": [
{
"tick": 12,
"pitchBend": 0,
"volume": 100
},
{
"tick": 14,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
9
],
"points": [
{
"tick": 16,
"pitchBend": 0,
"volume": 100
},
{
"tick": 18,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
2
],
"points": [
{
"tick": 20,
"pitchBend": 0,
"volume": 100
},
{
"tick": 23,
"pitchBend": 0,
"volume": 0
}
]
},
{
"pitches": [
9
],
"points": [
{
"tick": 24,
"pitchBend": 0,
"volume": 100
},
{
"tick": 26,
"pitchBend": 0,
"volume": 0
}
]
}
]
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
},
{
"notes": []
}
],
"sequence": [
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

+84
View File
@@ -0,0 +1,84 @@
# Roadmap
- [ ] Test Map
- [ ] Vehicles
- [ ] Swimming
- [x] Oxygen-Meter
- [ ] ordentliches HUD bauen
- [ ] Elemente müssen variable und optional sein.
- [ ] Global Progress Object
- [ ] One-Time Pickups (für z.B. Powerups die nicht respawned werden)
- [ ] Menus & Textboxes
- [ ] Save & Load
- [ ] Mobile Controls
- [ ] Collision Boxes (nicht identisch mit der Sprite-Größe)
- [ ] Spores (?? tbd)
- [ ] Webhosting
- [ ] Boss Battles
## Absolute Minimum to Finished
- Swimming with depleting oxygen
- 1 vehicle
- Winning condition
## Biomes & Levelsetups
- above sealevel
- islands with different biomes (desert (with pyramid), forest/jungle, mysterious swamp, crystal)
- islands are connected via underwater cave system
- below sealevel
- caves (regular, ice, colorful underground mushroom forest (game should never feel gloomy but fun!), deep sea alien?)
- boss-levels
## Objects & Variables
- GlobalProgress
```json
GlobalProgress {
"player": {
"currentHitpoints": 3,
"maxHitpoints": 5,
"collectedCrystals": 26,
"oxygen": 70,
"maxOxygen": 70,
"ammo": {
"blaster": 10,
"rocketLauncher": 5,
"pulseRifle": 20,
},
"x": 53, // ?
"y": 345, // ?
"inVehicle": false, // ?
},
"upgrades": {
"jumpBoots": false,
"fins": false, // faster swimming
"oxygenTank1": false,
"oxygenTank2": false,
},
"weapons": {
"blaster": true,
"rocketLauncher": false,
"pulseRifle": false, // high firing rate, low damage
},
"beatenBosses": {
"boss1": true,
"boss2": false,
"boss3": false,
},
"vehicles": {
"submarine": {
"batteryLvl1": true,
"batteryLvl2": false,
"thermalConverter": false, // regenerate battery at thermal vents
"hullPlating": false,
},
},
}
```
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Vendored Executable
+15
View File
@@ -0,0 +1,15 @@
/*! FPSMeter 0.3.1 - 9th May 2013 | https://github.com/Darsain/fpsmeter */
(function(m,j){function s(a,e){for(var g in e)try{a.style[g]=e[g]}catch(j){}return a}function H(a){return null==a?String(a):"object"===typeof a||"function"===typeof a?Object.prototype.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase()||"object":typeof a}function R(a,e){if("array"!==H(e))return-1;if(e.indexOf)return e.indexOf(a);for(var g=0,j=e.length;g<j;g++)if(e[g]===a)return g;return-1}function I(){var a=arguments,e;for(e in a[1])if(a[1].hasOwnProperty(e))switch(H(a[1][e])){case "object":a[0][e]=
I({},a[0][e],a[1][e]);break;case "array":a[0][e]=a[1][e].slice(0);break;default:a[0][e]=a[1][e]}return 2<a.length?I.apply(null,[a[0]].concat(Array.prototype.slice.call(a,2))):a[0]}function N(a){a=Math.round(255*a).toString(16);return 1===a.length?"0"+a:a}function S(a,e,g,j){if(a.addEventListener)a[j?"removeEventListener":"addEventListener"](e,g,!1);else if(a.attachEvent)a[j?"detachEvent":"attachEvent"]("on"+e,g)}function D(a,e){function g(a,b,d,c){return y[0|a][Math.round(Math.min((b-d)/(c-d)*J,J))]}
function r(){f.legend.fps!==q&&(f.legend.fps=q,f.legend[T]=q?"FPS":"ms");K=q?b.fps:b.duration;f.count[T]=999<K?"999+":K.toFixed(99<K?0:d.decimals)}function m(){z=A();L<z-d.threshold&&(b.fps-=b.fps/Math.max(1,60*d.smoothing/d.interval),b.duration=1E3/b.fps);for(c=d.history;c--;)E[c]=0===c?b.fps:E[c-1],F[c]=0===c?b.duration:F[c-1];r();if(d.heat){if(w.length)for(c=w.length;c--;)w[c].el.style[h[w[c].name].heatOn]=q?g(h[w[c].name].heatmap,b.fps,0,d.maxFps):g(h[w[c].name].heatmap,b.duration,d.threshold,
0);if(f.graph&&h.column.heatOn)for(c=u.length;c--;)u[c].style[h.column.heatOn]=q?g(h.column.heatmap,E[c],0,d.maxFps):g(h.column.heatmap,F[c],d.threshold,0)}if(f.graph)for(p=0;p<d.history;p++)u[p].style.height=(q?E[p]?Math.round(O/d.maxFps*Math.min(E[p],d.maxFps)):0:F[p]?Math.round(O/d.threshold*Math.min(F[p],d.threshold)):0)+"px"}function k(){20>d.interval?(x=M(k),m()):(x=setTimeout(k,d.interval),P=M(m))}function G(a){a=a||window.event;a.preventDefault?(a.preventDefault(),a.stopPropagation()):(a.returnValue=
!1,a.cancelBubble=!0);b.toggle()}function U(){d.toggleOn&&S(f.container,d.toggleOn,G,1);a.removeChild(f.container)}function V(){f.container&&U();h=D.theme[d.theme];y=h.compiledHeatmaps||[];if(!y.length&&h.heatmaps.length){for(p=0;p<h.heatmaps.length;p++){y[p]=[];for(c=0;c<=J;c++){var b=y[p],e=c,g;g=0.33/J*c;var j=h.heatmaps[p].saturation,m=h.heatmaps[p].lightness,n=void 0,k=void 0,l=void 0,t=l=void 0,v=n=k=void 0,v=void 0,l=0.5>=m?m*(1+j):m+j-m*j;0===l?g="#000":(t=2*m-l,k=(l-t)/l,g*=6,n=Math.floor(g),
v=g-n,v*=l*k,0===n||6===n?(n=l,k=t+v,l=t):1===n?(n=l-v,k=l,l=t):2===n?(n=t,k=l,l=t+v):3===n?(n=t,k=l-v):4===n?(n=t+v,k=t):(n=l,k=t,l-=v),g="#"+N(n)+N(k)+N(l));b[e]=g}}h.compiledHeatmaps=y}f.container=s(document.createElement("div"),h.container);f.count=f.container.appendChild(s(document.createElement("div"),h.count));f.legend=f.container.appendChild(s(document.createElement("div"),h.legend));f.graph=d.graph?f.container.appendChild(s(document.createElement("div"),h.graph)):0;w.length=0;for(var q in f)f[q]&&
h[q].heatOn&&w.push({name:q,el:f[q]});u.length=0;if(f.graph){f.graph.style.width=d.history*h.column.width+(d.history-1)*h.column.spacing+"px";for(c=0;c<d.history;c++)u[c]=f.graph.appendChild(s(document.createElement("div"),h.column)),u[c].style.position="absolute",u[c].style.bottom=0,u[c].style.right=c*h.column.width+c*h.column.spacing+"px",u[c].style.width=h.column.width+"px",u[c].style.height="0px"}s(f.container,d);r();a.appendChild(f.container);f.graph&&(O=f.graph.clientHeight);d.toggleOn&&("click"===
d.toggleOn&&(f.container.style.cursor="pointer"),S(f.container,d.toggleOn,G))}"object"===H(a)&&a.nodeType===j&&(e=a,a=document.body);a||(a=document.body);var b=this,d=I({},D.defaults,e||{}),f={},u=[],h,y,J=100,w=[],W=0,B=d.threshold,Q=0,L=A()-B,z,E=[],F=[],x,P,q="fps"===d.show,O,K,c,p;b.options=d;b.fps=0;b.duration=0;b.isPaused=0;b.tickStart=function(){Q=A()};b.tick=function(){z=A();W=z-L;B+=(W-B)/d.smoothing;b.fps=1E3/B;b.duration=Q<L?B:z-Q;L=z};b.pause=function(){x&&(b.isPaused=1,clearTimeout(x),
C(x),C(P),x=P=0);return b};b.resume=function(){x||(b.isPaused=0,k());return b};b.set=function(a,c){d[a]=c;q="fps"===d.show;-1!==R(a,X)&&V();-1!==R(a,Y)&&s(f.container,d);return b};b.showDuration=function(){b.set("show","ms");return b};b.showFps=function(){b.set("show","fps");return b};b.toggle=function(){b.set("show",q?"ms":"fps");return b};b.hide=function(){b.pause();f.container.style.display="none";return b};b.show=function(){b.resume();f.container.style.display="block";return b};b.destroy=function(){b.pause();
U();b.tick=b.tickStart=function(){}};V();k()}var A,r=m.performance;A=r&&(r.now||r.webkitNow)?r[r.now?"now":"webkitNow"].bind(r):function(){return+new Date};for(var C=m.cancelAnimationFrame||m.cancelRequestAnimationFrame,M=m.requestAnimationFrame,r=["moz","webkit","o"],G=0,k=0,Z=r.length;k<Z&&!C;++k)M=(C=m[r[k]+"CancelAnimationFrame"]||m[r[k]+"CancelRequestAnimationFrame"])&&m[r[k]+"RequestAnimationFrame"];C||(M=function(a){var e=A(),g=Math.max(0,16-(e-G));G=e+g;return m.setTimeout(function(){a(e+
g)},g)},C=function(a){clearTimeout(a)});var T="string"===H(document.createElement("div").textContent)?"textContent":"innerText";D.extend=I;window.FPSMeter=D;D.defaults={interval:100,smoothing:10,show:"fps",toggleOn:"click",decimals:1,maxFps:60,threshold:100,position:"absolute",zIndex:10,left:"5px",top:"5px",right:"auto",bottom:"auto",margin:"0 0 0 0",theme:"dark",heat:0,graph:0,history:20};var X=["toggleOn","theme","heat","graph","history"],Y="position zIndex left top right bottom margin".split(" ")})(window);(function(m,j){j.theme={};var s=j.theme.base={heatmaps:[],container:{heatOn:null,heatmap:null,padding:"5px",minWidth:"95px",height:"30px",lineHeight:"30px",textAlign:"right",textShadow:"none"},count:{heatOn:null,heatmap:null,position:"absolute",top:0,right:0,padding:"5px 10px",height:"30px",fontSize:"24px",fontFamily:"Consolas, Andale Mono, monospace",zIndex:2},legend:{heatOn:null,heatmap:null,position:"absolute",top:0,left:0,padding:"5px 10px",height:"30px",fontSize:"12px",lineHeight:"32px",fontFamily:"sans-serif",
textAlign:"left",zIndex:2},graph:{heatOn:null,heatmap:null,position:"relative",boxSizing:"padding-box",MozBoxSizing:"padding-box",height:"100%",zIndex:1},column:{width:4,spacing:1,heatOn:null,heatmap:null}};j.theme.dark=j.extend({},s,{heatmaps:[{saturation:0.8,lightness:0.8}],container:{background:"#222",color:"#fff",border:"1px solid #1a1a1a",textShadow:"1px 1px 0 #222"},count:{heatOn:"color"},column:{background:"#3f3f3f"}});j.theme.light=j.extend({},s,{heatmaps:[{saturation:0.5,lightness:0.5}],
container:{color:"#666",background:"#fff",textShadow:"1px 1px 0 rgba(255,255,255,.5), -1px -1px 0 rgba(255,255,255,.5)",boxShadow:"0 0 0 1px rgba(0,0,0,.1)"},count:{heatOn:"color"},column:{background:"#eaeaea"}});j.theme.colorful=j.extend({},s,{heatmaps:[{saturation:0.5,lightness:0.6}],container:{heatOn:"backgroundColor",background:"#888",color:"#fff",textShadow:"1px 1px 0 rgba(0,0,0,.2)",boxShadow:"0 0 0 1px rgba(0,0,0,.1)"},column:{background:"#777",backgroundColor:"rgba(0,0,0,.2)"}});j.theme.transparent=
j.extend({},s,{heatmaps:[{saturation:0.8,lightness:0.5}],container:{padding:0,color:"#fff",textShadow:"1px 1px 0 rgba(0,0,0,.5)"},count:{padding:"0 5px",height:"40px",lineHeight:"40px"},legend:{padding:"0 5px",height:"40px",lineHeight:"42px"},graph:{height:"40px"},column:{width:5,background:"#999",heatOn:"backgroundColor",opacity:0.5}})})(window,FPSMeter);
Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Some files were not shown because too many files have changed in this diff Show More