UNPKG

@eva/react-eva

Version:

React EVA是一个让开发同学能够在React技术体系下,利用EVA JS的游戏研发能力,开发动画、游戏类场景的框架。它可以让开发同学用熟悉的JSX和Hooks语法编写动画、游戏场景的代码。

196 lines (164 loc) 8.82 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = require("react"); var _eva = require("@eva/eva.js"); var _instance = _interopRequireDefault(require("../misc/instance")); var _preload = _interopRequireDefault(require("../misc/preload")); var _context = require("../misc/context"); var _fiberEva = _interopRequireDefault(require("@eva/fiber-eva")); var _excluded = ["preloadResources", "preloadTimeout", "onPreloadStart", "onPreloadProgress", "onPreloadLoaded", "onPreloadComplete", "onPreloadError", "systems", "listeningProps", "children"], _excluded2 = ["systems", "listeningProps", "children"]; function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function initInstance(ref) { _instance["default"].rootElement = ref.current; _instance["default"].canvasElement = _instance["default"].rootElement.querySelector('canvas[eva-canvas=true]'); _instance["default"].backgroundElement = _instance["default"].rootElement.querySelector('div[eva-bg=true]'); _instance["default"].hudElement = _instance["default"].rootElement.querySelector('div[eva-hud=true]'); _instance["default"].gameInstance = _instance["default"].rootElement.gameInstance; _instance["default"].listeningProps = _instance["default"].rootElement.listeningProps; } function initPreload(preloadResources, preloadTimeout, onPreloadStart, onPreloadProgress, onPreloadLoaded, onPreloadComplete, onPreloadError) { onPreloadStart && _preload["default"].onStart(onPreloadStart); onPreloadProgress && _preload["default"].onProgress(onPreloadProgress); onPreloadLoaded && _preload["default"].onLoaded(onPreloadLoaded); onPreloadComplete && _preload["default"].onComplete(onPreloadComplete); onPreloadError && _preload["default"].onError(onPreloadError); var resources = []; if (preloadResources instanceof Array) { for (var _iterator = _createForOfIteratorHelperLoose(preloadResources), _step; !(_step = _iterator()).done;) { var res = _step.value; if (typeof res === 'object') { if (res.name !== undefined) { res.preload = true; resources.push(res); _preload["default"].resources[res.name] = res.name; } else { throw new Error("\"Name\" prop is Necessary: " + JSON.stringify(res)); } } else { throw new Error("Resource Data Should Be An Object: " + JSON.stringify(res)); } } } else if (typeof preloadResources === 'object') { for (var name in preloadResources) { var _res = preloadResources[name]; var resourceId = void 0; if (typeof _res === 'object') { _res.preload = true; resourceId = _res.name; resources.push(_res); } else if (typeof _res === 'string') { resourceId = _res; } else { throw new Error("Resource Data Should Be An Object Or ResourceId: " + JSON.stringify(_res)); } _preload["default"].resources[name] = resourceId; } } else { throw new Error("Resource Data Should Be An Array or An Object: " + JSON.stringify(preloadResources)); } _eva.resource.addResource(resources); _eva.resource.timeout = preloadTimeout; _eva.resource.preload(); } //https://github.com/facebook/react/issues/13336 //react does not currently support seamlessly passing context var Eva = /*#__PURE__*/(0, _react.forwardRef)(function (_ref2, ref) { var _ref2$preloadResource = _ref2.preloadResources, preloadResources = _ref2$preloadResource === void 0 ? [] : _ref2$preloadResource, _ref2$preloadTimeout = _ref2.preloadTimeout, preloadTimeout = _ref2$preloadTimeout === void 0 ? 30 * 1000 : _ref2$preloadTimeout, onPreloadStart = _ref2.onPreloadStart, onPreloadProgress = _ref2.onPreloadProgress, onPreloadLoaded = _ref2.onPreloadLoaded, onPreloadComplete = _ref2.onPreloadComplete, onPreloadError = _ref2.onPreloadError, _ref2$systems = _ref2.systems, systems = _ref2$systems === void 0 ? [] : _ref2$systems, _ref2$listeningProps = _ref2.listeningProps, listeningProps = _ref2$listeningProps === void 0 ? [] : _ref2$listeningProps, children = _ref2.children, props = (0, _objectWithoutPropertiesLoose2["default"])(_ref2, _excluded); var _ref = (0, _react.useRef)(null); (0, _react.useImperativeHandle)(ref, function () { return _instance["default"]; }, []); (0, _react.useMemo)(function () { initPreload(preloadResources, preloadTimeout, onPreloadStart, onPreloadProgress, onPreloadLoaded, onPreloadComplete, onPreloadError); }, []); (0, _react.useLayoutEffect)(function () { initInstance(_ref); return function () { if (_instance["default"].gameInstance) { try { _instance["default"].gameInstance.pause(); _instance["default"].gameInstance.destroy(); } catch (e) {} } }; }, []); return /*#__PURE__*/React.createElement(_context.instanceContext.Provider, { value: _instance["default"] }, /*#__PURE__*/React.createElement(_context.preloadContext.Provider, { value: _preload["default"] }, /*#__PURE__*/React.createElement(_context.preloadContext.Consumer, null, function (value) { return /*#__PURE__*/React.createElement("eva", (0, _extends2["default"])({}, props, { value: _preload["default"], ref: _ref, systems: systems, listeningProps: listeningProps }), /*#__PURE__*/React.createElement(_context.preloadContext.Provider, { value: value }, children)); }))); }); var EvaContainer = /*#__PURE__*/(0, _react.forwardRef)(function (args, ref) { var _args$systems = args.systems, systems = _args$systems === void 0 ? [] : _args$systems, _args$listeningProps = args.listeningProps, listeningProps = _args$listeningProps === void 0 ? [] : _args$listeningProps, children = args.children, props = (0, _objectWithoutPropertiesLoose2["default"])(args, _excluded2); var _container = (0, _react.useRef)(null); (0, _react.useImperativeHandle)(ref, function () { return _instance["default"]; }, []); var systemsMemo = (0, _react.useMemo)(function () { return [].concat(_instance["default"].systems, systems); }, []); var listeningPropsMemo = (0, _react.useMemo)(function () { return [].concat(_instance["default"].listeningProps, listeningProps); }, []); (0, _react.useLayoutEffect)(function () { var root = _container.current; var render = _fiberEva["default"].render; render( /*#__PURE__*/React.createElement(Eva, (0, _extends2["default"])({}, props, { systems: systemsMemo, listeningProps: listeningPropsMemo }), children), root, (0, _extends2["default"])({}, props, { systems: systemsMemo, listeningProps: listeningPropsMemo })); }, [props, children, systemsMemo, listeningPropsMemo]); (0, _react.useLayoutEffect)(function () { var root = _container.current; var unmountComponentAtNode = _fiberEva["default"].unmountComponentAtNode; return function () { unmountComponentAtNode(root); }; }, []); return /*#__PURE__*/React.createElement("div", { ref: _container, style: (0, _extends2["default"])({ width: args.width, height: args.height }, args.style) }); }); var _default = /*#__PURE__*/(0, _react.memo)(EvaContainer); exports["default"] = _default;