@eva/react-eva
Version:
React EVA是一个让开发同学能够在React技术体系下,利用EVA JS的游戏研发能力,开发动画、游戏类场景的框架。它可以让开发同学用熟悉的JSX和Hooks语法编写动画、游戏场景的代码。
196 lines (164 loc) • 8.82 kB
JavaScript
;
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;