{"versions":{"1.0.0":{"name":"frame-ticker","version":"1.0.0","description":"Frame ticker with easy events for animation or games in JavaScript or TypeScript","main":"./dist/FrameTicker.js","types":"./dist/src/FrameTicker.d.ts","scripts":{"build":"cross-env NODE_ENV=production webpack --config webpack.config.js --progress --verbose --colors --display-error-details","dev":"webpack --config webpack.config.js --progress --verbose --colors --display-error-details","coverage":"nyc npm test","coverage:report":"nyc npm test && nyc report --reporter=text-lcov | coveralls","test":"mocha test/.setup.js test/**/*-test-*.js","test:watch":"mocha -w test/.setup.js test/**/*-test-*.js","lint":"tslint -c tslint.json src/*.ts","prepublish":"npm run build"},"bin":{"webpack":"./node_modules/webpack/bin/webpack.js"},"repository":{"type":"git","url":"git+https://github.com/zeh/frame-ticker.git"},"keywords":["game","tick","ticker","frame","loop","looper","animation","requestAnimationFrame"],"author":{"name":"Zeh Fernando","email":"npm@zehfernando.com"},"license":"MIT","bugs":{"url":"https://github.com/zeh/frame-ticker/issues"},"homepage":"https://github.com/zeh/frame-ticker#readme","devDependencies":{"babel-core":"^6.20.0","babel-loader":"^6.2.9","babel-plugin-external-helpers":"^6.18.0","babel-preset-es2015":"^6.18.0","babel-preset-stage-2":"^6.18.0","chai":"^3.5.0","core-js":"^2.4.1","coveralls":"^2.11.15","cross-env":"^3.1.3","import-sort":"^2.4.0","import-sort-style-module":"^2.4.0","jsdom":"^9.8.3","jsdom-global":"^2.1.0","mocha":"^3.2.0","mocha-lcov-reporter":"^1.2.0","nyc":"^10.0.0","rimraf":"^2.5.4","ts-loader":"^1.3.1","tslint":"^4.0.2","tslint-loader":"^3.3.0","typescript":"^2.1.4","webpack":"^1.14.0"},"babel":{"presets":["es2015"]},"importSort":{".js, .jsx, .es6, .es":{"parser":"babylon","style":"module"},".ts, .tsx":{"parser":"typescript","style":"module"}},"dependencies":{"simplesignal":"^2.1.6"},"gitHead":"f357cab498741d4dfa008d10a0eb801d6f37dbed","_id":"frame-ticker@1.0.0","_shasum":"7f1f7aa5136b190eb8e140481ec783b1e172a373","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.9.1","_npmUser":{"name":"anonymous","email":"npm@zehfernando.com"},"dist":{"shasum":"7f1f7aa5136b190eb8e140481ec783b1e172a373","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/frame-ticker/-/frame-ticker-1.0.0.tgz","size":6205,"integrity":"sha512-zuvZafwv6/gw3kYplc1SI9oaZ+YtvTKfybxqHIrYEE0U4M3qer5Xjck8bgH17N4ARf7vBIzM+ekEXeTEzzo6BQ=="},"maintainers":[{"name":"anonymous","email":"npm@zehfernando.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/frame-ticker-1.0.0.tgz_1481749189184_0.8323630623053759"},"directories":{},"_cnpmcore_publish_time":"2021-12-22T02:29:51.706Z","contributors":[]},"1.0.2":{"name":"frame-ticker","version":"1.0.2","description":"Frame ticker with easy events for animation or games in JavaScript or TypeScript","main":"./dist/FrameTicker.js","types":"./dist/src/FrameTicker.d.ts","scripts":{"build":"cross-env NODE_ENV=production webpack --config webpack.config.js --progress --verbose --colors --display-error-details","dev":"webpack --config webpack.config.js --progress --verbose --colors --display-error-details","coverage":"nyc npm test","coverage:report":"nyc npm test && nyc report --reporter=text-lcov | coveralls","test":"mocha test/.setup.js test/**/*-test-*.js","test:watch":"mocha -w test/.setup.js test/**/*-test-*.js","lint":"tslint -c tslint.json src/*.ts","prepublish":"npm run build"},"bin":{"webpack":"./node_modules/webpack/bin/webpack.js"},"repository":{"type":"git","url":"git+https://github.com/zeh/frame-ticker.git"},"keywords":["game","tick","ticker","frame","loop","looper","animation","requestAnimationFrame"],"author":{"name":"Zeh Fernando","email":"npm@zehfernando.com"},"license":"MIT","bugs":{"url":"https://github.com/zeh/frame-ticker/issues"},"homepage":"https://github.com/zeh/frame-ticker#readme","devDependencies":{"babel-core":"^6.20.0","babel-loader":"^6.2.9","babel-plugin-external-helpers":"^6.18.0","babel-preset-es2015":"^6.18.0","babel-preset-stage-2":"^6.18.0","chai":"^3.5.0","core-js":"^2.4.1","coveralls":"^2.11.15","cross-env":"^3.1.3","import-sort":"^2.4.0","import-sort-style-module":"^2.4.0","jsdom":"^9.8.3","jsdom-global":"^2.1.0","mocha":"^3.2.0","mocha-lcov-reporter":"^1.2.0","nyc":"^10.0.0","rimraf":"^2.5.4","ts-loader":"^1.3.1","tslint":"^4.0.2","tslint-loader":"^3.3.0","typescript":"^2.1.4","webpack":"^1.14.0"},"babel":{"presets":["es2015"]},"importSort":{".js, .jsx, .es6, .es":{"parser":"babylon","style":"module"},".ts, .tsx":{"parser":"typescript","style":"module"}},"dependencies":{"simplesignal":"^2.1.6"},"gitHead":"7787b91001ef9c23d6c012202c18136878dab17b","_id":"frame-ticker@1.0.2","_shasum":"4cf37f601f0d1c8264ac9a8141d6b628c7fa0917","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.9.1","_npmUser":{"name":"anonymous","email":"npm@zehfernando.com"},"dist":{"shasum":"4cf37f601f0d1c8264ac9a8141d6b628c7fa0917","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/frame-ticker/-/frame-ticker-1.0.2.tgz","size":6207,"integrity":"sha512-Ralv2vXYhZyz+08FYBFUmI6PRAGBJ7J4XiftA/bDHAcaZwjNp/M0b8beEizaWhgSTtYe+L7lb6Du0zVxRPX4Aw=="},"maintainers":[{"name":"anonymous","email":"npm@zehfernando.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/frame-ticker-1.0.2.tgz_1481753026854_0.9615747616626322"},"directories":{},"_cnpmcore_publish_time":"2021-12-22T02:29:52.598Z","contributors":[]},"1.0.3":{"name":"frame-ticker","version":"1.0.3","description":"Frame ticker with easy events for animation or games in JavaScript or TypeScript","main":"./dist/FrameTicker.js","types":"./dist/src/FrameTicker.d.ts","scripts":{"build":"cross-env NODE_ENV=production ./node_modules/webpack/bin/webpack.js --config webpack.config.js --progress --verbose --colors --display-error-details","dev":"./node_modules/webpack/bin/webpack.js --config webpack.config.js --progress --verbose --colors --display-error-details","coverage":"nyc npm test","coverage:report":"nyc npm test && nyc report --reporter=text-lcov | coveralls","test":"mocha test/.setup.js test/**/*-test-*.js","test:watch":"mocha -w test/.setup.js test/**/*-test-*.js","lint":"tslint -c tslint.json src/*.ts","prepublish":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/zeh/frame-ticker.git"},"keywords":["game","tick","ticker","frame","loop","looper","animation","requestAnimationFrame"],"author":{"name":"Zeh Fernando","email":"npm@zehfernando.com"},"license":"MIT","bugs":{"url":"https://github.com/zeh/frame-ticker/issues"},"homepage":"https://github.com/zeh/frame-ticker#readme","devDependencies":{"babel-core":"^6.20.0","babel-loader":"^6.2.9","babel-plugin-external-helpers":"^6.18.0","babel-preset-es2015":"^6.18.0","babel-preset-stage-2":"^6.18.0","chai":"^3.5.0","core-js":"^2.4.1","coveralls":"^2.11.15","cross-env":"^3.1.3","import-sort":"^2.4.0","import-sort-style-module":"^2.4.0","jsdom":"^9.8.3","jsdom-global":"^2.1.0","mocha":"^3.2.0","mocha-lcov-reporter":"^1.2.0","nyc":"^10.0.0","rimraf":"^2.5.4","ts-loader":"^1.3.1","tslint":"^4.0.2","tslint-loader":"^3.3.0","typescript":"^2.1.4","webpack":"^1.14.0"},"babel":{"presets":["es2015"]},"importSort":{".js, .jsx, .es6, .es":{"parser":"babylon","style":"module"},".ts, .tsx":{"parser":"typescript","style":"module"}},"dependencies":{"simplesignal":"^2.1.6"},"gitHead":"3b31513629f50c3774c1f88430419bcc792aafc1","_id":"frame-ticker@1.0.3","_shasum":"2c99d3febb493fd1d3621351cd003189794a1245","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.9.1","_npmUser":{"name":"anonymous","email":"npm@zehfernando.com"},"dist":{"shasum":"2c99d3febb493fd1d3621351cd003189794a1245","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/frame-ticker/-/frame-ticker-1.0.3.tgz","size":6178,"integrity":"sha512-E0X2u2JIvbEMrqEg5+4BpTqaD22OwojJI63K7MdKHdncjtAhGRbCR8nJCr2vwEt9NWBPCPcu70X9smPviEBy8Q=="},"maintainers":[{"name":"anonymous","email":"npm@zehfernando.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/frame-ticker-1.0.3.tgz_1485882023979_0.6935830998700112"},"directories":{},"_cnpmcore_publish_time":"2021-12-22T02:29:52.688Z","contributors":[]}},"dist-tags":{"latest":"1.0.3"},"name":"frame-ticker","time":{"created":"2022-01-27T02:12:00.861Z","modified":"2022-01-27T02:12:00.861Z","1.0.0":"2016-12-14T20:59:51.099Z","1.0.2":"2016-12-14T22:03:48.788Z","1.0.3":"2017-01-31T17:00:24.621Z"},"readme":"# FrameTicker\n\n[![npm](https://img.shields.io/npm/v/frame-ticker.svg)](https://www.npmjs.com/package/frame-ticker)\n[![Build Status](https://travis-ci.org/zeh/frame-ticker.svg?branch=master)](https://travis-ci.org/zeh/frame-ticker)\n[![Coverage Status](https://coveralls.io/repos/github/zeh/frame-ticker/badge.svg?branch=master)](https://coveralls.io/github/zeh/frame-ticker?branch=master)\n[![Dependency Status](https://david-dm.org/zeh/frame-ticker.svg)](https://david-dm.org/zeh/frame-ticker)\n\nFrameTicker creates an object that continuously loops (\"ticks\") on every rendering frame, dispatching callbacks every time it does so.\n\nIt works on top of `requestAnimationFrame`, but with features of its own. It does not provide a polyfill for browsers that don't support `requestAnimationFrame`.\n\nFrameTicker is written in TypeScript, but can be used both in JavaScript and TypeScript. In TypeScript, you get the benefit of automatic declarations (auto-completion, \"intellisense\").\n\n## Installation\n\nSimply install FrameTicker as a module dependency using NPM:\n\n```shell\nnpm install frame-ticker --save\n```\n\n## Usage\n\nImport:\n\n```javascript\n// Import (JavaScript ES5)\nvar FrameTicker = require('frame-ticker').default;\n\n// Import (JavaScript ES6 and TypeScript)\nimport FrameTicker from 'frame-ticker';\n```\n\nCreate an instance:\n\n```javascript\nlet ticker = new FrameTicker(); // Create and start, at current browser FPS (60)\nlet ticker = new FrameTicker(30); // Create at 30fps and start\nlet ticker = new FrameTicker(30, 15); // Create at 30fps, but with a minimum of 15 calls per second, and start\nlet ticker = new FrameTicker(NaN, NaN, true); // Creates at paused state\n```\n\nThen, add callbacks using [simplesignal](https://www.npmjs.com/package/simplesignal) events:\n\n```javascript\nlooper.onTick.add((timeSeconds, tickDeltaSeconds, currentFrame) => {\n\tconsole.log(`Executing for ${timeSeconds} seconds, delta since last tick is ${tickDeltaSeconds}, current frame is ${currentFrame}.`);\n});\n```\n\nA typical implementation in games is moving things at a certain speed per seconds. Example:\n\n```javascript\nprivate function onTick(currentTimeSeconds:number, tickDeltaTimeSeconds:number, currentTick:number):void {\n    let speed = 10; // Speed of the box, in pixels per seconds\n    box.x += speed * tickDeltaTimeSeconds;\n}\n\nlooper.onTick.add(onTick);\n```\n\nYou can also pause/resume the looper to pause/resume the game loop:\n\n```typescript\nlooper.pause();\nlooper.resume();\n```\n\nOt change the time scale to make time go \"faster\" (reflected in `timeSeconds` and `tickDeltaSeconds`):\n\n```typescript\nlooper.timeScale = 2; // 2x original speed (faster motion)\nlooper.timeScale = 0.5; // 0.5x original speed (slower motion)\n```\n\nWhen the `maxFPS` parameter is used, the looper is not dispatched more that number of times per second:\n\n```typescript\n// Max 30 fps dispatching; will only fire once every other visual frame on a 60fps browser\nlet looper = new FrameTicker(30);\n```\n\nWhen the `minFPS` parameter is used, the looper is always dispatched at least that amount of times per second, regardless of the number of frames:\n\n```typescript\n// Max 120 fps dispatching; will fire twice per visual frame on a 60fps browser\nlet looper = new FrameTicker(NaN, 120);\n```\n\n## Full reference\n\n### `new FrameTicker(maxFPS:number = NaN, minFPS:number = NaN, paused:boolean = false):FrameTicker`\n\nGenerate a new FrameTicker instance.\n\nParameters:\n\n* `maxFPS`: Desired maximum framerate. Cause `onTick` calls to be skipped if the desired maximum framerate is lower than the current environment maximum. `NaN` means no maximum.\n* `minFPS`: Desired minimum framerate. Cause `onTick` calls to be repeated more than once per frame if the desired minimum framerate is higher than the current environment maximum. Careful when using this, since it can create performance problems in low-performance situations; it can't magically makes thing faster. `NaN` means no minimum.\n* `paused`: Whether it's paused at start or not.\n\nReturn:\n\n* A new `FrameTicker` instance.\n\n\n### `updateOnce(callback:(timeSeconds:number, tickDeltaSeconds:number, currentFrame:number) => void)`\n\n### `resume()`\n### `pause()`\n### `dispose()`\n### `currentTick:number`\n### `currentTimeSeconds:number`\n### `tickDeltaTimeSeconds:number`\n### `timeScale:number`\n### `onResume:SimpleSignal`\n\nCan use `.add(f)`, `.resume(f)`, `.removeAll`\n\n### `onPause:SimpleSignal`\n### `onTick:SimpleSignal`\n### `onTickOncePerFrame:SimpleSignal`\n\n\n\n## License\n\n[MIT](LICENSE.md).","users":{}}