|
31 | 31 | () => elem.removeEventListener(evt, callback, false)
|
32 | 32 | );
|
33 | 33 | }, isFinite = Number.isFinite, defaults = {
|
34 |
| - fullscreen: true, |
35 | 34 | width: null,
|
36 | 35 | height: null,
|
37 | 36 | autoscale: true,
|
|
46 | 45 | animate: true
|
47 | 46 | };
|
48 | 47 | settings = Object.assign(defaults, settings);
|
49 |
| - let _initialized = false, _plugins = [], _canvas = settings.canvas || document.createElement("canvas"), _fullscreen = settings.fullscreen, _autoscale = settings.autoscale, _animated = settings.animate, _scale = 1, _ctx, _outline_fix = 0.5, _timeScale = 1, _lastFrameTime, _deltaTime, _accumulated = 0, _rafid, _fontFamily = "sans-serif", _fontSize = 32, _rng_seed = Date.now(), _global = settings.global, _events = { |
| 48 | + let _initialized = false, _plugins = [], _canvas = settings.canvas || document.createElement("canvas"), _autoscale = settings.autoscale, _animated = settings.animate, _scale = 1, _ctx, _outline_fix = 0.5, _timeScale = 1, _lastFrameTime, _deltaTime, _accumulated = 0, _rafid, _fontFamily = "sans-serif", _fontSize = 32, _rng_seed = Date.now(), _global = settings.global, _events = { |
50 | 49 | init: null,
|
51 | 50 | update: null,
|
52 | 51 | draw: null,
|
|
889 | 888 | "string" === typeof eventName,
|
890 | 889 | "emit: 1st param must be a string"
|
891 | 890 | );
|
892 |
| - triggerEvent("before:" + eventName, arg1, arg2, arg3, arg4); |
893 |
| - triggerEvent(eventName, arg1, arg2, arg3, arg4); |
894 |
| - triggerEvent("after:" + eventName, arg1, arg2, arg3, arg4); |
| 891 | + if (_initialized) { |
| 892 | + triggerEvent("before:" + eventName, arg1, arg2, arg3, arg4); |
| 893 | + triggerEvent(eventName, arg1, arg2, arg3, arg4); |
| 894 | + triggerEvent("after:" + eventName, arg1, arg2, arg3, arg4); |
| 895 | + } |
895 | 896 | },
|
896 | 897 | /**
|
897 | 898 | * Get a color by index
|
|
932 | 933 | * @param {number} height
|
933 | 934 | */
|
934 | 935 | resize(width, height) {
|
935 |
| - DEV: assert(isFinite(width), "resize: 1st param must be a number"); |
936 |
| - DEV: assert(isFinite(height), "resize: 2nd param must be a number"); |
| 936 | + DEV: assert( |
| 937 | + isFinite(width) && width > 0, |
| 938 | + "resize: 1st param must be a number" |
| 939 | + ); |
| 940 | + DEV: assert( |
| 941 | + isFinite(height) && height > 0, |
| 942 | + "resize: 2nd param must be a number" |
| 943 | + ); |
937 | 944 | instance.setvar("WIDTH", _canvas.width = width);
|
938 | 945 | instance.setvar("HEIGHT", _canvas.height = height);
|
939 |
| - pageResized(); |
| 946 | + instance.setvar("CENTERX", instance.WIDTH / 2); |
| 947 | + instance.setvar("CENTERY", instance.HEIGHT / 2); |
| 948 | + onResize(); |
940 | 949 | },
|
941 | 950 | /**
|
942 | 951 | * The scale of the game's delta time (dt).
|
|
994 | 1003 | for (const [callback, config] of _plugins) {
|
995 | 1004 | loadPlugin(callback, config);
|
996 | 1005 | }
|
997 |
| - if (_fullscreen || _autoscale) { |
998 |
| - on(root, "resize", pageResized); |
| 1006 | + if (_autoscale) { |
| 1007 | + on(root, "resize", onResize); |
999 | 1008 | }
|
1000 |
| - pageResized(); |
1001 | 1009 | if (settings.tapEvents) {
|
1002 | 1010 | const _getXY = (pageX, pageY) => [
|
1003 | 1011 | (pageX - _canvas.offsetLeft) / _scale,
|
|
1134 | 1142 | }
|
1135 | 1143 | let updated = 0, frameTime = (now - _lastFrameTime) / 1e3;
|
1136 | 1144 | _lastFrameTime = now;
|
1137 |
| - if (frameTime > _deltaTime * 30) |
1138 |
| - return console.log("skipping too long frame"); |
1139 |
| - _accumulated += frameTime; |
1140 |
| - if (!_animated) { |
1141 |
| - _accumulated = _deltaTime; |
1142 |
| - } |
1143 |
| - for (; _accumulated >= _deltaTime; _accumulated -= _deltaTime) { |
1144 |
| - instance.emit("update", _deltaTime * _timeScale); |
1145 |
| - instance.setvar( |
1146 |
| - "ELAPSED", |
1147 |
| - instance.ELAPSED + _deltaTime * _timeScale |
1148 |
| - ); |
1149 |
| - updated++; |
| 1145 | + if (frameTime > _deltaTime * 30) { |
| 1146 | + console.log("skipping too long frame"); |
| 1147 | + } else { |
| 1148 | + _accumulated += frameTime; |
| 1149 | + if (!_animated) { |
| 1150 | + _accumulated = _deltaTime; |
| 1151 | + } |
| 1152 | + for (; _accumulated >= _deltaTime; _accumulated -= _deltaTime) { |
| 1153 | + instance.emit("update", _deltaTime * _timeScale); |
| 1154 | + instance.setvar( |
| 1155 | + "ELAPSED", |
| 1156 | + instance.ELAPSED + _deltaTime * _timeScale |
| 1157 | + ); |
| 1158 | + updated++; |
| 1159 | + } |
1150 | 1160 | }
|
1151 |
| - if (updated) { |
| 1161 | + if (updated || !_animated) { |
1152 | 1162 | instance.textalign("start", "top");
|
1153 | 1163 | instance.emit("draw");
|
1154 | 1164 | }
|
|
1160 | 1170 | "Invalid canvas element"
|
1161 | 1171 | );
|
1162 | 1172 | DEV: assert(
|
1163 |
| - null === instance.WIDTH || instance.WIDTH > 0, |
| 1173 | + null == instance.WIDTH || instance.WIDTH > 0, |
1164 | 1174 | `Litecanvas' "width" option should be null or a positive number`
|
1165 | 1175 | );
|
1166 | 1176 | DEV: assert(
|
1167 |
| - null === instance.HEIGHT || instance.HEIGHT > 0, |
| 1177 | + null == instance.HEIGHT || instance.HEIGHT > 0, |
1168 | 1178 | `Litecanvas' "width" option should be null or a positive number`
|
1169 | 1179 | );
|
| 1180 | + DEV: assert( |
| 1181 | + null == instance.HEIGHT || instance.WIDTH > 0 && instance.HEIGHT > 0, |
| 1182 | + `Litecanvas' "width" is required when "heigth" is passed` |
| 1183 | + ); |
1170 | 1184 | instance.setvar("CANVAS", _canvas);
|
1171 | 1185 | _ctx = _canvas.getContext("2d");
|
1172 | 1186 | on(_canvas, "click", () => root.focus());
|
1173 |
| - if (instance.WIDTH > 0) { |
1174 |
| - _fullscreen = false; |
1175 |
| - } |
1176 | 1187 | _canvas.style = "";
|
1177 |
| - _canvas.width = instance.WIDTH; |
1178 |
| - _canvas.height = instance.HEIGHT || instance.WIDTH; |
| 1188 | + if (!instance.WIDTH) { |
| 1189 | + instance.WIDTH = root.innerWidth; |
| 1190 | + instance.HEIGHT = root.innerHeight; |
| 1191 | + } |
| 1192 | + instance.resize(instance.WIDTH, instance.HEIGHT, false); |
1179 | 1193 | if (!_canvas.parentNode) document.body.appendChild(_canvas);
|
1180 | 1194 | }
|
1181 |
| - function pageResized() { |
1182 |
| - const pageWidth = root.innerWidth, pageHeight = root.innerHeight, styles = _canvas.style; |
1183 |
| - styles.display = "block"; |
1184 |
| - if (_fullscreen) { |
1185 |
| - styles.position = "absolute"; |
1186 |
| - styles.inset = 0; |
1187 |
| - instance.setvar("WIDTH", _canvas.width = pageWidth); |
1188 |
| - instance.setvar("HEIGHT", _canvas.height = pageHeight); |
1189 |
| - } else if (_autoscale) { |
1190 |
| - styles.margin = "auto"; |
| 1195 | + function onResize() { |
| 1196 | + const styles = _canvas.style; |
| 1197 | + if (_autoscale) { |
| 1198 | + if (!styles.display) { |
| 1199 | + styles.display = "block"; |
| 1200 | + styles.margin = "auto"; |
| 1201 | + } |
1191 | 1202 | _scale = Math.min(
|
1192 |
| - pageWidth / instance.WIDTH, |
1193 |
| - pageHeight / instance.HEIGHT |
| 1203 | + root.innerWidth / instance.WIDTH, |
| 1204 | + root.innerHeight / instance.HEIGHT |
1194 | 1205 | );
|
1195 | 1206 | _scale = (settings.pixelart ? ~~_scale : _scale) || 1;
|
1196 | 1207 | styles.width = instance.WIDTH * _scale + "px";
|
1197 | 1208 | styles.height = instance.HEIGHT * _scale + "px";
|
1198 | 1209 | }
|
1199 |
| - instance.setvar("CENTERX", instance.WIDTH / 2); |
1200 |
| - instance.setvar("CENTERY", instance.HEIGHT / 2); |
1201 | 1210 | if (!settings.antialias || settings.pixelart) {
|
1202 | 1211 | _ctx.imageSmoothingEnabled = false;
|
1203 | 1212 | styles.imageRendering = "pixelated";
|
|
0 commit comments