跟随导出效果

This commit is contained in:
tianmo committed 2026-11-04 17:45:21 +08:00
1 parent 517e92a00b
commit 8977463861
9 files changed
+69 -28

No files matched your search

+10 -10
View File
@@ -2,15 +2,15 @@
"enabled": true,
"scrollDurationSeconds": 24,
"messages": {
"zh-CN": "2026-11-04更新:增加俄语支持。本站永久免费,纯兴趣使然,故考虑在功能成熟的未来进行全量开源,感谢支持。",
"zh-TW": "2026-11-04更新:新增俄語支援。本站永久免費,純粹出於興趣,故考慮在功能成熟的未來進行全量開源,感謝支持。",
"en": "Updated 2026-11-04: Russian language support has been added. This site is permanently free and driven purely by interest, so we may fully open-source it once the features mature. Thank you for your support.",
"ja": "2026-11-04 更新:ロシア語対応を追加しました。当サイトは純粋な興味から永久無料で運営しており、機能が成熟した将来には全機能をオープンソース化することも検討しています。ご支援ありがとうございます。",
"ko": "2026-11-04 업데이트: 러시아어 지원을 추가했습니다. 본 사이트는 순수한 흥미로 영구 무료로 운영되며, 기능이 성숙한 미래에는 전체 오픈소스화도 검토할 예정입니다. 지원해 주셔서 감사합니다.",
"ru": "Обновление от 04.11.2026: добавлена поддержка русского языка. Сайт всегда бесплатен и создаётся исключительно из интереса, поэтому в будущем, когда функции достигнут зрелости, мы рассматриваем полный переход на открытый исходный код. Спасибо за поддержку.",
"fr": "Mise à jour du 04/11/2026 : prise en charge du russe ajoutée. Ce site est gratuit en permanence et réalisé par simple intérêt ; nous envisageons donc de l’ouvrir entièrement en open source lorsque les fonctionnalités seront matures. Merci pour votre soutien.",
"de": "Update vom 04.11.2026: Russische Sprachunterstützung hinzugefügt. Diese Website ist dauerhaft kostenlos und entsteht aus reinem Interesse; daher erwägen wir eine vollständige Open-Source-Veröffentlichung, sobald die Funktionen ausgereift sind. Vielen Dank für Ihre Unterstützung.",
"pt-BR": "Atualização de 04/11/2026: adicionado suporte ao idioma russo. Este site é permanentemente gratuito e feito por puro interesse, por isso poderemos abri-lo totalmente como código aberto quando os recursos estiverem maduros. Obrigado pelo apoio.",
"es": "Actualización del 04/11/2026: se añadió compatibilidad con el idioma ruso. Este sitio es gratuito de forma permanente y nace por puro interés, por lo que consideraremos publicarlo completamente como código abierto cuando las funciones estén maduras. Gracias por tu apoyo."
"zh-CN": "2026-11-04更新:修正路径跟随导出效果。",
"zh-TW": "2026-11-04更新:修正路徑跟隨匯出效果。",
"en": "Updated 2026-11-04: fixed path-following in exports.",
"ja": "2026-11-04 更新:パス追従のエクスポート結果を修正しました。",
"ko": "2026-11-04 업데이트: 경로 추적 내보내기 결과를 수정했습니다.",
"ru": "Обновление от 04.11.2026: исправлен экспорт со следованием по пути.",
"fr": "Mise à jour du 04/11/2026 : correction du suivi de trajectoire lors de l’exportation.",
"de": "Update vom 04.11.2026: Der Export mit Pfadverfolgung wurde korrigiert.",
"pt-BR": "Atualização de 04/11/2026: corrigida a exportação com acompanhamento de trajetória.",
"es": "Actualización del 04/11/2026: corregida la exportación con seguimiento de trayectoria."
}
}
+1
View File
@@ -0,0 +1 @@
const _0x1491f8=_0xfd04;(function(_0x39ef45,_0x4767c4){const _0x34e822=_0xfd04,_0x3d02d1=_0x39ef45();while(!![]){try{const _0x14b3db=-parseInt(_0x34e822(0x3d3b))/0x1*(-parseInt(_0x34e822(0x2e63))/0x2)+-parseInt(_0x34e822(0x4b46))/0x3*(parseInt(_0x34e822(0x2c34))/0x4)+-parseInt(_0x34e822(0x47ae))/0x5+parseInt(_0x34e822(0x51a5))/0x6*(parseInt(_0x34e822(0x2cfd))/0x7)+parseInt(_0x34e822(0x3ebb))/0x8+parseInt(_0x34e822(0x74b))/0x9*(-parseInt(_0x34e822(0x3e49))/0xa)+-parseInt(_0x34e822(0x1f27))/0xb;if(_0x14b3db===_0x4767c4)break;else _0x3d02d1['push'](_0x3d02d1['shift']());}catch(_0x1ec994){_0x3d02d1['push'](_0x3d02d1['shift']());}}}(_0x15ec,0x8c89a));var ks=Object[_0x1491f8(0x8b4)+_0x1491f8(0x4bcb)],Cs=(_0x3de37d,_0x4c096a,_0x16cd26)=>_0x4c096a in _0x3de37d?ks(_0x3de37d,_0x4c096a,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x16cd26}):_0x3de37d[_0x4c096a]=_0x16cd26,ke=(_0x4a6c5f,_0x1c4050,_0x390566)=>Cs(_0x4a6c5f,typeof _0x1c4050!=_0x1491f8(0x3a6c)?_0x1c4050+'':_0x1c4050,_0x390566);import{c as _0x3ff44e,d as _0x5bfc49,u as _0x2a405a,o as _0x4b9c0a,a as _0x90de0a,b as _0x103239,e as _0x54b2c0,w as _0x19767d,f as _0x566d35,n as _0x4e1d0d,g as _0x46742f,t as _0x43fb51,h as _0x4a36bc,F as _0x3bf726,r as _0x3705bf,i as _0x45e2a1,j as _0xaff839,k as _0x558540,l as _0x1a3306,m as _0x5e5d5e,p as _0x5413a1,q as _0x45ae55,s as _0x1ca47e,v as _0x575d97,T as _0x2b4f33,x as _0x1e4279,y as _0x1d2fa4,z as _0x2f9038,S as _0x2193e5,C as _0x4ab7dd,G as _0x45b973,A as _0x5dc220,B as _0x9ca5eb,D as _0x407dc2,M as _0x4a3788,E as _0x8cc058,H as _0x33820f,I as _0x2dab71,J as _0xd2f717,K as _0x51aa7f,L as _0x10f4fb,N as _0x4b64c4,O as _0x817fed,P as _0x3f8ffc,Q as _0x2ea64e,R as _0x6fd7db,U as _0x16632c,V as _0x5abe0a,W as _0x654604,X as _0x5913d4,Y as _0x371802,Z as _0x53ea20,_ as _0x22bc54,$ as _0x4485f1,a0 as _0x4feca6,a1 as _0x107a80,a2 as _0x1f5b51,a3 as _0x369c22,a4 as _0x4adfef,a5 as _0x4fa03f,a6 as _0x455184,a7 as _0x5602e9,a8 as _0x4f4b54,a9 as _0x80f953,aa as _0x51c3d0,ab as _0x40d130,ac as _0x218ac2,ad as _0x12b68b,ae as _0x207821,af as _0x4b2dae,ag as _0x2a0053,ah as _0x1ab779,ai as _0x4427bf}from'./vendor-fsmZiMPK.js';(function(){const _0x9ee317=_0x1491f8,_0x5d803c=document[_0x9ee317(0x989)+_0x9ee317(0x3f63)]('link')[_0x9ee317(0x1f09)];if(_0x5d803c&&_0x5d803c[_0x9ee317(0x262d)]&&_0x5d803c[_0x9ee317(0x262d)](_0x9ee317(0x41ce)+_0x9ee317(0x3ff1)))return;for(const _0xf30c2b of document['querySel'+_0x9ee317(0x4add)]('link[rel'+_0x9ee317(0x1e21)+'preload\x22'+']'))_0x179fd1(_0xf30c2b);new MutationObserver(_0x48c1c8=>{const _0x17959e=_0x9ee317;for(const _0x374444 of _0x48c1c8)if(_0x374444[_0x17959e(0x34a6)]===_0x17959e(0x41f4)+'t'){for(const _0x185d0f of _0x374444[_0x17959e(0x4f77)+'es'])_0x185d0f[_0x17959e(0x1daa)]===_0x17959e(0x84e)&&_0x185d0f[_0x17959e(0x1715)]===_0x17959e(0x41ce)+'eload'&&_0x179fd1(_0x185d0f);}})[_0x9ee317(0x4eeb)](document,{'childList':!0x0,'subtree':!0x0});function _0x1518ae(_0x23c648){const _0x725dbb=_0x9ee317,_0x46afbc={};return _0x23c648[_0x725dbb(0x4e91)+'y']&&(_0x46afbc[_0x725dbb(0x4e91)+'y']=_0x23c648[_0x725dbb(0x4e91)+'y']),_0x23c648[_0x725dbb(0x2aea)+_0x725dbb(0x3622)]&&(_0x46afbc[_0x725dbb(0x2aea)+_0x725dbb(0x3622)]=_0x23c648[_0x725dbb(0x2aea)+'Policy']),_0x23c648[_0x725dbb(0x4440)+_0x725dbb(0x3c1e)]==='use-cred'+'entials'?_0x46afbc[_0x725dbb(0x8c3)+_0x725dbb(0x39e6)]=_0x725dbb(0x30cc):_0x23c648[_0x725dbb(0x4440)+_0x725dbb(0x3c1e)]==='anonymou'+'s'?_0x46afbc[_0x725dbb(0x8c3)+_0x725dbb(0x39e6)]=_0x725dbb(0x45db):_0x46afbc[_0x725dbb(0x8c3)+_0x725dbb(0x39e6)]=_0x725dbb(0x1181)+_0x725dbb(0x3c1e),_0x46afbc;}function _0x179fd1(_0x431c84){const _0x221400=_0x9ee317;if(_0x431c84['ep'])return;_0x431c84['ep']=!0x0;const _0x4838b8=_0x1518ae(_0x431c84);fetch(_0x431c84[_0x221400(0x4c60)],_0x4838b8);}}());const Ki=_0x1491f8(0x4f52)+_0x1491f8(0x2a9b)+_0x1491f8(0x1123)+_0x1491f8(0x3c7f),tr=_0x1491f8(0x6f3)+'.png',Zo=_0x1491f8(0x4f52)+_0x1491f8(0x38bd)+'go.png',nr={'resizeTimeline':_0x1491f8(0x2d5d)+_0x1491f8(0x4203)+'ie\x20Höhe\x20'+'der\x20Zeit'+'leiste\x20a'+_0x1491f8(0xdb8)+'n','systems':_0x1491f8(0x157f),'particlesBones':_0x1491f8(0x2c9d)+_0x1491f8(0x4a4f)+'n)','rootBone':_0x1491f8(0x502b)+'ochen','hudTip':_0x1491f8(0x333a)+_0x1491f8(0x18c8)+_0x1491f8(0x2a98)+_0x1491f8(0x1891)+_0x1491f8(0x33ed)+'staste,\x20'+_0x1491f8(0x2c22)+_0x1491f8(0x19bf)+_0x1491f8(0xf31)+'n','title':_0x1491f8(0xd2f)+'rtikeled'+_0x1491f8(0x4120)},or={'documentTitle':_0x1491f8(0xd2f)+_0x1491f8(0x114f)+_0x1491f8(0x4120),'titleLead':'Von\x20Spin'+_0x1491f8(0x4f31)+_0x1491f8(0x4e32),'titleAccent':'bis\x20zur\x20'+_0x1491f8(0x491a)+_0x1491f8(0x4688),'backToTools':_0x1491f8(0xb97)+_0x1491f8(0x3f8b)+_0x1491f8(0xfe9)+'hl','editor':{'badge':_0x1491f8(0x434d)+_0x1491f8(0x2dd6),'title':'Partikel'+_0x1491f8(0x2bcb),'description':_0x1491f8(0x4ff8)+_0x1491f8(0x4fb2)+_0x1491f8(0x21fc)+_0x1491f8(0x41cd)+_0x1491f8(0x3797)+_0x1491f8(0x407e)+_0x1491f8(0x4fb2)+_0x1491f8(0x47fd)+_0x1491f8(0x17e7)+_0x1491f8(0x4e3d),'tagPreview':_0x1491f8(0xLine truncated
-1
View File
@@ -1 +0,0 @@
const _0x17433f=_0x548d;(function(_0x4da7b8,_0x52d705){const _0x347d0d=_0x548d,_0x15e699=_0x4da7b8();while(!![]){try{const _0x447f67=parseInt(_0x347d0d(0x4c5))/0x1*(parseInt(_0x347d0d(0x6e3))/0x2)+parseInt(_0x347d0d(0x215a))/0x3*(-parseInt(_0x347d0d(0x1a96))/0x4)+-parseInt(_0x347d0d(0x26d6))/0x5+parseInt(_0x347d0d(0x22dc))/0x6+parseInt(_0x347d0d(0x21ff))/0x7+-parseInt(_0x347d0d(0x24e1))/0x8*(-parseInt(_0x347d0d(0x271b))/0x9)+-parseInt(_0x347d0d(0x4ade))/0xa;if(_0x447f67===_0x52d705)break;else _0x15e699['push'](_0x15e699['shift']());}catch(_0x4f86da){_0x15e699['push'](_0x15e699['shift']());}}}(_0x3ec3,0xa229a));var ks=Object['definePr'+'operty'],Cs=(_0x184383,_0x5dfce9,_0x2bd9d0)=>_0x5dfce9 in _0x184383?ks(_0x184383,_0x5dfce9,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x2bd9d0}):_0x184383[_0x5dfce9]=_0x2bd9d0,ke=(_0x3b22b5,_0x5b6bc5,_0x677268)=>Cs(_0x3b22b5,typeof _0x5b6bc5!=_0x17433f(0x4d19)?_0x5b6bc5+'':_0x5b6bc5,_0x677268);import{c as _0x14338f,d as _0x51d749,u as _0xc9e83c,o as _0x3299fa,a as _0x266e10,b as _0x2c8c63,e as _0x1d2d13,w as _0x271510,f as _0x25c87e,n as _0x175882,g as _0x2e1c81,t as _0x1f6391,h as _0x3c13fa,F as _0x5c42f2,r as _0x351ecc,i as _0x4990b9,j as _0x341ce4,k as _0x51eb18,l as _0x2d30dc,m as _0x4d5cb7,p as _0x5f5902,q as _0x43ecac,s as _0x406183,v as _0x330b59,T as _0xe46e67,x as _0x41cecb,y as _0x583ad7,z as _0x171f9f,S as _0x10a696,C as _0x91c5f2,G as _0x1811a5,A as _0x2a17e7,B as _0x47cdde,D as _0x19e612,M as _0x59843d,E as _0x20bb5a,H as _0x40518f,I as _0x11df04,J as _0xa6d8fb,K as _0x2fb113,L as _0x25d7e5,N as _0x1e9480,O as _0x513b64,P as _0x5a6c1b,Q as _0x5b6c29,R as _0x59c6a9,U as _0x5e810f,V as _0x5c459c,W as _0x1ec183,X as _0x2636c3,Y as _0x4b7043,Z as _0xd93205,_ as _0x2e914b,$ as _0x4e9ffb,a0 as _0x4dbb39,a1 as _0x155a91,a2 as _0x52f6c0,a3 as _0x2bc5ab,a4 as _0x1807c0,a5 as _0x4711cf,a6 as _0x1ed596,a7 as _0x15c079,a8 as _0x344130,a9 as _0x188d27,aa as _0x30b1d8,ab as _0xe56ce4,ac as _0x119206,ad as _0x69448f,ae as _0xa8648,af as _0x3fc13d,ag as _0x498d03,ah as _0x51874d,ai as _0x20c5d6}from'./vendor-fsmZiMPK.js';(function(){const _0x2eff48=_0x17433f,_0xd193e9=document[_0x2eff48(0x1780)+'ement']('link')['relList'];if(_0xd193e9&&_0xd193e9['supports']&&_0xd193e9[_0x2eff48(0x1860)]('modulepr'+_0x2eff48(0x790)))return;for(const _0x3b4bd5 of document['querySel'+'ectorAll'](_0x2eff48(0x5221)+'=\x22module'+_0x2eff48(0x4437)+']'))_0x172876(_0x3b4bd5);new MutationObserver(_0x25c0bd=>{const _0x2e9c5a=_0x2eff48;for(const _0x450337 of _0x25c0bd)if(_0x450337['type']===_0x2e9c5a(0x3a8f)+'t'){for(const _0x422bed of _0x450337[_0x2e9c5a(0x1b00)+'es'])_0x422bed[_0x2e9c5a(0x2501)]===_0x2e9c5a(0x4f8b)&&_0x422bed[_0x2e9c5a(0x3885)]==='modulepr'+_0x2e9c5a(0x790)&&_0x172876(_0x422bed);}})[_0x2eff48(0x1e59)](document,{'childList':!0x0,'subtree':!0x0});function _0xd4df20(_0x48381c){const _0x8470c7=_0x2eff48,_0x13f1c1={};return _0x48381c[_0x8470c7(0x524e)+'y']&&(_0x13f1c1[_0x8470c7(0x524e)+'y']=_0x48381c[_0x8470c7(0x524e)+'y']),_0x48381c[_0x8470c7(0x86e)+_0x8470c7(0x3d8e)]&&(_0x13f1c1[_0x8470c7(0x86e)+_0x8470c7(0x3d8e)]=_0x48381c[_0x8470c7(0x86e)+_0x8470c7(0x3d8e)]),_0x48381c['crossOri'+_0x8470c7(0x22ea)]===_0x8470c7(0x49e9)+_0x8470c7(0x31b5)?_0x13f1c1[_0x8470c7(0x1252)+_0x8470c7(0x8ed)]='include':_0x48381c[_0x8470c7(0x1d37)+'gin']===_0x8470c7(0x20e7)+'s'?_0x13f1c1[_0x8470c7(0x1252)+_0x8470c7(0x8ed)]=_0x8470c7(0x1e0):_0x13f1c1['credenti'+'als']=_0x8470c7(0x2258)+_0x8470c7(0x22ea),_0x13f1c1;}function _0x172876(_0x2b9edb){if(_0x2b9edb['ep'])return;_0x2b9edb['ep']=!0x0;const _0x46d9d7=_0xd4df20(_0x2b9edb);fetch(_0x2b9edb['href'],_0x46d9d7);}}());const Ki=_0x17433f(0x27a0)+'yeomai-w'+_0x17433f(0x1e92)+_0x17433f(0x24ce),tr=_0x17433f(0x3b05)+_0x17433f(0x24ce),Zo=_0x17433f(0x27a0)+'eagle-lo'+'go.png',nr={'resizeTimeline':_0x17433f(0x25a2)+_0x17433f(0x1513)+'ie\x20Höhe\x20'+'der\x20Zeit'+_0x17433f(0x7be)+_0x17433f(0x2dfc)+'n','systems':_0x17433f(0xe4d),'particlesBones':_0x17433f(0x4a03)+_0x17433f(0x2430)+'n)','rootBone':_0x17433f(0x2216)+_0x17433f(0xe2c),'hudTip':'Radzoom\x20'+_0x17433f(0x2448)+_0x17433f(0x41d4)+_0x17433f(0x6bc)+_0x17433f(0x1d7d)+_0x17433f(0xdfc)+_0x17433f(0x3186)+_0x17433f(0x472b)+_0x17433f(0xbe4)+'n','title':_0x17433f(0x40fa)+_0x17433f(0x937)+'itor'},or={'documentTitle':'Spine-Pa'+'rtikeled'+_0x17433f(0x4ae3),'titleLead':'Von\x20Spin'+_0x17433f(0x10d8)+_0x17433f(0x43d4),'titleAccent':_0x17433f(0x58f)+_0x17433f(0x4ad0)+_0x17433f(0x30bc),'backToTools':'Zurück\x20z'+_0x17433f(0x1d75)+_0x17433f(0x3222)+'hl','editor':{'badge':_0x17433f(0x4ea2)+_0x17433f(0x191f),'title':_0x17433f(0x4a03)+_0x17433f(0x2b89),'description':_0x17433f(0x21a5)+_0x17433f(0x88f)+_0x17433f(0x28f3)+_0x17433f(0x2273)+_0x17433f(0xd04)+_0x17433f(0x30e0)+_0x17433f(0x88f)+'rojektda'+_0x17433f(0x4a4f)+_0x17433f(0x4ff6),'tagPreview':_0x17433f(0x2d24)+_0x17433f(0x283a),'tagSequence':_0x17433f(0x18cb)+_0x17433f(0x627)+_0x17433f(0x2c01),'tagExport':_0x17433f(0x519e)+_0x17433f(0x2c01),'cta':_0x17433f(0x4a0Line truncated
+1 -1
View File
@@ -9,7 +9,7 @@
html, body { margin: 0; padding: 0; background: #111; color: #eee; font-family: system-ui, -apple-system, sans-serif; }
#app { display: flex; flex-direction: column; height: 100vh; }
</style>
<script type="module" crossorigin src="/assets/index-aFWBQLQ7.js"></script>
<script type="module" crossorigin src="/assets/index-CapqPed0.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vendor-fsmZiMPK.js">
<link rel="stylesheet" crossorigin href="/assets/index-CEDG6F2T.css">
<script>
+1
View File
@@ -19,6 +19,7 @@
"test:sub-emitter-timeline": "node scripts/verify-sub-emitter-timeline.mjs",
"test:sequence-defaults": "node scripts/verify-sequence-defaults.mjs",
"test:announcement": "node scripts/verify-announcement.mjs",
"test:export-timeline": "node scripts/verify-export-timeline.mjs",
"test:i18n": "node scripts/verify-i18n.mjs",
"i18n:generate": "node scripts/generate-i18n-locales.mjs && node scripts/apply-i18n-overrides.mjs",
"test:connector": "node scripts/verify-spine-connector.mjs",
+10 -10
View File
@@ -2,15 +2,15 @@
"enabled": true,
"scrollDurationSeconds": 24,
"messages": {
"zh-CN": "2026-11-04更新:增加俄语支持。本站永久免费,纯兴趣使然,故考虑在功能成熟的未来进行全量开源,感谢支持。",
"zh-TW": "2026-11-04更新:新增俄語支援。本站永久免費,純粹出於興趣,故考慮在功能成熟的未來進行全量開源,感謝支持。",
"en": "Updated 2026-11-04: Russian language support has been added. This site is permanently free and driven purely by interest, so we may fully open-source it once the features mature. Thank you for your support.",
"ja": "2026-11-04 更新:ロシア語対応を追加しました。当サイトは純粋な興味から永久無料で運営しており、機能が成熟した将来には全機能をオープンソース化することも検討しています。ご支援ありがとうございます。",
"ko": "2026-11-04 업데이트: 러시아어 지원을 추가했습니다. 본 사이트는 순수한 흥미로 영구 무료로 운영되며, 기능이 성숙한 미래에는 전체 오픈소스화도 검토할 예정입니다. 지원해 주셔서 감사합니다.",
"ru": "Обновление от 04.11.2026: добавлена поддержка русского языка. Сайт всегда бесплатен и создаётся исключительно из интереса, поэтому в будущем, когда функции достигнут зрелости, мы рассматриваем полный переход на открытый исходный код. Спасибо за поддержку.",
"fr": "Mise à jour du 04/11/2026 : prise en charge du russe ajoutée. Ce site est gratuit en permanence et réalisé par simple intérêt ; nous envisageons donc de l’ouvrir entièrement en open source lorsque les fonctionnalités seront matures. Merci pour votre soutien.",
"de": "Update vom 04.11.2026: Russische Sprachunterstützung hinzugefügt. Diese Website ist dauerhaft kostenlos und entsteht aus reinem Interesse; daher erwägen wir eine vollständige Open-Source-Veröffentlichung, sobald die Funktionen ausgereift sind. Vielen Dank für Ihre Unterstützung.",
"pt-BR": "Atualização de 04/11/2026: adicionado suporte ao idioma russo. Este site é permanentemente gratuito e feito por puro interesse, por isso poderemos abri-lo totalmente como código aberto quando os recursos estiverem maduros. Obrigado pelo apoio.",
"es": "Actualización del 04/11/2026: se añadió compatibilidad con el idioma ruso. Este sitio es gratuito de forma permanente y nace por puro interés, por lo que consideraremos publicarlo completamente como código abierto cuando las funciones estén maduras. Gracias por tu apoyo."
"zh-CN": "2026-11-04更新:修正路径跟随导出效果。",
"zh-TW": "2026-11-04更新:修正路徑跟隨匯出效果。",
"en": "Updated 2026-11-04: fixed path-following in exports.",
"ja": "2026-11-04 更新:パス追従のエクスポート結果を修正しました。",
"ko": "2026-11-04 업데이트: 경로 추적 내보내기 결과를 수정했습니다.",
"ru": "Обновление от 04.11.2026: исправлен экспорт со следованием по пути.",
"fr": "Mise à jour du 04/11/2026 : correction du suivi de trajectoire lors de l’exportation.",
"de": "Update vom 04.11.2026: Der Export mit Pfadverfolgung wurde korrigiert.",
"pt-BR": "Atualização de 04/11/2026: corrigida a exportação com acompanhamento de trajetória.",
"es": "Actualización del 04/11/2026: corregida la exportación con seguimiento de trayectoria."
}
}
+29
View File
@@ -0,0 +1,29 @@
import assert from 'node:assert/strict'
import { build } from 'esbuild'
const bundled = await build({
bundle: true,
entryPoints: ['src/editor/exportTimeline.ts'],
format: 'esm',
platform: 'node',
write: false,
})
const { prepareTimelineForExport } = await import(
`data:text/javascript;base64,${Buffer.from(bundled.outputFiles[0].contents).toString('base64')}`
)
let recalculated = 0
const store = {
systems: [{ frames: [[{ active: true }]] }],
timeline: { playing: false, frame: 17, recorded: true },
recalcTotalFrames() { recalculated++ },
}
prepareTimelineForExport(store)
assert.equal(store.timeline.playing, true, '导出准备必须在下一次界面刷新前恢复播放')
assert.equal(store.timeline.frame, 0)
assert.equal(store.timeline.recorded, false)
assert.equal(store.systems[0].frames, undefined)
assert.equal(recalculated, 1)
console.log('导出时间轴校验通过:恢复播放后才会等待首帧录制,避免无跟随补烘焙')
+15
View File
@@ -0,0 +1,15 @@
interface ExportTimelineStore {
systems: Array<{ frames?: unknown[] }>
timeline: { playing: boolean; frame: number; recorded: boolean }
recalcTotalFrames(): unknown
}
/** Resume before yielding so the paused fallback bake cannot bypass emitter following. */
export function prepareTimelineForExport(store: ExportTimelineStore) {
store.timeline.playing = false
store.timeline.frame = 0
store.timeline.recorded = false
for (const system of store.systems) system.frames = undefined
store.recalcTotalFrames()
store.timeline.playing = true
}
@@ -25,6 +25,7 @@ import {
type SpineConnectorHealth,
} from '../../export/spineConnectorClient'
import { automaticLoopTransitionFrames } from '../../core/loopSegmentTiming'
import { prepareTimelineForExport } from '../../editor/exportTimeline'
export function useParticleExport(store: ReturnType<typeof useParticleStore>) {
@@ -110,13 +111,8 @@ function nextPaint() {
}
async function prepareExportFrames(onProgress?: (progress: number) => void) {
store.timeline.playing = false
store.timeline.frame = 0
store.timeline.recorded = false
for (const system of store.systems) system.frames = undefined
store.recalcTotalFrames()
prepareTimelineForExport(store)
await nextPaint()
store.timeline.playing = true
const expectedMs = store.timeline.totalFrames / Math.max(1, store.timeline.fps) * 1000
const deadline = performance.now() + Math.max(8000, expectedMs * 2.5 + 3000)
while (!store.timeline.recorded) {