diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 2359711..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.rbxmx -*.rbxm diff --git a/CNAME b/CNAME deleted file mode 100644 index 44171e0..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -quad.qwreey.kr diff --git a/DEV_CHANGELOG.txt b/DEV_CHANGELOG.txt deleted file mode 100644 index e231f77..0000000 --- a/DEV_CHANGELOG.txt +++ /dev/null @@ -1,13 +0,0 @@ -types 모듈이 삭제되며 init.lua 에 통합됨 - -:Tween() 필드에 register 값을, 또 Tween 자체에 register 값을 등록할 수 있음 - -이제 extend 에 대해서 Init(self) self 안에 props 기능이 내장되어있음 - -TODO: slot 기능 구현 - -TODO: spring 구현 - -TODO: !ChildRemoved 구현 - -TODO: AdvancedTween 을 submodule 로 변경 diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 0c62b80..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,42 +0,0 @@ - QwreeyKawaii license v1.3 - -Copyright 2023. Qwreey [qwreey75@gmail.com] - -This license is based on DBAD license. -Everyone is permitted to copy and distribute -verbatim or modified copies of this license -document. - -TERMS, AND CONDITIONS FOR COPYING, -DISTRIBUTION, AND MODIFICATION - -1. You can do anything with this original work, -but don't be rude - -In general, being rude includes below - -First. Do not copy these cute works without - any modification. changing the name - only is outright copyright infringement -Second. Do not add some harmful or NSFW content. - It's very rude and may harm others - -Being rude is not limited to these instances. -Above all, don't hurt cute people - -2. If you get any benefit or profit from these cute -works, Share the love. A polite person may share -the love with cute people. -3. These cute works are provided with no warranty. -If something goes wrong due to the creator's cute -mistake, Fix it yourself. A polite person may -submit the fix or bug report. -4. If you create something with these works, Leave -the original creator's name in your work. -the cute creator will be happy if their works are -used for good. -* This is a recommendation. Not required. -5. Russian nationality can not use this creation for -commercial purposes. — We do not support the war. -Same reason, This creation cannot be used where -it can support the war. diff --git a/Makefile b/Makefile deleted file mode 100644 index 0d2cfd4..0000000 --- a/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -kr: - mkdocs build -f mkdocs_kr.yml -krserve: - mkdocs serve -f mkdocs_kr.yml - -en: - mkdocs build -f mkdocs_en.yml -enserve: - mkdocs serve -f mkdocs_en.yml - -docs: kr en - -build: - rojo build default.project.json -o output.rbxmx - -test: - rojo serve test.project.json - -all: build docs diff --git a/README.md b/README.md deleted file mode 100644 index 22fbbff..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ - -문서화된 사용법 -https://quad.qwreey.kr/kr/ diff --git a/default.project.json b/default.project.json deleted file mode 100644 index 6ba2b6b..0000000 --- a/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Quad", - "tree": { - "$path": "src" - } -} diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index b89e47d..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -quad.qwreey.kr \ No newline at end of file diff --git a/docs/en/404.html b/docs/en/404.html deleted file mode 100644 index 2057021..0000000 --- a/docs/en/404.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Quad Docments - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- -

404 - Not found

- -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/en/assets/images/favicon.png b/docs/en/assets/images/favicon.png deleted file mode 100644 index 1cf13b9..0000000 Binary files a/docs/en/assets/images/favicon.png and /dev/null differ diff --git a/docs/en/assets/javascripts/bundle.b4d07000.min.js b/docs/en/assets/javascripts/bundle.b4d07000.min.js deleted file mode 100644 index 3c0bdad..0000000 --- a/docs/en/assets/javascripts/bundle.b4d07000.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Please waitting...

-

English docment is still writing.
-You can see docment in korean too!

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/en/search/search_index.json b/docs/en/search/search_index.json deleted file mode 100644 index e70f0c1..0000000 --- a/docs/en/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Please waitting...","text":"

English docment is still writing. You can see docment in korean too!

"}]} \ No newline at end of file diff --git a/docs/en/sitemap.xml b/docs/en/sitemap.xml deleted file mode 100644 index b0e58f0..0000000 --- a/docs/en/sitemap.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - https://quad.qwreey.kr/en/ - 2023-05-23 - daily - - \ No newline at end of file diff --git a/docs/en/sitemap.xml.gz b/docs/en/sitemap.xml.gz deleted file mode 100644 index d80bee7..0000000 Binary files a/docs/en/sitemap.xml.gz and /dev/null differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index c1273a4..0000000 --- a/docs/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/kr/404.html b/docs/kr/404.html deleted file mode 100644 index 293fb51..0000000 --- a/docs/kr/404.html +++ /dev/null @@ -1,1115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- -

404 - Not found

- -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/assets/EasingStyles.jpg b/docs/kr/assets/EasingStyles.jpg deleted file mode 100644 index ae1a3ef..0000000 Binary files a/docs/kr/assets/EasingStyles.jpg and /dev/null differ diff --git a/docs/kr/assets/LUAICON_DARK.png b/docs/kr/assets/LUAICON_DARK.png deleted file mode 100644 index 408718d..0000000 Binary files a/docs/kr/assets/LUAICON_DARK.png and /dev/null differ diff --git a/docs/kr/assets/LUAICON_TP.png b/docs/kr/assets/LUAICON_TP.png deleted file mode 100644 index 804a60e..0000000 Binary files a/docs/kr/assets/LUAICON_TP.png and /dev/null differ diff --git a/docs/kr/assets/Quad_Logo.png b/docs/kr/assets/Quad_Logo.png deleted file mode 100644 index 852903e..0000000 Binary files a/docs/kr/assets/Quad_Logo.png and /dev/null differ diff --git a/docs/kr/assets/Quad_MiniLogo.png b/docs/kr/assets/Quad_MiniLogo.png deleted file mode 100644 index 06d7abc..0000000 Binary files a/docs/kr/assets/Quad_MiniLogo.png and /dev/null differ diff --git a/docs/kr/assets/Quad_MiniLogoWhite.png b/docs/kr/assets/Quad_MiniLogoWhite.png deleted file mode 100644 index af58237..0000000 Binary files a/docs/kr/assets/Quad_MiniLogoWhite.png and /dev/null differ diff --git a/docs/kr/assets/Quad_MiniLogoWhite.svg b/docs/kr/assets/Quad_MiniLogoWhite.svg deleted file mode 100644 index 6c4dd51..0000000 --- a/docs/kr/assets/Quad_MiniLogoWhite.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/kr/assets/easingVideo.mp4 b/docs/kr/assets/easingVideo.mp4 deleted file mode 100644 index a141906..0000000 Binary files a/docs/kr/assets/easingVideo.mp4 and /dev/null differ diff --git a/docs/kr/assets/extra.css b/docs/kr/assets/extra.css deleted file mode 100644 index 1b0023f..0000000 --- a/docs/kr/assets/extra.css +++ /dev/null @@ -1,231 +0,0 @@ -/*D2Coding 폰트 불러오기*/ -@font-face { - font-family: "KawaiiMonoRegular"; - src:url("../assets/fonts/KawaiiMonoRegular.woff2") format("woff2"); - font-style: normal; - font-weight: normal; -} - -/*전체 폰트*/ -body, input { - font-family: KawaiiMonoRegular; -} -/*코드창 폰트*/ -code { - font-family: KawaiiMonoRegular; -} - -/*svg 글자 선택 불가능하도록 설정*/ -svg text { - pointer-events: none; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -khtml-user-select:none; - -o-user-select:none; - user-select: none; -} -/*메크로 변수 리스트 배경 색깔 지정*/ -table.pretty { - background-color: #262929 !important; -} - -/*메뉴 열면 배경 블러효과 주기*/ -.md-overlay { - background-color: rgba(0, 0, 0, 0.2) !important; - backdrop-filter: blur(3px); - -webkit-backdrop-filter: blur(3px); -} - -/* 검색 열면 배경 블러효과 주기 */ -@media screen and (min-width: 60em) { - .md-search__overlay { - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - } -} - -/* 디테일 안에 글자크기 */ -.md-typeset details { - font-size: .72rem !important; -} - -/*테이블 해더 꾸미기*/ -th { - /*최소 길이*/ - /* min-width: 5.8em !important; */ - /*글자 색깔*/ - /* color: rgb(255 255 255) !important; */ - /*배경 색깔*/ - /* background-color: rgb(26 27 31) !important; */ - /*라인*/ - /* border-bottom: .05em solid var(--md-accent-fg-color) !important; */ - /*주변 남기는 공간 (상하 / 좌우)*/ - /* padding: .85em 0.8em !important; */ -} -/*테이블 아이템 꾸미기*/ -td { - /*배경 색깔*/ - /* background-color: rgb(47 49 60) !important; */ - /*주변 남기는 공간 (상하 / 좌우)*/ - /* padding: .7em 0.8em !important; */ -} - -/*테이블 아이템 크기 (좌우)*/ -/* #table-em5 { - width: 5em !important; - min-width: 5em !important; -} -#table-em4 { - width: 4em !important; - min-width: 4em !important; -} -#table-em3 { - width: 3em !important; - min-width: 3em !important; -} -#table-em2 { - width: 2em !important; - min-width: 2em !important; -} -#table-em1 { - width: 1em !important; - min-width: 1em !important; -} -#table-custom { - min-width: 0em !important; -} */ - -/*테마 설정*/ -[data-md-color-scheme="darker"] { - /*글자 색깔*/ - --md-default-fg-color: rgb(225, 215, 225); - --md-default-fg-color--light: rgb(235, 215, 252); - --md-default-fg-color--lighter: rgb(105, 105, 105); - --md-default-fg-color--lightest: rgb(70, 70, 70); - - /* 마커 */ - --md-typeset-mark-color: hsl(271, 81%, 46%) !important; - - /*배경 색깔*/ - --md-default-bg-color: rgb(28, 25, 39); - --md-default-bg-color--light: hsla(259, 15%, 21%, 0.54); - --md-default-bg-color--lighter: hsla(259, 15%, 21%, 0.26); - --md-default-bg-color--lightest: hsla(259, 15%, 21%, 0.07); - - /*하이라이팅 색깔 (탑바, 링크)*/ - --md-primary-fg-color: hsl(268, 100%, 53%); - --md-primary-fg-color--light: hsl(271, 100%, 77%); - --md-primary-fg-color--dark :hsl(271, 82%, 72%); - --md-primary-bg-color: #f9e1ff; - --md-primary-bg-color--light: #f1d2ff; - - /*기타 (링크 마우스 온, 탭 컬러)*/ - --md-accent-fg-color: #bd78f5; - --md-accent-fg-color--transparent: hsla(0, 0%, 0%, 0.1); - --md-accent-bg-color: hsla(0, 0%, 100%, 1); - --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); - - /*모르겠음*/ - --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-primary-fg-color--light); - --md-typeset-del-color: hsla(6, 90%, 60%, 0.15); /*내용 비교 하이라이터 : 지움*/ - --md-typeset-ins-color: hsla(150, 90%, 44%, 0.15); /*내용 비교 하이라이터 : 만듬*/ - --md-typeset-kbd-color: hsla(232, 15%, 94%, 0.12); - --md-typeset-kbd-accent-color: hsla(232, 15%, 94%, 0.2); - --md-typeset-kbd-border-color: hsla(232, 15%, 14%, 1); - --md-admonition-fg-color: var(--md-default-fg-color); - --md-admonition-bg-color: hsla(232, 0%, 100%, 0.025); - - /* Footer */ - --md-footer-fg-color: hsla(0, 0%, 100%, 1); - --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); - --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); - --md-footer-bg-color: hsla(232, 15%, 12%, 0.87); - --md-footer-bg-color--dark: hsla(232, 15%, 10%, 1); - - /*Code block , Code highlighting*/ - --md-code-fg-color: rgb(249, 235, 255); /*일반 텍스트*/ - --md-code-bg-color: rgb(38, 31, 51); /*배경*/ - --md-code-hl-color: hsla(218, 100%, 63%, 0.15); /*수직선(왼쪽 숫자 옆)*/ - --md-code-hl-number-color:#f0b680; /*숫자*/ - --md-code-hl-special-color: #d17eeb; - --md-code-hl-function-color: #7db9eb; /*함수명 색깔*/ - --md-code-hl-constant-color: #50A8B3; /*내장함수 색깔*/ - --md-code-hl-keyword-color:#C577DC; /*local, function, do, for ...*/ - --md-code-hl-string-color: #98C279; /*문자열*/ - --md-code-hl-name-color: var(--md-code-fg-color); /*변수명 색깔*/ - --md-code-hl-operator-color: #50A8B3; /*연산자( = < > ^ * - + ) 색깔*/ - --md-code-hl-punctuation-color: #A9B0BD; /*구두점 문자 ( ) , ;*/ - --md-code-hl-comment-color: #5B626F; /*주석 색깔*/ - --md-code-hl-generic-color: var(--md-default-fg-color--light); - --md-code-hl-variable-color: var(--md-default-fg-color--light); -} - -/*테마 설정*/ -[data-md-color-scheme="dark"] { - /*글자 색깔*/ - --md-default-fg-color: rgb(225, 215, 225); - --md-default-fg-color--light: rgb(235, 215, 252); - --md-default-fg-color--lighter: rgb(105, 105, 105); - --md-default-fg-color--lightest: rgb(70, 70, 70); - - /* 마커 */ - --md-typeset-mark-color: hsl(271, 81%, 46%) !important; - - /*배경 색깔*/ - --md-default-bg-color: rgb(41, 43, 54); - --md-default-bg-color--light: hsla(232, 15%, 21%, 0.54); - --md-default-bg-color--lighter: hsla(232, 15%, 21%, 0.26); - --md-default-bg-color--lightest: hsla(232, 15%, 21%, 0.07); - - /*하이라이팅 색깔 (탑바, 링크)*/ - --md-primary-fg-color: hsl(268, 100%, 53%); - --md-primary-fg-color--light: hsl(271, 100%, 77%); - --md-primary-fg-color--dark :hsl(271, 82%, 72%); - --md-primary-bg-color: #f9e1ff; - --md-primary-bg-color--light: #f1d2ff; - - /*기타 (링크 마우스 온, 탭 컬러)*/ - --md-accent-fg-color: #bd78f5; - --md-accent-fg-color--transparent: hsla(0, 0%, 0%, 0.1); - --md-accent-bg-color: hsla(0, 0%, 100%, 1); - --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); - - /*모르겠음*/ - --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-primary-fg-color--light); - --md-typeset-mark-color: hsla(218, 100%, 63%, 0.3); /*마커로 마킹함*/ - --md-typeset-del-color: hsla(6, 90%, 60%, 0.15); /*내용 비교 하이라이터 : 지움*/ - --md-typeset-ins-color: hsla(150, 90%, 44%, 0.15); /*내용 비교 하이라이터 : 만듬*/ - --md-typeset-kbd-color: hsla(232, 15%, 94%, 0.12); - --md-typeset-kbd-accent-color: hsla(232, 15%, 94%, 0.2); - --md-typeset-kbd-border-color: hsla(232, 15%, 14%, 1); - --md-admonition-fg-color: var(--md-default-fg-color); - --md-admonition-bg-color: hsla(232, 0%, 100%, 0.025); - - /* Footer */ - --md-footer-fg-color: hsla(0, 0%, 100%, 1); - --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); - --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); - --md-footer-bg-color: hsla(232, 15%, 12%, 0.87); - --md-footer-bg-color--dark: hsla(232, 15%, 10%, 1); - - /*Code block , Code highlighting*/ - --md-code-fg-color: hsla(232, 18%, 86%, 1); /*일반 텍스트*/ - --md-code-bg-color: hsla(232, 15%, 15%, 1); /*배경*/ - --md-code-hl-color: hsla(218, 100%, 63%, 0.15); /*수직선(왼쪽 숫자 옆)*/ - --md-code-hl-number-color:#f0b680; /*숫자*/ - --md-code-hl-special-color: #d17eeb; - --md-code-hl-function-color: #7db9eb; /*함수명 색깔*/ - --md-code-hl-constant-color: #50A8B3; /*내장함수 색깔*/ - --md-code-hl-keyword-color:#C577DC; /*local, function, do, for ...*/ - --md-code-hl-string-color: #98C279; /*문자열*/ - --md-code-hl-name-color: var(--md-code-fg-color); /*변수명 색깔*/ - --md-code-hl-operator-color: #50A8B3; /*연산자( = < > ^ * - + ) 색깔*/ - --md-code-hl-punctuation-color: #A9B0BD; /*구두점 문자 ( ) , ;*/ - --md-code-hl-comment-color: #5B626F; /*주석 색깔*/ - --md-code-hl-generic-color: var(--md-default-fg-color--light); - --md-code-hl-variable-color: var(--md-default-fg-color--light); -} diff --git a/docs/kr/assets/fonts/KawaiiMonoRegular.woff2 b/docs/kr/assets/fonts/KawaiiMonoRegular.woff2 deleted file mode 100644 index 3386bd9..0000000 Binary files a/docs/kr/assets/fonts/KawaiiMonoRegular.woff2 and /dev/null differ diff --git a/docs/kr/assets/fonts/gmarketsansmedium.otf b/docs/kr/assets/fonts/gmarketsansmedium.otf deleted file mode 100644 index af2cfc3..0000000 Binary files a/docs/kr/assets/fonts/gmarketsansmedium.otf and /dev/null differ diff --git a/docs/kr/assets/images/favicon.png b/docs/kr/assets/images/favicon.png deleted file mode 100644 index 1cf13b9..0000000 Binary files a/docs/kr/assets/images/favicon.png and /dev/null differ diff --git a/docs/kr/assets/javascripts/bundle.b4d07000.min.js b/docs/kr/assets/javascripts/bundle.b4d07000.min.js deleted file mode 100644 index 3c0bdad..0000000 --- a/docs/kr/assets/javascripts/bundle.b4d07000.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

버전 번경사항

-

2.25

-

실험적 API 로써 GetChildren() 과 ChildAdded::Bindable 이 추가되었습니다.

-

2.24

-

모든 문서가 정리되었습니다.

-

2.23

-

객체 생성시 일어나는 오류를 해결했습니다.
-이제 Extend 객체 내부 자식이 Unmount 되는 경우 __child 에서 제거됩니다.
-types 의 오타를 고쳤습니다.

-

2.22

-

더이상 Event.Prop 가 처음 생성시 실행되는 일이 일어나지 않습니다.

-

2.21

-

Linker 가 이제 클래스 안 클래스에서 사용될 수 있도록 변경되었습니다.

-

2.20

-

Docments 가 업데이트되었습니다. 많은양의 새로운 튜토리얼이 제공됩니다.
-Mkdocs 테마와 여러가지 설정이 변경되었습니다.
-이제 Makefile 을 통해서 rojo build 와 mkdocs build 를 사용할 수 있습니다.

-

2.19

-

Linker 객체가 추가되었습니다. 이제 GetPropertyChangedSignal 와, self 에 특정 오브젝트 혹은 이벤트를 연결할 수 있습니다

-

2.18

-

이제 더이상 GC 에 의해 Store 의 Instance 값이 손실되지 않습니다

-

2.17

-

Tween 의 CallBack 등록 시 주언지는 파라메터가 변경되었습니다.
-이제 더이상 ~ 문이 사용되지 않습니다.

-

2.15 BREAKING CHANGES

-

이제 Lang 에서 CurrentLocale, FailedMessage 을 변경하면 자동으로 변경사항이 업데이트됩니다. 또한 일부 필드의 네이밍이 변경되었습니다

-

2.14

-

Lang 모듈이 추가되었습니다. register 를 사용해 사용자 지정 다중언어 지원을 추가할 수 있습니다

-

2.13

-

Signal 모듈이 추가되었습니다. 이제 Class.Extend 에서 GetPropertyChangedSignal 과 EmitPropertyChangedSignal 를 사용할 수 있습니다

-

2.12

-

Mount 반환 객체에 Add 를 사용할 수 있도록 Mount 객체가 변경되었습니다

-

2.11

-

Store.GetObjects 에 이제 & 문법을 사용할 수 있습니다.

-

2.9

-

PreloadAsync 를 통해 이제 round.lua 에서 라운드 이미지를 미리 로드합니다.

-

2.8

-

반환 관련 코드가 exports 로 이주되었으며. init.lua 에서는 자동적으로 types 를 반환합니다.

-

2.7

-

이제 types 를 완전히 지원합니다. 직접 불러와 사용할 수 있습니다

-

2.1~2.6 BREAKING CHANGES

-

모든 모듈의 필드의 이름이 변경되었으며, 모든 클래스들이 기본적으로 대문자 시작 네이밍을 사용하도록 명명규칙을 변경했습니다.

-

2.0

-

버전 판올림, BREAKING CHANGES 를 위해 버전을 판올림 하였습니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/gallery/index.html b/docs/kr/gallery/index.html deleted file mode 100644 index 24be0d2..0000000 --- a/docs/kr/gallery/index.html +++ /dev/null @@ -1,1189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 갤러리 - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

갤러리

-

여기는 여러분들의 작품을 올려볼 수 있는 곳입니다!
-Quad 를 사용한 여러가지 훌륭한 작품들을 보여주세요!

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/bindable/index.html b/docs/kr/include/bindable/index.html deleted file mode 100644 index 521cf1f..0000000 --- a/docs/kr/include/bindable/index.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Bindable - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Bindable

- -

:Fire(...any)

-
-

등록된 연결들을 실행하고, Wait 을 풀어줍니다.

-
-
-

:Wait()->(...any)

-
-

Fire 가 호출될 때 까지 기다립니다. Fire 에 사용된 값이 반환됩니다.

-
-
-

:Connect((...any)->())->Connection

-
-

Fire 가 호출 될 때 함수가 실행되도록 만듭니다. Fire 에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록 Connection 이 제공됩니다.

-
-
-

:Once((...any)->())->Connection

-
-

Connect 와 유사하지만, Fire 가 한번 호출된 뒤 연결이 끊어집니다/

-
-
-

:CheckConnected(func)->boolean

-
-

함수가 이미 등록되어 있는지 여부를 반환합니다.

-
-
-

:DisconnectAll()

-
-

모든 연결을 끊습니다. Wait 으로 기다리고 있는 곳에는 nil 을 반환합니다.

-
-
-

:Destroy()

-
-

:DisconnectAll() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/connection/index.html b/docs/kr/include/connection/index.html deleted file mode 100644 index 232c71f..0000000 --- a/docs/kr/include/connection/index.html +++ /dev/null @@ -1,1138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Connection - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Connection

- -

:Disconnect()

-
-

연결을 끊습니다. Fire 가 호출되더라도 Connect 혹은 Once 에 사용된 함수가 실행되지 않습니다.

-
-
-

:Destroy()

-
-

:Disconnect() 의 별칭입니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/directions/index.html b/docs/kr/include/directions/index.html deleted file mode 100644 index b4cb66e..0000000 --- a/docs/kr/include/directions/index.html +++ /dev/null @@ -1,1137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Directions - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Directions

- -

Out
-초반에 가속이 이루워지며, 후반에 느려집니다.

-
-

In
-초반에는 느리며, 점점 가속이 늘어납니다.

-
-

InOut
-중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/disconnecter/index.html b/docs/kr/include/disconnecter/index.html deleted file mode 100644 index f55f81c..0000000 --- a/docs/kr/include/disconnecter/index.html +++ /dev/null @@ -1,1145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Disconnecter - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Disconnecter

- -

:Add(connection:Connection|RBXScriptConnection)

-
-

connection을 리스트에 추가합니다. 나중에 :Disconnect를 호출하면 추가된 연결이 파기됩니다.

-
-
-

:Disconnect()

-
-

추가된 모든 연결에 Disconnect() 를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시 :Add 를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면 :Destroy 를 호출하세요

-
-
-

:Destroy()

-
-

:Disconnect() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/easings/index.html b/docs/kr/include/easings/index.html deleted file mode 100644 index 3a6d90a..0000000 --- a/docs/kr/include/easings/index.html +++ /dev/null @@ -1,1207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Easings - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Easings

- -
-
-
-

- -

-
-
-

-함수 개형
-

-
-
-
-

모든 Easing 은 여기에서 직접적으로 확인할 수 있습니다.

-

Linear

-
-

아무런 가감속이 없는 1차형 함수입니다
-i=x, x=0 to 1

-
-
-

Quint

-
-

5 제곱을 이용한 가감속 함수입니다. Quart 보다 가파른 개형을 가졌습니다
-(^5) i=1-(1-x)^5, x=0 to 1

-
-
-

Quart

-
-

네제곱을 이용한 가감속 함수입니다. Cubic 보다 가파른 개형을 가졌습니다
-(^4) i=1-(1-x)^4, x=0 to 1

-
-
-

Cubic

-
-

세제곱을 이용한 가감속 함수입니다. Quad 보다 가파른 개형을 가졌습니다
-(^3) i=1-(1-x)^3, x=0 to 1

-
-
-

Quad

-
-

제곱을 이용한 가감속 함수입니다.
-(^2) i=1-(1-x)^2, x=0 to 1

-
-
-

Expo

-
-

지수형 가감속 함수입니다. 매우 가파른 개형을 가졌습니다.
-i=1-2^(-10*x), x=0 to 1

-
-
-

Sin

-
-

사인 파형 가감속 함수입니다.
-i=sin(x*pi/2), x=0 to 1

-
-
-

Circle

-
-

사분원 가감속 함수입니다.
-i=sqrt(1-(1-x)^2), x=0 to 1

-
-
-

Back

-
-

시작시 뒤로 이동이 있는 가감속 함수입니다.

-
-
-

Elastic

-
-

탄성을 가지는 가감속 함수입니다.

-
-
-

Bounce

-
-

튀어오름을 가지는 가감속 함수입니다.

-
-

TODO: 애니메이션 미리보기 영상 추가

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/events/index.html b/docs/kr/include/events/index.html deleted file mode 100644 index 0718cc1..0000000 --- a/docs/kr/include/events/index.html +++ /dev/null @@ -1,1261 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Events - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Events

- -

Event(name:string)

-
-

모든 로블록스 이벤트들을 나타냅니다, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up 등이 될 수 있습니다
-기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로 self 를 받을 수 있습니다.

-
-
-
-
1
-2
-3
-4
-5
Frame {
-    [Event "MouseEnter"] = function (self)
-        print(self.Name .. "에 마우스가 올라왔습니다")
-    end;
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local TextButton = Class "TextButton"
-
-TextButton "mainButton" {
-    Size = UDim2.fromOffset(200,200);
-    [Event "MouseEnter"] = function (self)
-        print("버튼이 클릭되었습니다")
-    end;
-}
-Mount(ScreenGUI, Store.GetObject("mainButton"))
-
-
-
-
-
-
-

Event.Created

-
-

오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로 self 를 받을 수 있습니다.
-

1
-2
-3
-4
-5
-6
-- 용법
-Frame {
-    [Event.Created] = function (self)
-        print(self.Name .. "이 생성되었어요")
-    end;
-}
-

-
-주의 -

Event.Created 가 실행될 때는 Parent 값이 정해지지 않았을 수 있습니다. self.Parent 는 접근해서는 안됩니다. Class.Extend 에서는 AfterRender 를 이용해야 합니다.

-
-
-
-

Event.CreatedAsync

-
-

Event.Created 와 비슷하지만, 코루틴 안에서 작동합니다. objectList:EachAsync() 처럼 반환을 기다리지 않습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-- 용법
-Frame {
-    Frame {
-        Name = "A";
-        [Event.CreatedAsync] = function (self)
-            -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다
-            task.wait(5)
-        end;
-    };
-    Frame {
-        Name = "B";
-        [Event.Created] = function (self)
-            print(self.Name .. "가 생성되었습니다")
-        end;
-    };
-}
-

-
-주의 -

Event.CreatedAsync 가 실행될 때는 Parent 값이 정해지지 않았을 수 있습니다. self.Parent 는 접근해서는 안됩니다.

-
-
-
-

Event.Prop(propertyName:string)

-
-

프로퍼티 값이 변경됨을 연결합니다.
-

1
-2
-3
-4
-5
-6
-7
-8
-- 용법
-TextBox {
-    Text = "아무거나 입력하세요";
-    [Event.Prop "Text"] = function (self,text)
-        -- 편의상의 이유로 변경된 값이 제공됩니다
-        print(text)
-    end;
-}
-

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/extend/index.html b/docs/kr/include/extend/index.html deleted file mode 100644 index cd46b4b..0000000 --- a/docs/kr/include/extend/index.html +++ /dev/null @@ -1,1695 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Extend - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Extend

- -

self(name:string)->linker

-
-

Extend 메소드 전역에서 사용가능합니다. 링커를 만들며, PropertyChangedSignal 를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.

-
-
-

Overwite REQUIRED :Render(props:valueStore)

-
-

화면에 그려지는 UI 를 만들어지게 하는 함수입니다. Extend 가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Event = Quad.Event
-local Mount = Quad.Mount
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        [Event "MouseButton1Click"] = function (self,x,y)
-            print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y))
-        end;
-        Size = props "Size";
-        Text = props "Text"; -- 레지스터를 이용합니다
-    }
-end
-
-local myImported = Class(myClass)
-myImported.Size = UDim2.fromOffset(200,200)
-
-local test = myImported {
-    Text = "wow"
-}
-Mount(ScreenGUI, test)
-
--- 텍스트를 업데이트합니다
-while task.wait(1) do
-    test.Text = "w"..("o"):rep(#test.Text-1).."w"
-end
-
-
-
-

Overwite Option :Init(props:valueStore)

-
-

선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Init(props)
-    -- Size 값이 없다면 기본값을 사용하도록 합니다.
-    props:Default("Size", UDim2.fromOffset(100,100))
-
-    -- 앞에 _ 를 붇여 내부 변수를 만듭니다.
-    -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다.
-    self._asdf = true
-end
-function myClass:Render(props)
-    return TextButton {
-        props "Size"
-    }
-end
-
-local myImported = Class(myClass)
-local myButton = myImported() -- 옵션 없음
-print(myButton.Size)
-
-
-
-

Overwite Option :AfterRender(object:any)

-
-

선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button"; -- 자기 자신에 이 버튼을 넣습니다
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button == object) -- true
-end
-
-local myImported = Class(myClass)
-myImported() -- 옵션 없음
-
-
-
-

Overwite Option :Update()

-
-

:Render:AfterRender 를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:Update() -- update
-myButton:Update() -- update
-myButton:Update() -- update
-

-
-
-

Overwite Option .Getter.<PropertyName>(self)

-
-

값을 얻는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {}
-end
--- 값을 읽는데 사용할 함수를 등록합니다
-function myClass.Getter.Test(self)
-    return "Hello World"
-end
-
-local myImported = Class(myClass)
-print(myImported().Test)
-

-
-
-

Overwite Option .Setter.<PropertyName>(self,newValue:any)

-
-

값을 설정하는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button";
-        Text = "wow";
-    }
-end
--- 값을 지정하는데 사용할 함수를 등록합니다
-function myClass.Setter.Test(self,newValue)
-    self._button.Text = newValue
-end
-function myClass.Getter.Test(self)
-    return self._button.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-print(myButton.Test)
-myButton.Test = "Hello World"
-print(myButton.Test)
-

-
-
-

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

-
-

해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
--- 값 변경시 업데이트 여부를 지정합니다
-myClass.UpdateTriggers.Test = true
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-

-
-
-

Overwite Option :Unload(object)

-
-

:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다

-
-
-

:GetPropertyChangedSignal(propertyName:string)->Bindable

-
-

값 변경을 연결할 수 있는 Bindable을 반환합니다. :EmitPropertyChangedSignal 으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.

-
-
-

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

-
-

프로퍼티 변경시 :GetPropertyChangedSignal 에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로 self.a = 1 과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다. changedValue 는 선택사항이며, 주어지지 않으면 self[propertyName]을 반환합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_box";
-        Text = "test";
-        Size = UDim2.fromOffset(200,200);
-        [Evnet.Prop "Text"] = function (this,newValue)
-            self:EmitPropertyChangedSignal("Text",newValue)
-        end;
-        -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다.
-        -- self(name:string) 문법으로 변경 이벤트 역시 링크
-        -- 할 수 있습니다.
-    }
-end
-function myClass.Getter.Text(self)
-    return self._box.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:GetPropertyChangedSignal("Text"):Connect(function()
-    print(myButton.Text)
-end)
-Mount(ScreenGUI, myButton)
-

-
-
-

Event .ChildAdded:Connect((child)->())->Connection

-
-

자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 또는 :AfterRender 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, 추후 Mount 를 통해 추가되는 자식 오브젝트 또한 이 이벤트로 얻어질 수 있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    self.ChildAdded:Connect(function(child)
-        print(child.Name)
-    end)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
-    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
-    -- 얻어올 수 있습니다.
-    TextButton { Name = "Hello "};
-}
-
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
-
-

:GetChildren()

-
-

자식 오브젝트들을 가져오는 함수입니다. :Init():AfterRender() 에서는 빈 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    for i,v in ipairs(self:GetChildren()) do
-        print(v.Name)
-    end
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    TextButton { Name = "Hello World"};
-}
-
--- 나중에 추가하는 오브젝트는 출력되지 않습니다.
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/locales/index.html b/docs/kr/include/locales/index.html deleted file mode 100644 index 187ed49..0000000 --- a/docs/kr/include/locales/index.html +++ /dev/null @@ -1,1176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Locales - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Locales

- -

Default (default)
-English (en-us)
-Spanish (es-es)
-French (fr-fr)
-Indonesian (id-id)
-Italian (it-it)
-Japanese (ja-jp)
-Korean (ko-kr)
-Russian (ru-ru)
-Thai (th-th)
-Turkish (tr-tr)
-Vietnamese (vi-vn)
-Portuguese (pt-br)
-German (de-de)
-ChineseSimplified (zh-cn)
-ChineseTraditional (zh-tw)
-Bulgarian (bg-bg)
-Bengali (bn-bd)
-Czech (cs-cz)
-Danish (da-dk)
-Greek (el-gr)
-Estonian (et-ee)
-Finnish (fi-fi)
-Hindi (hi-in)
-Croatian (hr-hr)
-Hungarian (hu-hu)
-Georgian (ka-ge)
-Kazakh (kk-kz)
-Khmer (km-kh)
-Lithuanian (lt-lt)
-Latvian (lv-lv)
-Malay (ms-my)
-Burmese (my-mm)
-Bokmal (nb-no)
-Dutch (nl-nl)
-Filipino (fil-ph)
-Polish (pl-pl)
-Romanian (ro-ro)
-Ukrainian (uk-ua)
-Sinhala (si-lk)
-Slovak (sk-sk)
-Slovenian (sl-sl)
-Albanian (sq-al)
-Bosnian (bs-ba)
-Serbian (sr-rs)
-Swedish (sv-se)
-Arabic (ar-001)

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/mounts/index.html b/docs/kr/include/mounts/index.html deleted file mode 100644 index 3f09fc3..0000000 --- a/docs/kr/include/mounts/index.html +++ /dev/null @@ -1,1216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Mounts - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Mounts

- -

:Unmount()

-
-

이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해 Store.GetObject 에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui,mainFrame)
-
-local childFrame = Frame {}
-local childFrameMount = Mount(mainFrame,childFrame)
-childFrameMount:Unmount()
--- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다
--- 즉, Destroy() 가 호출됩니다
-
-
-
-

:Add(item:any)

-
-

Mount 에 오브젝트를 추가합니다. 처음 설정한 to 값을 따라 부모가 결정됩니다.

-

이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui, mainFrame)
-
-local lastListMount = Mount(mainFrame)
-local function refreshList()
-    lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다
-    for i = 1,10 do
-        lastListMount:Add(Frame { Name = tostring(i) })
-    end
-end
-
-task.spawn(function()
-    while true do
-        refreshList()
-        task.wait(2)
-    end
-end)
-
-

다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단 ScrollFrame 의 경우 CanvasPosition이 초기화 되어버리므로 자식들을 :Unmount() 하기 전에 위치를 저장하고 다시 불러와야 합니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/objectList/index.html b/docs/kr/include/objectList/index.html deleted file mode 100644 index f35467a..0000000 --- a/docs/kr/include/objectList/index.html +++ /dev/null @@ -1,1150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - objectList - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

objectList

- -

:Each((item:any, index:number)->())

-
-

일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다

-
-
-

:EachAsync((item:any, index:number)->())

-
-

반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-코루틴이 이용됩니다. wrap() 코루틴을 모르거나, 필요성이 없는경우 일반적으로 :Each 를 사용해도 됩니다

-
-
-

:IsEmpty()

-
-

이 ObjectList 가 비어있는지 여부를 반환합니다.

-
-
-

:Remove(indexOrItem:number|any)

-
-

objectList 에서 해당하는 오브젝트를 제거합니다.
-, & 를 사용한 고급 검색에서는 작동하지 않습니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/quad/index.html b/docs/kr/include/quad/index.html deleted file mode 100644 index 98da9b3..0000000 --- a/docs/kr/include/quad/index.html +++ /dev/null @@ -1,1130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Quad - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Quad

- - - - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/quadProperty/index.html b/docs/kr/include/quadProperty/index.html deleted file mode 100644 index 3e555d3..0000000 --- a/docs/kr/include/quadProperty/index.html +++ /dev/null @@ -1,1153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - quadProperty - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

quadProperty

- -

RoundSize:number?

-
-

ImageLabel, ImageButton 에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로 UICorner보다 부드러운 코너효과를 제공합니다.

-
-
-

Corner:number?

-
-

모든 로블록스 UI오브젝트에 적용됩니다. UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.

-
-
-

PaddingAll:UDim?

-
-

UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다. PaddingAllOffset 과 함깨 사용할 수 없습니다.

-
-
-

PaddingAllOffset:number?

-
-

UIPadding을 적용합니다. PaddingAll과 같은 방법으로 작동하나, Offset값만 설정할 수 있습니다. PaddingAll 과 함깨 사용할 수 없습니다.

-
-
-

Scale:number?

-
-

UIScale을 적용합니다. UIScale.Scale 과 같은 효과를 나타냅니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/register/index.html b/docs/kr/include/register/index.html deleted file mode 100644 index a83e52e..0000000 --- a/docs/kr/include/register/index.html +++ /dev/null @@ -1,1634 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Register - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Register

- -

register 특수 메소드가 적용되는 순서는 다음과 같습니다.

-

:Add(value:any)->register

-
-

값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다.
-number, Udim, UDim2, Color3, Vector2 등 더할 수 있는 모든것을 사용할 수 있습니다
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-myStore.pos = UDim2.fromOffset(100,0)
-
-Frame "mainFrame" {
-    Position = myStore "pos":Add(UDim2.fromOffset(0,100));
-}
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-while true do
-    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)
-    task.wait(2)
-end
-

-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:With((store:valueStore, newValue:any, key:string)->())->register

-
-

함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다.
-첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다

-
-
-
-
1
-2
-3
myStore "size":With(function (_,value)
-    return value * 2
-end)
-
-
-
-

width 값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-myStore.topbarSize = 60
-myStore.width = 200
-
--- 레지스터를 변수로 두고 사용합니다
-local listItemSize = myStore "width":With(function()
-    return UDim2.fromOffset(myStore.width,60)
-end)
-
-Frame "mainFrame" {
-    Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder };
-
-    -- 사이즈가 width 에 맞게 업데이트됩니다
-    Size = myStore "width":With(function ()
-        return UDim.fromOffset(store.width,400)
-    end);
-
-    Frame "Topbar" {
-        LayoutOrder = 1;
-        BackgroundColor3 = Color3.fromRGB(255,0,0);
-        -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을
-        -- 만들 수 있습니다.
-        Size = myStore "topbarSize,width":With(function()
-            return UDim2.fromOffset(myStore.width,myStore.topbarSize)
-        end);
-    }
-    Frame "ListItem" {
-        LayoutOrder = 2;
-        BackgroundColor3 = Color3.fromRGB(0,255,0);
-        Size = listItemSize;
-    };
-    Frame "ListItem" {
-        LayoutOrder = 3;
-        BackgroundColor3 = Color3.fromRGB(0,0,255);
-        Size = listItemSize;
-    };
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
--- width 값을 변경해보세요
-while true do
-    myStore.width = myStore.width + 10
-    task.wait(1)
-end
-
-
-
-

colors 테이블 안에 있는 색깔들을 돌아가며 보여줍니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-local colors = {
-    Color3.fromRGB(255,255,255);
-    Color3.fromRGB(255,255,0);
-    Color3.fromRGB(0,255,255);
-    Color3.fromRGB(255,0,255);
-    Color3.fromRGB(255,0,0);
-    Color3.fromRGB(0,255,0);
-    Color3.fromRGB(0,0,255);
-}
-myStore.color = 1
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(200,200);
-    -- colors 에서 인덱싱해 값을 가져옵니다
-    BackgroundColor3 = myStore "color":With(colors);
-}
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
--- 인덱스를 순회합니다
-while task.wait(1) do
-    myStore.color = (i-1)%(#colors)+2
-end
-
-
-
-
-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:Tween(options:TweenOptions)->register

-
-

트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다.

-
-
-
-
1
-2
-- Tween 옵션을 넣을 수 있습니다
-myStore "size":Tween{ Time = 2 }
-
-
-
-

프레임을 한꺼번에 움직입니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Style = Quad.Style
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-myStore.pos = UDim2.fromOffset(50,0)
-Style "TweenFrame" {
-    Size = UDim2.fromOffset(50,50);
-    BackgroundColor3 = Color3.fromRGB(255,100,255);
-}
-
-Frame "mainFrame" {
-    BackgroundColor3 = Color3.fromRGB(255,255,255);
-    Size = UDim2.fromOffset(500,500);
-    Frame "TweenFrame" {
-        Position = myStore "pos":Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,100))
-            :Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,200))
-            :Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,300))
-            :Tween{Time = 2};
-    }
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-local on = false
-while true do
-    on = not on
-    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)
-    task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다
-    -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다
-end
-
-
-
-
-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:Default(value:any)->register

-
-

기본값을 정합니다. 만약 값이 nil 인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(200,200);
-    -- color 값이 없으므로 Default 안의 값이 사용됩니다.
-    BackgroundColor3 = myStore "color"
-        :Default(Color3.fromRGB(255,0,0));
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-task.wait(5)
-myStore.color = Color3.fromRGB(0,255,0)
-

-
-주의 -
    -
  • 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다.
  • -
  • 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다.
  • -
-
-
-
-

:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

-
-

레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다

-

newValue 에는 :Add, :With, :Tween, :Default 가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다

-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
-9
myStore.test = 1
--- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다
--- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다
--- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다
-local func = myStore "test":Register(function(_,newValue)
-    -- 값 변경시 출력됩니다
-    print(newValue)
-end)
-myStore.test = 2
-
-
-
-

myStore.test1, myStore.test2 가 변화하면 print 함수를 실행합니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-
-local myStore = Store.GetStore("myStore")
-
-myStore.test1 = 1
-myStore.test2 = "Hello"
-
-local func = myStore "test1,test2":Register(function()
-    print(myStore.test1,myStore.test2)
-end)
-
-myStore.test1 = 2
-
-
-
-
-
-주의 -

Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다.

-
-
-
-

:Observe((newValue:any)->())

-
-

:Register의 간소화 버전입니다. :Register와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는 newValue 하나만 주어집니다.

-

newValue:Add, :With, :Tween, :Default 가 계산된 상태로 제공됩니다.

-
-
-
-
1
-2
-3
-4
-5
-6
myStore.test = 1
-myStore "test":Add(1):Observe(function(_,newValue)
-    -- 값 변경시 출력됩니다
-    print(newValue)
-end)
-myStore.test = 2
-
-
-
-
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/tween/index.html b/docs/kr/include/tween/index.html deleted file mode 100644 index fdc51ef..0000000 --- a/docs/kr/include/tween/index.html +++ /dev/null @@ -1,1273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Tween - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Tween

- -

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

-
-

트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -Ended, OnStepped, Setter, Getter 값이 설정되면 Option 안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록 TweenHandler 가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. -

1
-2
-3
-4
-5
Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

-
-

Tween.RunTween 와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
-

1
-2
-3
-4
-5
Tween.RunTween({myFrame1, myFrame2, myFrame3},{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.StopTween(ItemOrHandler:TweenHandler|any)

-
-

트윈을 멈춥니다. TweenHandler 또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.

-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(Handler)
-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(myFrame)
-
-
-
-
-
-
-

Tween.StopPropertyTween(Item:any, PropertyName:string)

-
-

오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

-
-

해당 오브젝트 또는 TweenHandler 로 트윈이 진행중인지 여부를 판단합니다.

-
-
-

Tween.IsPropertyTweening(Item:any, PropertyName:string)

-
-

해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-그래프와 미리보기는 Easings 에서 확인할 수 있습니다

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-자세한 정보는 Easings 에서 확인할 수 있습니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/tweenOptions/index.html b/docs/kr/include/tweenOptions/index.html deleted file mode 100644 index 7b16d02..0000000 --- a/docs/kr/include/tweenOptions/index.html +++ /dev/null @@ -1,1229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - tweenOptions - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

tweenOptions

- -

Option Time:number?

-
-

트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면 1이 사용됩니다.

-
-
-

Option Easing:string|(index:number)->number?

-
-

트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나, Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면 Exp2가 사용됩니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option Direction:string?

-
-

트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나, Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면 Out이 사용됩니다. -

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

-
-

선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며, "*" 를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.

-
-
-

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 "*" 를 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 1을 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Getter:(Item:any, Property:string)->any?

-
-

선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
-
-

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

-
-

선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/typeDirections/index.html b/docs/kr/include/typeDirections/index.html deleted file mode 100644 index 8d9c500..0000000 --- a/docs/kr/include/typeDirections/index.html +++ /dev/null @@ -1,1143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - typeDirections - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

typeDirections

- -
1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/include/typeEasings/index.html b/docs/kr/include/typeEasings/index.html deleted file mode 100644 index c7615a1..0000000 --- a/docs/kr/include/typeEasings/index.html +++ /dev/null @@ -1,1159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - typeEasings - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

typeEasings

- -
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/index.html b/docs/kr/index.html deleted file mode 100644 index c60e709..0000000 --- a/docs/kr/index.html +++ /dev/null @@ -1,1162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Quad - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Quad

-

처음오셨나요? 튜토리얼 문서를 읽어보세요!
-처음부터 차근차근 Quad 모듈을 정복할 수 있어요

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/license/index.html b/docs/kr/license/index.html deleted file mode 100644 index 9db2c30..0000000 --- a/docs/kr/license/index.html +++ /dev/null @@ -1,1440 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 라이선스 - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

라이선스

-

QwreeyKawaii License v1.3

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PermissionsLimitationsConditions
✅ 상업적 사용❎ 보증❓ 라이선스와 저작권 고지 (권고사항)
✅ 배포❎ 무례하게 굴기
✅ 변경/수정/2차저작❎ 러시아를 비롯한 전쟁을 돕는
✅ 개인적 사용❎ 아무런 변경사항 없이 복제
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
          QwreeyKawaii license v1.3
-Copyright 2023. Qwreey [qwreey75@gmail.com]
-
-이 라이선스는 DBAD 라이선스를 기반으로 합니다.
-누구든지 이 라이선스 문서의 원본 혹은 수정본을
-복사, 편집, 배포 할 수 있습니다.
-
-QwreeyKawaii 라이선스의 복사 배포 및 수정에
-관한 규정과 조건.
-
-1. 당신은 이 귀여운 창작물을 가지고 어떠한
-것이든 할 수 있습니다. 단, 무례하지 마세요.
-무례한 행동은 통상적으로 다음과 같습니다.
-
-가. 귀여운 이 창작물을 어떠한 가공도 없이
-    복제하거나, 이름만 바꾸는 것은 무례하며
-    노골적인 저작권 침해입니다.
-나. 귀여운 이 창작물에 음란성 혹은 유해한
-    콘텐츠를 포함시키는 것은 무례합니다.
-    귀여운 콘텐츠로 다른이를 해치지 마십시오.
-
-그러나 이에만 국한되는것은 아닙니다.
-무엇보다도, 귀여운 타인을 상처주지 마세요.
-
-2. 당신이 이 창작물을 사용해 많은 이득을 본
-경우, 귀여운 창작자에게 사랑을 배푸세요.
-인간적인 사람은 귀여운 사람들을 외면하지
-않습니다. 당신의 커피 한잔을 나눠주세요.
-
-3. 이 창작물은 어떠한 보증 없이 제공됩니다.
-이 창작물을 사용하다, 창작자의 귀여운
-실수로 인해 무언가 잘못되었다면, 문제를 직접
-해결하세요. 무례하지 않은 사람은 적어도
-귀여운 타인들을 비난하거나 모욕하지는 않으며
-수정본을 제출하거나 버그리포트를 제출 할
-것입니다.
-
-4. 당신이 이 귀여운 창작물을 활용해 다른 창작물
-을 만들고 싶은 경우 적어도 사용했다는 고지는
-남겨주세요. 귀여운 창작자들은 자신의 창작물이
-좋은곳에 사용되었음을 기뻐할 것입니다.
-* 이는 권고 사항입니다. 필수가 아니며 불가피한
-    경우 무시될 수 있습니다
-
-5. 러시아 국적의 이들은 이 창작물을 영리 목적으로
-사용할 수 없습니다. - 우리는 전쟁자금을
-지원하지 않습니다.
-같은 이유로써, 전쟁이 지원될 수 있는 곳에서의
-이 창작물 사용을 허용하지 않습니다.
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PermissionsLimitationsConditions
✅ Commercial use❎ Warranty❓ License and copyright notice (Recommendation)
✅ Distribution❎ Being Rude
✅ Modification❎ Russian, And supporting war
✅ Private use❎ Copy without any modification
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
          QwreeyKawaii license v1.3
-
-Copyright 2023. Qwreey [qwreey75@gmail.com]
-
-This license is based on DBAD license.
-Everyone is permitted to copy and distribute
-verbatim or modified copies of this license
-document.
-
-TERMS, AND CONDITIONS FOR COPYING,
-DISTRIBUTION, AND MODIFICATION
-
-1. You can do anything with this original work,
-but don't be rude
-
-In general, being rude includes below
-
-First. Do not copy these cute works without
-        any modification. changing the name
-        only is outright copyright infringement
-Second. Do not add some harmful or NSFW content.
-        It's very rude and may harm others
-
-Being rude is not limited to these instances.
-Above all, don't hurt cute people
-
-2. If you get any benefit or profit from these cute
-works, Share the love. A polite person may share
-the love with cute people.
-3. These cute works are provided with no warranty.
-If something goes wrong due to the creator's cute
-mistake, Fix it yourself. A polite person may
-submit the fix or bug report.
-4. If you create something with these works, Leave
-the original creator's name in your work.
-the cute creator will be happy if their works are
-used for good.
-* This is a recommendation. Not required.
-5. Russian nationality can not use this creation for
-commercial purposes. — We do not support the war.
-Same reason, This creation cannot be used where
-it can support the war.
-
-
-
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/event/index.html b/docs/kr/reference/event/index.html deleted file mode 100644 index 5edfafe..0000000 --- a/docs/kr/reference/event/index.html +++ /dev/null @@ -1,1187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Event - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Event

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/extend/index.html b/docs/kr/reference/extend/index.html deleted file mode 100644 index a6c5cfc..0000000 --- a/docs/kr/reference/extend/index.html +++ /dev/null @@ -1,1753 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Extend - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Extend

-

self(name:string)->linker

-
-

Extend 메소드 전역에서 사용가능합니다. 링커를 만들며, PropertyChangedSignal 를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.

-
-
-

Overwite REQUIRED :Render(props:valueStore)

-
-

화면에 그려지는 UI 를 만들어지게 하는 함수입니다. Extend 가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Event = Quad.Event
-local Mount = Quad.Mount
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        [Event "MouseButton1Click"] = function (self,x,y)
-            print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y))
-        end;
-        Size = props "Size";
-        Text = props "Text"; -- 레지스터를 이용합니다
-    }
-end
-
-local myImported = Class(myClass)
-myImported.Size = UDim2.fromOffset(200,200)
-
-local test = myImported {
-    Text = "wow"
-}
-Mount(ScreenGUI, test)
-
--- 텍스트를 업데이트합니다
-while task.wait(1) do
-    test.Text = "w"..("o"):rep(#test.Text-1).."w"
-end
-
-
-
-

Overwite Option :Init(props:valueStore)

-
-

선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Init(props)
-    -- Size 값이 없다면 기본값을 사용하도록 합니다.
-    props:Default("Size", UDim2.fromOffset(100,100))
-
-    -- 앞에 _ 를 붇여 내부 변수를 만듭니다.
-    -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다.
-    self._asdf = true
-end
-function myClass:Render(props)
-    return TextButton {
-        props "Size"
-    }
-end
-
-local myImported = Class(myClass)
-local myButton = myImported() -- 옵션 없음
-print(myButton.Size)
-
-
-
-

Overwite Option :AfterRender(object:any)

-
-

선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button"; -- 자기 자신에 이 버튼을 넣습니다
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button == object) -- true
-end
-
-local myImported = Class(myClass)
-myImported() -- 옵션 없음
-
-
-
-

Overwite Option :Update()

-
-

:Render:AfterRender 를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:Update() -- update
-myButton:Update() -- update
-myButton:Update() -- update
-

-
-
-

Overwite Option .Getter.<PropertyName>(self)

-
-

값을 얻는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {}
-end
--- 값을 읽는데 사용할 함수를 등록합니다
-function myClass.Getter.Test(self)
-    return "Hello World"
-end
-
-local myImported = Class(myClass)
-print(myImported().Test)
-

-
-
-

Overwite Option .Setter.<PropertyName>(self,newValue:any)

-
-

값을 설정하는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button";
-        Text = "wow";
-    }
-end
--- 값을 지정하는데 사용할 함수를 등록합니다
-function myClass.Setter.Test(self,newValue)
-    self._button.Text = newValue
-end
-function myClass.Getter.Test(self)
-    return self._button.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-print(myButton.Test)
-myButton.Test = "Hello World"
-print(myButton.Test)
-

-
-
-

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

-
-

해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
--- 값 변경시 업데이트 여부를 지정합니다
-myClass.UpdateTriggers.Test = true
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-

-
-
-

Overwite Option :Unload(object)

-
-

:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다

-
-
-

:GetPropertyChangedSignal(propertyName:string)->Bindable

-
-

값 변경을 연결할 수 있는 Bindable을 반환합니다. :EmitPropertyChangedSignal 으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.

-
-
-

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

-
-

프로퍼티 변경시 :GetPropertyChangedSignal 에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로 self.a = 1 과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다. changedValue 는 선택사항이며, 주어지지 않으면 self[propertyName]을 반환합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_box";
-        Text = "test";
-        Size = UDim2.fromOffset(200,200);
-        [Evnet.Prop "Text"] = function (this,newValue)
-            self:EmitPropertyChangedSignal("Text",newValue)
-        end;
-        -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다.
-        -- self(name:string) 문법으로 변경 이벤트 역시 링크
-        -- 할 수 있습니다.
-    }
-end
-function myClass.Getter.Text(self)
-    return self._box.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:GetPropertyChangedSignal("Text"):Connect(function()
-    print(myButton.Text)
-end)
-Mount(ScreenGUI, myButton)
-

-
-
-

Event .ChildAdded:Connect((child)->())->Connection

-
-

자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 또는 :AfterRender 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, 추후 Mount 를 통해 추가되는 자식 오브젝트 또한 이 이벤트로 얻어질 수 있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    self.ChildAdded:Connect(function(child)
-        print(child.Name)
-    end)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
-    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
-    -- 얻어올 수 있습니다.
-    TextButton { Name = "Hello "};
-}
-
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
-
-

:GetChildren()

-
-

자식 오브젝트들을 가져오는 함수입니다. :Init():AfterRender() 에서는 빈 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    for i,v in ipairs(self:GetChildren()) do
-        print(v.Name)
-    end
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    TextButton { Name = "Hello World"};
-}
-
--- 나중에 추가하는 오브젝트는 출력되지 않습니다.
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/index.html b/docs/kr/reference/index.html deleted file mode 100644 index ddaee88..0000000 --- a/docs/kr/reference/index.html +++ /dev/null @@ -1,1178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Reference - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Reference

-

이 섹션은 api 내용을 나열하지만, 깊게 설명하지 않을 수 있습니다. 튜토리얼 문서를 읽어보는것을 권장합니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/lang/index.html b/docs/kr/reference/lang/index.html deleted file mode 100644 index fdcc4af..0000000 --- a/docs/kr/reference/lang/index.html +++ /dev/null @@ -1,1278 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lang - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Lang

-

Lang.FailedMessage:string

-
-

아무런 번역 값도 얻어오지 못하였을때 보여줄 문자열입니다.
-변경시 자동으로 업데이트가 이루워집니다.

-
-
-

Lang.CurrentLocale:Locale<item of Lang.Locales>

-
-

현제 사용중인 언어입니다. 변경시 자동으로 업데이트가 이루워집니다.
-Lang.Locales 안의 값을 사용합니다.

-
-
-

Lang.Locales

-

Default (default)
-English (en-us)
-Spanish (es-es)
-French (fr-fr)
-Indonesian (id-id)
-Italian (it-it)
-Japanese (ja-jp)
-Korean (ko-kr)
-Russian (ru-ru)
-Thai (th-th)
-Turkish (tr-tr)
-Vietnamese (vi-vn)
-Portuguese (pt-br)
-German (de-de)
-ChineseSimplified (zh-cn)
-ChineseTraditional (zh-tw)
-Bulgarian (bg-bg)
-Bengali (bn-bd)
-Czech (cs-cz)
-Danish (da-dk)
-Greek (el-gr)
-Estonian (et-ee)
-Finnish (fi-fi)
-Hindi (hi-in)
-Croatian (hr-hr)
-Hungarian (hu-hu)
-Georgian (ka-ge)
-Kazakh (kk-kz)
-Khmer (km-kh)
-Lithuanian (lt-lt)
-Latvian (lv-lv)
-Malay (ms-my)
-Burmese (my-mm)
-Bokmal (nb-no)
-Dutch (nl-nl)
-Filipino (fil-ph)
-Polish (pl-pl)
-Romanian (ro-ro)
-Ukrainian (uk-ua)
-Sinhala (si-lk)
-Slovak (sk-sk)
-Slovenian (sl-sl)
-Albanian (sq-al)
-Bosnian (bs-ba)
-Serbian (sr-rs)
-Swedish (sv-se)
-Arabic (ar-001)

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/mounts/index.html b/docs/kr/reference/mounts/index.html deleted file mode 100644 index ce62598..0000000 --- a/docs/kr/reference/mounts/index.html +++ /dev/null @@ -1,1274 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mounts - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Mounts

-

:Unmount()

-
-

이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해 Store.GetObject 에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui,mainFrame)
-
-local childFrame = Frame {}
-local childFrameMount = Mount(mainFrame,childFrame)
-childFrameMount:Unmount()
--- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다
--- 즉, Destroy() 가 호출됩니다
-
-
-
-

:Add(item:any)

-
-

Mount 에 오브젝트를 추가합니다. 처음 설정한 to 값을 따라 부모가 결정됩니다.

-

이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui, mainFrame)
-
-local lastListMount = Mount(mainFrame)
-local function refreshList()
-    lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다
-    for i = 1,10 do
-        lastListMount:Add(Frame { Name = tostring(i) })
-    end
-end
-
-task.spawn(function()
-    while true do
-        refreshList()
-        task.wait(2)
-    end
-end)
-
-

다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단 ScrollFrame 의 경우 CanvasPosition이 초기화 되어버리므로 자식들을 :Unmount() 하기 전에 위치를 저장하고 다시 불러와야 합니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/quadProperty/index.html b/docs/kr/reference/quadProperty/index.html deleted file mode 100644 index 469afbc..0000000 --- a/docs/kr/reference/quadProperty/index.html +++ /dev/null @@ -1,1194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - QuadProperty - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

QuadProperty

-

RoundSize:number?

-
-

ImageLabel, ImageButton 에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로 UICorner보다 부드러운 코너효과를 제공합니다.

-
-
-

Corner:number?

-
-

모든 로블록스 UI오브젝트에 적용됩니다. UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.

-
-
-

PaddingAll:UDim?

-
-

UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다. PaddingAllOffset 과 함깨 사용할 수 없습니다.

-
-
-

PaddingAllOffset:number?

-
-

UIPadding을 적용합니다. PaddingAll과 같은 방법으로 작동하나, Offset값만 설정할 수 있습니다. PaddingAll 과 함깨 사용할 수 없습니다.

-
-
-

Scale:number?

-
-

UIScale을 적용합니다. UIScale.Scale 과 같은 효과를 나타냅니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/signal/bindable/index.html b/docs/kr/reference/signal/bindable/index.html deleted file mode 100644 index eff5483..0000000 --- a/docs/kr/reference/signal/bindable/index.html +++ /dev/null @@ -1,1224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Bindable - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Bindable

-

:Fire(...any)

-
-

등록된 연결들을 실행하고, Wait 을 풀어줍니다.

-
-
-

:Wait()->(...any)

-
-

Fire 가 호출될 때 까지 기다립니다. Fire 에 사용된 값이 반환됩니다.

-
-
-

:Connect((...any)->())->Connection

-
-

Fire 가 호출 될 때 함수가 실행되도록 만듭니다. Fire 에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록 Connection 이 제공됩니다.

-
-
-

:Once((...any)->())->Connection

-
-

Connect 와 유사하지만, Fire 가 한번 호출된 뒤 연결이 끊어집니다/

-
-
-

:CheckConnected(func)->boolean

-
-

함수가 이미 등록되어 있는지 여부를 반환합니다.

-
-
-

:DisconnectAll()

-
-

모든 연결을 끊습니다. Wait 으로 기다리고 있는 곳에는 nil 을 반환합니다.

-
-
-

:Destroy()

-
-

:DisconnectAll() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/signal/disconnecter/index.html b/docs/kr/reference/signal/disconnecter/index.html deleted file mode 100644 index 3b667c6..0000000 --- a/docs/kr/reference/signal/disconnecter/index.html +++ /dev/null @@ -1,1205 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Disconnecter - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Disconnecter

-

:Add(connection:Connection|RBXScriptConnection)

-
-

connection을 리스트에 추가합니다. 나중에 :Disconnect를 호출하면 추가된 연결이 파기됩니다.

-
-
-

:Disconnect()

-
-

추가된 모든 연결에 Disconnect() 를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시 :Add 를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면 :Destroy 를 호출하세요

-
-
-

:Destroy()

-
-

:Disconnect() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/signal/index.html b/docs/kr/reference/signal/index.html deleted file mode 100644 index 1b99a20..0000000 --- a/docs/kr/reference/signal/index.html +++ /dev/null @@ -1,1187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Signal - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Signal

-

Signal.Bindable.New(id:string)->Bindable

-
-

새로운 Bindable 을 생성하거나 이전의 Bindable 을 반환합니다.

-
-

Signal.Disconnecter.New(id:string)->Disconnecter

-
-

새로운 Disconnecter 을 생성하거나 이전의 Disconnecter 을 반환합니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/store/index.html b/docs/kr/reference/store/index.html deleted file mode 100644 index e88c594..0000000 --- a/docs/kr/reference/store/index.html +++ /dev/null @@ -1,1194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Store - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Store

-

Store.GetStore(id:string?)->store

-
-

값들을 저장하고 레지스터를 생성할 수 있는 값 저장소를 반환합니다.

-
-
-

Store.GetObject(id:string)->Object?

-
-

해당 id 를 가진 생성된 오브젝트를 반환합니다.

-
-
-

Store.GetObjects(id:string)->objectList?

-
-

해당 id 를 가진 생성된 오브젝트들을 반환합니다. 반환은 objectList 타입을 가지고 있습니다.
-고급 ID 를 사용할 수 있습니다. 자세한 사항은 튜토리얼 문서를 확인하세요.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/store/objectList/index.html b/docs/kr/reference/store/objectList/index.html deleted file mode 100644 index 4e3ba9a..0000000 --- a/docs/kr/reference/store/objectList/index.html +++ /dev/null @@ -1,1210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - ObjectList - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

ObjectList

-

:Each((item:any, index:number)->())

-
-

일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다

-
-
-

:EachAsync((item:any, index:number)->())

-
-

반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-코루틴이 이용됩니다. wrap() 코루틴을 모르거나, 필요성이 없는경우 일반적으로 :Each 를 사용해도 됩니다

-
-
-

:IsEmpty()

-
-

이 ObjectList 가 비어있는지 여부를 반환합니다.

-
-
-

:Remove(indexOrItem:number|any)

-
-

objectList 에서 해당하는 오브젝트를 제거합니다.
-, & 를 사용한 고급 검색에서는 작동하지 않습니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/tween/directions/index.html b/docs/kr/reference/tween/directions/index.html deleted file mode 100644 index 1c34e42..0000000 --- a/docs/kr/reference/tween/directions/index.html +++ /dev/null @@ -1,1197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directions - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Tween.Directions

-

Out
-초반에 가속이 이루워지며, 후반에 느려집니다.

-
-

In
-초반에는 느리며, 점점 가속이 늘어납니다.

-
-

InOut
-중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/tween/easings/index.html b/docs/kr/reference/tween/easings/index.html deleted file mode 100644 index 58dd17a..0000000 --- a/docs/kr/reference/tween/easings/index.html +++ /dev/null @@ -1,1267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Easings - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Tween.Easings

-
-
-
-

- -

-
-
-

-함수 개형
-

-
-
-
-

모든 Easing 은 여기에서 직접적으로 확인할 수 있습니다.

-

Linear

-
-

아무런 가감속이 없는 1차형 함수입니다
-i=x, x=0 to 1

-
-
-

Quint

-
-

5 제곱을 이용한 가감속 함수입니다. Quart 보다 가파른 개형을 가졌습니다
-(^5) i=1-(1-x)^5, x=0 to 1

-
-
-

Quart

-
-

네제곱을 이용한 가감속 함수입니다. Cubic 보다 가파른 개형을 가졌습니다
-(^4) i=1-(1-x)^4, x=0 to 1

-
-
-

Cubic

-
-

세제곱을 이용한 가감속 함수입니다. Quad 보다 가파른 개형을 가졌습니다
-(^3) i=1-(1-x)^3, x=0 to 1

-
-
-

Quad

-
-

제곱을 이용한 가감속 함수입니다.
-(^2) i=1-(1-x)^2, x=0 to 1

-
-
-

Expo

-
-

지수형 가감속 함수입니다. 매우 가파른 개형을 가졌습니다.
-i=1-2^(-10*x), x=0 to 1

-
-
-

Sin

-
-

사인 파형 가감속 함수입니다.
-i=sin(x*pi/2), x=0 to 1

-
-
-

Circle

-
-

사분원 가감속 함수입니다.
-i=sqrt(1-(1-x)^2), x=0 to 1

-
-
-

Back

-
-

시작시 뒤로 이동이 있는 가감속 함수입니다.

-
-
-

Elastic

-
-

탄성을 가지는 가감속 함수입니다.

-
-
-

Bounce

-
-

튀어오름을 가지는 가감속 함수입니다.

-
-

TODO: 애니메이션 미리보기 영상 추가

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/tween/index.html b/docs/kr/reference/tween/index.html deleted file mode 100644 index 04889de..0000000 --- a/docs/kr/reference/tween/index.html +++ /dev/null @@ -1,1323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tween - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Tween

-

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

-
-

트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -Ended, OnStepped, Setter, Getter 값이 설정되면 Option 안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록 TweenHandler 가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. -

1
-2
-3
-4
-5
Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

-
-

Tween.RunTween 와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
-

1
-2
-3
-4
-5
Tween.RunTween({myFrame1, myFrame2, myFrame3},{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.StopTween(ItemOrHandler:TweenHandler|any)

-
-

트윈을 멈춥니다. TweenHandler 또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.

-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(Handler)
-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(myFrame)
-
-
-
-
-
-
-

Tween.StopPropertyTween(Item:any, PropertyName:string)

-
-

오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

-
-

해당 오브젝트 또는 TweenHandler 로 트윈이 진행중인지 여부를 판단합니다.

-
-
-

Tween.IsPropertyTweening(Item:any, PropertyName:string)

-
-

해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-그래프와 미리보기는 Easings 에서 확인할 수 있습니다

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-자세한 정보는 Easings 에서 확인할 수 있습니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/reference/tween/tweenOptions/index.html b/docs/kr/reference/tween/tweenOptions/index.html deleted file mode 100644 index 1e16171..0000000 --- a/docs/kr/reference/tween/tweenOptions/index.html +++ /dev/null @@ -1,1289 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - TweenOptions - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

TweenOptions

-

Option Time:number?

-
-

트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면 1이 사용됩니다.

-
-
-

Option Easing:string|(index:number)->number?

-
-

트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나, Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면 Exp2가 사용됩니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option Direction:string?

-
-

트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나, Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면 Out이 사용됩니다. -

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

-
-

선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며, "*" 를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.

-
-
-

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 "*" 를 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 1을 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Getter:(Item:any, Property:string)->any?

-
-

선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
-
-

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

-
-

선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/search/search_index.json b/docs/kr/search/search_index.json deleted file mode 100644 index 65e2471..0000000 --- a/docs/kr/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Quad","text":"

\ucc98\uc74c\uc624\uc168\ub098\uc694? \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\uc138\uc694! \ucc98\uc74c\ubd80\ud130 \ucc28\uadfc\ucc28\uadfc Quad \ubaa8\ub4c8\uc744 \uc815\ubcf5\ud560 \uc218 \uc788\uc5b4\uc694

"},{"location":"changelogs/","title":"\ubc84\uc804 \ubc88\uacbd\uc0ac\ud56d","text":""},{"location":"changelogs/#225","title":"2.25","text":"

\uc2e4\ud5d8\uc801 API \ub85c\uc368 GetChildren() \uacfc ChildAdded::Bindable \uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#224","title":"2.24","text":"

\ubaa8\ub4e0 \ubb38\uc11c\uac00 \uc815\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#223","title":"2.23","text":"

\uac1d\uccb4 \uc0dd\uc131\uc2dc \uc77c\uc5b4\ub098\ub294 \uc624\ub958\ub97c \ud574\uacb0\ud588\uc2b5\ub2c8\ub2e4. \uc774\uc81c Extend \uac1d\uccb4 \ub0b4\ubd80 \uc790\uc2dd\uc774 Unmount \ub418\ub294 \uacbd\uc6b0 __child \uc5d0\uc11c \uc81c\uac70\ub429\ub2c8\ub2e4. types \uc758 \uc624\ud0c0\ub97c \uace0\ucce4\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#222","title":"2.22","text":"

\ub354\uc774\uc0c1 Event.Prop \uac00 \ucc98\uc74c \uc0dd\uc131\uc2dc \uc2e4\ud589\ub418\ub294 \uc77c\uc774 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#221","title":"2.21","text":"

Linker \uac00 \uc774\uc81c \ud074\ub798\uc2a4 \uc548 \ud074\ub798\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub3c4\ub85d \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#220","title":"2.20","text":"

Docments \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub9ce\uc740\uc591\uc758 \uc0c8\ub85c\uc6b4 \ud29c\ud1a0\ub9ac\uc5bc\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Mkdocs \ud14c\ub9c8\uc640 \uc5ec\ub7ec\uac00\uc9c0 \uc124\uc815\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Makefile \uc744 \ud1b5\ud574\uc11c rojo build \uc640 mkdocs build \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#219","title":"2.19","text":"

Linker \uac1d\uccb4\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c GetPropertyChangedSignal \uc640, self \uc5d0 \ud2b9\uc815 \uc624\ube0c\uc81d\ud2b8 \ud639\uc740 \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#218","title":"2.18","text":"

\uc774\uc81c \ub354\uc774\uc0c1 GC \uc5d0 \uc758\ud574 Store \uc758 Instance \uac12\uc774 \uc190\uc2e4\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#217","title":"2.17","text":"

Tween \uc758 CallBack \ub4f1\ub85d \uc2dc \uc8fc\uc5b8\uc9c0\ub294 \ud30c\ub77c\uba54\ud130\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c \ub354\uc774\uc0c1 ~ \ubb38\uc774 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#215-breaking-changes","title":"2.15 BREAKING CHANGES","text":"

\uc774\uc81c Lang \uc5d0\uc11c CurrentLocale, FailedMessage \uc744 \ubcc0\uacbd\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4. \ub610\ud55c \uc77c\ubd80 \ud544\ub4dc\uc758 \ub124\uc774\ubc0d\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#214","title":"2.14","text":"

Lang \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. register \ub97c \uc0ac\uc6a9\ud574 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub2e4\uc911\uc5b8\uc5b4 \uc9c0\uc6d0\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#213","title":"2.13","text":"

Signal \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Class.Extend \uc5d0\uc11c GetPropertyChangedSignal \uacfc EmitPropertyChangedSignal \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#212","title":"2.12","text":"

Mount \ubc18\ud658 \uac1d\uccb4\uc5d0 Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Mount \uac1d\uccb4\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#211","title":"2.11","text":"

Store.GetObjects \uc5d0 \uc774\uc81c & \ubb38\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#29","title":"2.9","text":"

PreloadAsync \ub97c \ud1b5\ud574 \uc774\uc81c round.lua \uc5d0\uc11c \ub77c\uc6b4\ub4dc \uc774\ubbf8\uc9c0\ub97c \ubbf8\ub9ac \ub85c\ub4dc\ud569\ub2c8\ub2e4.

"},{"location":"changelogs/#28","title":"2.8","text":"

\ubc18\ud658 \uad00\ub828 \ucf54\ub4dc\uac00 exports \ub85c \uc774\uc8fc\ub418\uc5c8\uc73c\uba70. init.lua \uc5d0\uc11c\ub294 \uc790\ub3d9\uc801\uc73c\ub85c types \ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

"},{"location":"changelogs/#27","title":"2.7","text":"

\uc774\uc81c types \ub97c \uc644\uc804\ud788 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc9c1\uc811 \ubd88\ub7ec\uc640 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"changelogs/#2126-breaking-changes","title":"2.1~2.6 BREAKING CHANGES","text":"

\ubaa8\ub4e0 \ubaa8\ub4c8\uc758 \ud544\ub4dc\uc758 \uc774\ub984\uc774 \ubcc0\uacbd\ub418\uc5c8\uc73c\uba70, \ubaa8\ub4e0 \ud074\ub798\uc2a4\ub4e4\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \ub300\ubb38\uc790 \uc2dc\uc791 \ub124\uc774\ubc0d\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uba85\uba85\uaddc\uce59\uc744 \ubcc0\uacbd\ud588\uc2b5\ub2c8\ub2e4.

"},{"location":"changelogs/#20","title":"2.0","text":"

\ubc84\uc804 \ud310\uc62c\ub9bc, BREAKING CHANGES \ub97c \uc704\ud574 \ubc84\uc804\uc744 \ud310\uc62c\ub9bc \ud558\uc600\uc2b5\ub2c8\ub2e4.

"},{"location":"gallery/","title":"\uac24\ub7ec\ub9ac","text":"

\uc5ec\uae30\ub294 \uc5ec\ub7ec\ubd84\ub4e4\uc758 \uc791\ud488\uc744 \uc62c\ub824\ubcfc \uc218 \uc788\ub294 \uacf3\uc785\ub2c8\ub2e4! Quad \ub97c \uc0ac\uc6a9\ud55c \uc5ec\ub7ec\uac00\uc9c0 \ud6cc\ub96d\ud55c \uc791\ud488\ub4e4\uc744 \ubcf4\uc5ec\uc8fc\uc138\uc694!

"},{"location":"license/","title":"\ub77c\uc774\uc120\uc2a4","text":"

QwreeyKawaii License v1.3

KoreanEnglish Permissions Limitations Conditions \u2705 \uc0c1\uc5c5\uc801 \uc0ac\uc6a9 \u274e \ubcf4\uc99d \u2753 \ub77c\uc774\uc120\uc2a4\uc640 \uc800\uc791\uad8c \uace0\uc9c0 (\uad8c\uace0\uc0ac\ud56d) \u2705 \ubc30\ud3ec \u274e \ubb34\ub840\ud558\uac8c \uad74\uae30 \u2705 \ubcc0\uacbd/\uc218\uc815/2\ucc28\uc800\uc791 \u274e \ub7ec\uc2dc\uc544\ub97c \ube44\ub86f\ud55c \uc804\uc7c1\uc744 \ub3d5\ub294 \u2705 \uac1c\uc778\uc801 \uc0ac\uc6a9 \u274e \uc544\ubb34\ub7f0 \ubcc0\uacbd\uc0ac\ud56d \uc5c6\uc774 \ubcf5\uc81c
          QwreeyKawaii license v1.3\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\n\uc774 \ub77c\uc774\uc120\uc2a4\ub294 DBAD \ub77c\uc774\uc120\uc2a4\ub97c \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4.\n\ub204\uad6c\ub4e0\uc9c0 \uc774 \ub77c\uc774\uc120\uc2a4 \ubb38\uc11c\uc758 \uc6d0\ubcf8 \ud639\uc740 \uc218\uc815\ubcf8\uc744\n\ubcf5\uc0ac, \ud3b8\uc9d1, \ubc30\ud3ec \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\nQwreeyKawaii \ub77c\uc774\uc120\uc2a4\uc758 \ubcf5\uc0ac \ubc30\ud3ec \ubc0f \uc218\uc815\uc5d0\n\uad00\ud55c \uaddc\uc815\uacfc \uc870\uac74.\n\n1. \ub2f9\uc2e0\uc740 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \uac00\uc9c0\uace0 \uc5b4\ub5a0\ud55c\n\uac83\uc774\ub4e0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \ubb34\ub840\ud558\uc9c0 \ub9c8\uc138\uc694.\n\ubb34\ub840\ud55c \ud589\ub3d9\uc740 \ud1b5\uc0c1\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\n\n\uac00. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc5b4\ub5a0\ud55c \uac00\uacf5\ub3c4 \uc5c6\uc774\n    \ubcf5\uc81c\ud558\uac70\ub098, \uc774\ub984\ub9cc \ubc14\uafb8\ub294 \uac83\uc740 \ubb34\ub840\ud558\uba70\n    \ub178\uace8\uc801\uc778 \uc800\uc791\uad8c \uce68\ud574\uc785\ub2c8\ub2e4.\n\ub098. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc5d0 \uc74c\ub780\uc131 \ud639\uc740 \uc720\ud574\ud55c\n    \ucf58\ud150\uce20\ub97c \ud3ec\ud568\uc2dc\ud0a4\ub294 \uac83\uc740 \ubb34\ub840\ud569\ub2c8\ub2e4.\n    \uadc0\uc5ec\uc6b4 \ucf58\ud150\uce20\ub85c \ub2e4\ub978\uc774\ub97c \ud574\uce58\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.\n\n\uadf8\ub7ec\ub098 \uc774\uc5d0\ub9cc \uad6d\ud55c\ub418\ub294\uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.\n\ubb34\uc5c7\ubcf4\ub2e4\ub3c4, \uadc0\uc5ec\uc6b4 \ud0c0\uc778\uc744 \uc0c1\ucc98\uc8fc\uc9c0 \ub9c8\uc138\uc694.\n\n2. \ub2f9\uc2e0\uc774 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud574 \ub9ce\uc740 \uc774\ub4dd\uc744 \ubcf8\n\uacbd\uc6b0, \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\uc5d0\uac8c \uc0ac\ub791\uc744 \ubc30\ud478\uc138\uc694.\n\uc778\uac04\uc801\uc778 \uc0ac\ub78c\uc740 \uadc0\uc5ec\uc6b4 \uc0ac\ub78c\ub4e4\uc744 \uc678\uba74\ud558\uc9c0\n\uc54a\uc2b5\ub2c8\ub2e4. \ub2f9\uc2e0\uc758 \ucee4\ud53c \ud55c\uc794\uc744 \ub098\ub220\uc8fc\uc138\uc694.\n\n3. \uc774 \ucc3d\uc791\ubb3c\uc740 \uc5b4\ub5a0\ud55c \ubcf4\uc99d \uc5c6\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n\uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud558\ub2e4, \ucc3d\uc791\uc790\uc758 \uadc0\uc5ec\uc6b4\n\uc2e4\uc218\ub85c \uc778\ud574 \ubb34\uc5b8\uac00 \uc798\ubabb\ub418\uc5c8\ub2e4\uba74, \ubb38\uc81c\ub97c \uc9c1\uc811\n\ud574\uacb0\ud558\uc138\uc694. \ubb34\ub840\ud558\uc9c0 \uc54a\uc740 \uc0ac\ub78c\uc740 \uc801\uc5b4\ub3c4\n\uadc0\uc5ec\uc6b4 \ud0c0\uc778\ub4e4\uc744 \ube44\ub09c\ud558\uac70\ub098 \ubaa8\uc695\ud558\uc9c0\ub294 \uc54a\uc73c\uba70\n\uc218\uc815\ubcf8\uc744 \uc81c\ucd9c\ud558\uac70\ub098 \ubc84\uadf8\ub9ac\ud3ec\ud2b8\ub97c \uc81c\ucd9c \ud560\n\uac83\uc785\ub2c8\ub2e4.\n\n4. \ub2f9\uc2e0\uc774 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \ud65c\uc6a9\ud574 \ub2e4\ub978 \ucc3d\uc791\ubb3c\n\uc744 \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uc801\uc5b4\ub3c4 \uc0ac\uc6a9\ud588\ub2e4\ub294 \uace0\uc9c0\ub294\n\ub0a8\uaca8\uc8fc\uc138\uc694. \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\ub4e4\uc740 \uc790\uc2e0\uc758 \ucc3d\uc791\ubb3c\uc774\n\uc88b\uc740\uacf3\uc5d0 \uc0ac\uc6a9\ub418\uc5c8\uc74c\uc744 \uae30\ubed0\ud560 \uac83\uc785\ub2c8\ub2e4.\n* \uc774\ub294 \uad8c\uace0 \uc0ac\ud56d\uc785\ub2c8\ub2e4. \ud544\uc218\uac00 \uc544\ub2c8\uba70 \ubd88\uac00\ud53c\ud55c\n    \uacbd\uc6b0 \ubb34\uc2dc\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n\n5. \ub7ec\uc2dc\uc544 \uad6d\uc801\uc758 \uc774\ub4e4\uc740 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc601\ub9ac \ubaa9\uc801\uc73c\ub85c\n\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. - \uc6b0\ub9ac\ub294 \uc804\uc7c1\uc790\uae08\uc744\n\uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\uac19\uc740 \uc774\uc720\ub85c\uc368, \uc804\uc7c1\uc774 \uc9c0\uc6d0\ub420 \uc218 \uc788\ub294 \uacf3\uc5d0\uc11c\uc758\n\uc774 \ucc3d\uc791\ubb3c \uc0ac\uc6a9\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n
Permissions Limitations Conditions \u2705 Commercial use \u274e Warranty \u2753 License and copyright notice (Recommendation) \u2705 Distribution \u274e Being Rude \u2705 Modification \u274e Russian, And supporting war \u2705 Private use \u274e Copy without any modification
          QwreeyKawaii license v1.3\n\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\nThis license is based on DBAD license.\nEveryone is permitted to copy and distribute\nverbatim or modified copies of this license\ndocument.\n\nTERMS, AND CONDITIONS FOR COPYING,\nDISTRIBUTION, AND MODIFICATION\n\n1. You can do anything with this original work,\nbut don't be rude\n\nIn general, being rude includes below\n\nFirst. Do not copy these cute works without\n        any modification. changing the name\n        only is outright copyright infringement\nSecond. Do not add some harmful or NSFW content.\n        It's very rude and may harm others\n\nBeing rude is not limited to these instances.\nAbove all, don't hurt cute people\n\n2. If you get any benefit or profit from these cute\nworks, Share the love. A polite person may share\nthe love with cute people.\n3. These cute works are provided with no warranty.\nIf something goes wrong due to the creator's cute\nmistake, Fix it yourself. A polite person may\nsubmit the fix or bug report.\n4. If you create something with these works, Leave\nthe original creator's name in your work.\nthe cute creator will be happy if their works are\nused for good.\n* This is a recommendation. Not required.\n5. Russian nationality can not use this creation for\ncommercial purposes. \u2014 We do not support the war.\nSame reason, This creation cannot be used where\nit can support the war.\n
"},{"location":"todo/","title":"\ud560\uc77c","text":""},{"location":"todo/#_2","title":"\uc9c4\ud589\uc911\uc774\uac70\ub098 \uac80\ud1a0\uc911","text":""},{"location":"todo/#easing","title":"Easing \ubb38\uc11c","text":"

Easing \ubb38\uc11c\uc5d0 Out In Inout \ube44\uad50 \uc601\uc0c1 \ub9cc\ub4e4\uae30

"},{"location":"todo/#spring","title":"Spring","text":"

Spring \ubb3c\ub9ac \uacc4\uc0b0\uc744 UI \uc560\ub2c8\uba54\uc774\uc158\uc5d0 \uc801\uc6a9\ud569\ub2c8\ub2e4 WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

"},{"location":"todo/#quad-debuger","title":"Quad Debuger","text":"

Register \uc758 \uc0c1\ud0dc\uc640 Store \uc758 \uac12, Class \uc758 \ub3d9\uc791 \uc5ec\ubd80 \ub4f1 Quad \uc758 \uc5ec\ub7ec \uc790\uc6d0\uc744 \uae34\ubc00\ud558\uac8c \ub514\ubc84\uadf8\ud569\ub2c8\ub2e4. WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

"},{"location":"todo/#selection","title":"Selection","text":"

Tab \ud0a4\ub4f1\uc73c\ub85c \ubc84\ud2bc \uc120\ud0dd\ud558\uae30 (... \uac00\ub2a5\ud568?) WIP. \uac80\ud1a0\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

"},{"location":"todo/#_3","title":"\uba3c \ubbf8\ub798\uc5d0 . . .","text":"

\ud639\uc740 \uc774\ub8e8\uc6cc\uc9c0\uc9c0 \uc54a\ub294

"},{"location":"todo/#quad-component-studio","title":"Quad Component Studio","text":"

\ub208\uc5d0 \ubcf4\uc774\ub294 \uc6cc\uc9c0\uc6cc\uadf8\uc2dd \ud3b8\uc9d1\uae30\ub97c \uc774\uc6a9\ud574 Quad Class \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.

"},{"location":"todo/#quad-webrender","title":"Quad WebRender","text":"

HTML, CSS, JS \ub85c\uc368 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubcc0\ud615\ud574 \uc2a4\ud29c\ub514\uc624 \uc5c6\uc774 \uac1c\ubc1c\ud558\ub294 \uac00\ubcbc\uc6b4 \uac1c\ubc1c\ubc95\uc785\ub2c8\ub2e4.

"},{"location":"todo/#quad-prerender","title":"Quad Prerender","text":"

\ubbf8\ub9ac \ub80c\ub354\ub9c1\ub41c rbxm \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. lua \uc2a4\ud06c\ub9bd\ud2b8\ub4e4\uc774 \ub9e4\ud551\ub418\uc5b4 \uc77c\ubc18\uc801\uc774\uac8c \ub3cc\uc544\uac11\ub2c8\ub2e4.

"},{"location":"include/bindable/","title":"Bindable","text":"

:Fire(...any)

\ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

:Wait()->(...any)

Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

:Connect((...any)->())->Connection

Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

:Once((...any)->())->Connection

Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

:CheckConnected(func)->boolean

\ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:DisconnectAll()

\ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

:Destroy()

:DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"include/connection/","title":"Connection","text":"

:Disconnect()

\uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

:Destroy()

:Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

"},{"location":"include/directions/","title":"Directions","text":"

Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

"},{"location":"include/disconnecter/","title":"Disconnecter","text":"

:Add(connection:Connection|RBXScriptConnection)

connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

:Disconnect()

\ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

:Destroy()

:Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"include/easings/","title":"Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

\ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

Linear

\uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

Quint

5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

Quart

\ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

Cubic

\uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

Quad

\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

Expo

\uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

Sin

\uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

Circle

\uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

Back

\uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

Elastic

\ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

Bounce

\ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

"},{"location":"include/events/","title":"Events","text":"

Event(name:string)

\ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

Event.Created

\uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

\uc8fc\uc758

Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

Event.CreatedAsync

Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

\uc8fc\uc758

Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

Event.Prop(propertyName:string)

\ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

-- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

"},{"location":"include/extend/","title":"Extend","text":"

self(name:string)->linker

Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

Overwite REQUIRED :Render(props:valueStore)

\ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

Overwite Option :Init(props:valueStore)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

Overwite Option :AfterRender(object:any)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

Overwite Option :Update()

:Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

Overwite Option .Getter.<PropertyName>(self)

\uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

Overwite Option .Setter.<PropertyName>(self,newValue:any)

\uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

\ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

Overwite Option :Unload(object)

:Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

:GetPropertyChangedSignal(propertyName:string)->Bindable

\uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

\ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

Event .ChildAdded:Connect((child)->())->Connection

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \ub610\ub294 :AfterRender \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

:GetChildren()

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

"},{"location":"include/locales/","title":"Locales","text":"

Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

"},{"location":"include/mounts/","title":"Mounts","text":"

:Unmount()

\uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

:Add(item:any)

Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

\uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

\ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

"},{"location":"include/objectList/","title":"objectList","text":"

:Each((item:any, index:number)->())

\uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

:EachAsync((item:any, index:number)->())

\ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

:IsEmpty()

\uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:Remove(indexOrItem:number|any)

objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

"},{"location":"include/quadProperty/","title":"quadProperty","text":"

RoundSize:number?

ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

Corner:number?

\ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

PaddingAll:UDim?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

PaddingAllOffset:number?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Scale:number?

UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

"},{"location":"include/register/","title":"Register","text":"

register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

:Add(value:any)->register

\uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:With((store:valueStore, newValue:any, key:string)->())->register

\ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:Tween(options:TweenOptions)->register

\ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
-- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

\ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:Default(value:any)->register

\uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

\uc8fc\uc758
  • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
  • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

\ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
\uc8fc\uc758

Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

:Observe((newValue:any)->())

:Register\uc758 \uac04\uc18c\ud654 \ubc84\uc804\uc785\ub2c8\ub2e4. :Register\uc640 \ub2e4\ub974\uac8c \uc790\ub3d9\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c GC \ub85c \ubd80\ud130 \ubcf4\ud638\ud558\uae30 \ub54c\ubb38\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c \ub530\ub85c \uc800\uc7a5 \ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70, \uc778\uc790\ub294 newValue \ud558\ub098\ub9cc \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

newValue \ub294 :Add, :With, :Tween, :Default \uac00 \uacc4\uc0b0\ub41c \uc0c1\ud0dc\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4.

\uac04\ub7b5\ud55c \uc6a9\ubc95
myStore.test = 1\nmyStore \"test\":Add(1):Observe(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n
"},{"location":"include/tween/","title":"Tween","text":"

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

\ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.StopTween(ItemOrHandler:TweenHandler|any)

\ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

Tween.StopPropertyTween(Item:any, PropertyName:string)

\uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

Tween.IsPropertyTweening(Item:any, PropertyName:string)

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"include/tweenOptions/","title":"tweenOptions","text":"

Option Time:number?

\ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

Option Easing:string|(index:number)->number?

\ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option Direction:string?

\ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Getter:(Item:any, Property:string)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

"},{"location":"include/typeDirections/","title":"typeDirections","text":"
type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
"},{"location":"include/typeEasings/","title":"typeEasings","text":"
type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
"},{"location":"reference/","title":"Reference","text":"

\uc774 \uc139\uc158\uc740 api \ub0b4\uc6a9\uc744 \ub098\uc5f4\ud558\uc9c0\ub9cc, \uae4a\uac8c \uc124\uba85\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\ub294\uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.

"},{"location":"reference/event/","title":"Event","text":""},{"location":"reference/extend/","title":"Extend","text":"

self(name:string)->linker

Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

Overwite REQUIRED :Render(props:valueStore)

\ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

Overwite Option :Init(props:valueStore)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

Overwite Option :AfterRender(object:any)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

Overwite Option :Update()

:Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

Overwite Option .Getter.<PropertyName>(self)

\uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

Overwite Option .Setter.<PropertyName>(self,newValue:any)

\uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

\ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

Overwite Option :Unload(object)

:Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

:GetPropertyChangedSignal(propertyName:string)->Bindable

\uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

\ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

Event .ChildAdded:Connect((child)->())->Connection

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \ub610\ub294 :AfterRender \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

:GetChildren()

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

"},{"location":"reference/lang/","title":"Lang","text":"

Lang.FailedMessage:string

\uc544\ubb34\ub7f0 \ubc88\uc5ed \uac12\ub3c4 \uc5bb\uc5b4\uc624\uc9c0 \ubabb\ud558\uc600\uc744\ub54c \ubcf4\uc5ec\uc904 \ubb38\uc790\uc5f4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

Lang.CurrentLocale:Locale<item of Lang.Locales>

\ud604\uc81c \uc0ac\uc6a9\uc911\uc778 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4. Lang.Locales \uc548\uc758 \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.

"},{"location":"reference/lang/#langlocales","title":"Lang.Locales","text":"

Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

"},{"location":"reference/mounts/","title":"Mounts","text":"

:Unmount()

\uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

:Add(item:any)

Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

\uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

\ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

"},{"location":"reference/quadProperty/","title":"QuadProperty","text":"

RoundSize:number?

ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

Corner:number?

\ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

PaddingAll:UDim?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

PaddingAllOffset:number?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Scale:number?

UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

"},{"location":"reference/signal/","title":"Signal","text":"

Signal.Bindable.New(id:string)->Bindable

\uc0c8\ub85c\uc6b4 Bindable \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Bindable \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

Signal.Disconnecter.New(id:string)->Disconnecter

\uc0c8\ub85c\uc6b4 Disconnecter \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Disconnecter \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

"},{"location":"reference/signal/bindable/","title":"Bindable","text":"

:Fire(...any)

\ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

:Wait()->(...any)

Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

:Connect((...any)->())->Connection

Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

:Once((...any)->())->Connection

Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

:CheckConnected(func)->boolean

\ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:DisconnectAll()

\ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

:Destroy()

:DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"reference/signal/disconnecter/","title":"Disconnecter","text":"

:Add(connection:Connection|RBXScriptConnection)

connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

:Disconnect()

\ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

:Destroy()

:Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"reference/store/","title":"Store","text":"

Store.GetStore(id:string?)->store

\uac12\ub4e4\uc744 \uc800\uc7a5\ud558\uace0 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub294 \uac12 \uc800\uc7a5\uc18c\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

Store.GetObject(id:string)->Object?

\ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

Store.GetObjects(id:string)->objectList?

\ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ubc18\ud658\uc740 objectList \ud0c0\uc785\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 ID \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \uc0ac\ud56d\uc740 \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \ud655\uc778\ud558\uc138\uc694.

"},{"location":"reference/store/objectList/","title":"ObjectList","text":"

:Each((item:any, index:number)->())

\uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

:EachAsync((item:any, index:number)->())

\ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

:IsEmpty()

\uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:Remove(indexOrItem:number|any)

objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

"},{"location":"reference/tween/","title":"Tween","text":"

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

\ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.StopTween(ItemOrHandler:TweenHandler|any)

\ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

Tween.StopPropertyTween(Item:any, PropertyName:string)

\uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

Tween.IsPropertyTweening(Item:any, PropertyName:string)

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"reference/tween/directions/","title":"Tween.Directions","text":"

Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

"},{"location":"reference/tween/easings/","title":"Tween.Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

\ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

Linear

\uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

Quint

5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

Quart

\ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

Cubic

\uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

Quad

\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

Expo

\uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

Sin

\uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

Circle

\uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

Back

\uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

Elastic

\ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

Bounce

\ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

"},{"location":"reference/tween/tweenOptions/","title":"TweenOptions","text":"

Option Time:number?

\ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

Option Easing:string|(index:number)->number?

\ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option Direction:string?

\ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Getter:(Item:any, Property:string)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

"},{"location":"tutorial/","title":"Getting Started","text":"

\uc2e4\ud5d8\uc801\uc778 \ubaa8\ub4c8

\uc774 \ubaa8\ub4c8\uc740 \uc5c5\ub370\uc774\ud2b8\uac00 \ube48\ubc88\ud569\ub2c8\ub2e4! \ud56d\uc0c1 Github \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694!

"},{"location":"tutorial/#_1","title":"\uba38\ub9ac\ub9d0","text":"

\uc774 \ud398\uc774\uc9c0\ub294 Quad \ubaa8\ub4c8\uc744 \uc27d\uac8c \uc2dc\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud398\uc774\uc9c0\ub97c \uc815\ub3c5\ud574 Quad \ubaa8\ub4c8\uc758 \uc804\ubc18\uc801\uc778 \uc0ac\uc6a9\ubc95\uc744 \ud30c\uc545\ud574\ubcf4\uc138\uc694!

\ubcc0\uacbd \uc0ac\ud56d\uc740 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

"},{"location":"tutorial/#_2","title":"\uc124\uce58","text":"

3\uac00\uc9c0 \ubc29\ubc95\uc911 \uac00\uc7a5 \ud3b8\ud55c \ubc29\ubc95\uc744 \uc120\ud0dd\ud574 \ubaa8\ub4c8\uc744 \uc124\uce58\ud574\uc8fc\uc138\uc694.

"},{"location":"tutorial/#rbxmx","title":"\ub4dc\ub808\uadf8 \uc5d4 \ub4dc\ub86d / rbxmx \ud30c\uc77c","text":"

\ub4dc\ub808\uadf8\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \ub123\uc744 \uc218 \uc788\ub294 \ubaa8\ub4c8 \ud30c\uc77c\uc785\ub2c8\ub2e4.

RBXMX \ub2e4\uc6b4\ub85c\ub4dc

\ub2e4\uc6b4\ub85c\ub4dc\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \uc62e\uaca8\uc8fc\uc138\uc694.

"},{"location":"tutorial/#git-clone","title":"git clone","text":"

rojo \ub97c \uc0ac\uc6a9\ud574 \ube4c\ub4dc\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4\uba74 Quad \ub97c \uc9c1\uc811 \ube4c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

git clone https://github.com/qwreey75/Quad Quad\ncd Quad\nmake build\n

\uc708\ub3c4\uc6b0\uc758 \uacbd\uc6b0 make build \ub300\uc2e0 rojo build default.project.json -o output.rbxmx \ub97c \uc785\ub825\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4.

"},{"location":"tutorial/#git-submodule","title":"git submodule","text":"

\ud504\ub85c\uc81d\ud2b8\uac00 rojo \ub97c \uc0ac\uc6a9\ud558\uace0 git \uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 submodule \ub85c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

# \uc774\ubbf8 submodule \uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \uacbd\uc6b0 \uc785\ub825\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4\ngit submodule init\n# \uc11c\ube0c\ubaa8\ub4c8\uc758 \ub8e8\ud2b8\ub294 \uc9c1\uc811 \uc815\ud574\uc8fc\uc138\uc694\ngit submodule add https://github.com/qwreey75/Quad Quad\n
"},{"location":"tutorial/#_3","title":"\ubaa8\ub4c8 \ubd88\ub7ec\uc624\uae30/\ucd08\uae30\ud654","text":"
local Quad = require(path.to.module).Init()\n

\ubaa8\ub4c8\uc744 \uc14b\uc5c5\ud558\uae30 \uc704\ud574\uc11c\ub294 .Init(QuadId:string?) \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c QuadId \uac12\uc740 \ud544\uc694\ud558\uc9c0 \uc54a\uc9c0\ub9cc, \ub098\uc911\uc5d0 \uc18c\uac1c\ud560 Store \uc640 \uac19\uc740 \uc77c\ubd80 \uae30\ub2a5\ub4e4\uc774 QuadId:string \uc5d0 \uc601\ud5a5\ubc1b\uae30\ub3c4 \ud569\ub2c8\ub2e4.

.Init(QuadId:string) \ud568\uc218\ub294 QuadId \uac00 \uac19\uc740 \ubd88\ub7ec\uc624\uae30\uac00 \uc774\ubbf8 \uc788\uc5c8\ub358 \uacbd\uc6b0, \ucd08\uae30\ud654 \ud558\uc9c0 \uc54a\uace0 \ubd88\ub7ec\uc654\ub358\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \ubaa8\ub4c8\ub4e4 \ub07c\ub9ac QuadId \uac00 \uac19\uc740 \uacbd\uc6b0 Store \uac19\uc740\uac83\ub4e4\uc774 \uacf5\uc720\ub429\ub2c8\ub2e4.

QuadId \uac00 \ube44\uc6cc\uc9c4 \uacbd\uc6b0 \ud55c\ubc88\ub3c4 \uc0dd\uc131\ub41c \uc801 \uc5c6\ub294 \uc0c8\ub85c\uc6b4 Quad \uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n

\ubd88\ub7ec\uc624\uae30\uac00 \ub05d\ub0ac\ub2e4\uba74 \uc774\uc81c Quad \uc758 \uc790\uc6d0\ub4e4\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! \ub2e4\uc74c \ud398\uc774\uc9c0\ub85c \ub118\uc5b4\uac00 \uc5b4\uc11c \ud65c\uc6a9\ud574 \ubd05\uc2dc\ub2e4

"},{"location":"tutorial/#_4","title":"\ucd94\uac00\uc801 \ud658\uacbd \uc124\uc815","text":""},{"location":"tutorial/#_5","title":"\ud0c0\uc785 \ubd88\ub7ec\uc624\uae30","text":"

\uae30\ubcf8\uc801\uc73c\ub85c Quad \ub294 \ub85c\ub4dc\uc2dc \ud0c0\uc785 \uac19\uc774 \ubc18\ud658\ud558\uc9c0\ub9cc. \uc9c1\uc811\uc801\uc73c\ub85c \ud0c0\uc785\uc744 \uc9c0\uc815\ud558\uace0 \uc2f6\uc740 \uacbd\uc6b0 types.lua \ub97c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

local types = require(path.to.module.types)\nlocal Quad = (require(path.to.module)::types.module).Init()\n
"},{"location":"tutorial/#_6","title":"\ud14c\uc2a4\ud2b8 \ud658\uacbd \uc900\ube44","text":"

\ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 rojo \uc640\uc758 \uac1c\ubc1c\ud1b5\ud569\uc744 \uc704\ud574 Play \ubc84\ud2bc\uc744 \ub204\ub974\uc9c0 \uc54a\uace0 \ubbf8\ub9ac\ubcf4\uae30\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4 \uc774\ub97c \ud1b5\ud574 \ub2e4\ub978 \ucf54\ub4dc \ubc29\uc2dd\uc758 UI \ud504\ub808\uc784 \uc6cc\ud06c\ubcf4\ub2e4 \ube60\ub978 \uac1c\ubc1c\uc18d\ub3c4\ub97c \ub2ec\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

\ud3b8\uc758\uc0c1\uc744 \uc704\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \uc124\uc815\ud574 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uc8fc\uc758

rojo \ud658\uacbd\uc774 \uc544\ub2c8\ub77c\uba74 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub294 \ub799\uc744 \ub3d9\ubc18\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

\uc77c\ubc18\uc801\uc73c\ub85c, \ub85c\uceec \ud3b8\uc9d1 \ud658\uacbd\uc5d0\uc11c \ub85c\ube14\ub85d\uc2a4\uc758 script editor \ub294 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ubcc0\uacbd\uc2dc \ub9c8\ub2e4 .Source \ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. \uc774\ub294 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ud0c0\uc774\ud551 \uc2dc \ub9c8\ub2e4 UI \uac00 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. Quad \uc758 tracker \ubaa8\ub4c8\uc740 \uc21c\uac04\uc801\uc73c\ub85c \ub9ce\uc740\uc591\uc758 \ub9ac\ub85c\ub4dc\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc801\uc808\ud55c \ucfe8\ud0c0\uc784\uacfc \uc2dc\uac04\ubd84\ubc30\ub97c \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uc774 \uacbd\uc6b0\uc5d0\ub3c4 Ctrl+S \ub97c \ub20c\ub7ec \uc800\uc7a5\ud574\uc57c \uc801\uc6a9\ub418\ub294 vscode \uc640 \uac19\uc740 \ud0c0 \ud3b8\uc9d1\uae30\uc640\ub294 \ucc28\uc774\uac00 \ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucf54\ub4dc\uac00 \ucee4\uc9d0\uc73c\ub85c \uc778\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\uc5d0\uc11c \ud37c\ud3ec\uba3c\uc2a4\uc801 \uc774\uc288\ub97c \uacaa\ub294\ub2e4\uba74, rojo \ub97c \ud65c\uc6a9\ud574 \ucf54\ub4dc\ub97c \uc678\ubd80\ub85c \uc62e\uae34 \ud6c4, vscode \ub97c \uc2a4\ud29c\ub514\uc624 \uc704\uc5d0 \ub193\uace0 \ubbf8\ub9ac\ubcf4\uae30\uc640 \ucf54\ub4dc\ub97c \ub3d9\uc2dc\uc5d0 \ubcf4\uba74\uc11c \ud3b8\uc9d1\ud558\uc138\uc694. \ud504\ub85c\uc81d\ud2b8\uac00 \ub9e4\uc6b0 \uac70\ub300\ud558\uc9c0 \uc54a\ub2e4\uba74 \ud06c\uac8c \uac71\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.

\ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc\ud2b8\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uc138\uc694.

 | Main (ModuleScript)\n |-- Loader (LocalScript)\n |-- Test (ModuleScript)\n
MainLoaderTest \uc2e4\uc81c\ub85c UI \ub4e4\uc744 \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
local Quad = require(path.to.module).Init()\nlocal IsTestMode = script.Name:match(\"_TESTING\") -- \ud14c\uc2a4\ud2b8\ubaa8\ub4dc \uc5ec\ubd80\nlocal LocalPlayer = game.Players.LocalPlayer\nlocal ScreenGUI = Instance.new(\"ScreenGui\",\n    LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui)\nScreenGUI.Name = \"MyGUI\"\nScreenGUI.ResetOnSpawn = false\n\n-- \uc2e4\uc81c \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.\n\nreturn function()\n    -- \ud14c\uc2a4\ud2b8\uac00 \ub05d\ub098 \ub9cc\ub4e0\uac78 \uc9c0\uc6cc\uc57c \ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    -- \ucd94\ud6c4 \uc124\uba85\ub420 Unmount() \ub97c \uc774\uc6a9\ud558\uc138\uc694.\n    ScreenGUI:Destroy()\nend\n
\uac8c\uc784\uc744 \ud50c\ub808\uc774 \ud560 \ub54c \ucf54\ub4dc\uac00 \ub85c\ub4dc\ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ub85c\ub354\uc785\ub2c8\ub2e4.
require(script.Parent)\n
\uba85\ub839\ucc3d\uc5d0\uc11c \uba85\ub839\uc5b4 \uc785\ub825\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589 \ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
-- \ubaa8\ub4c8 \uc704\uce58\ub85c \uc54c\ub9de\uac8c \ubcc0\uacbd\ud574\uc8fc\uc138\uc694\nlocal Quad = path.to.module\nlocal tracker = require(Quad.tracker)\n\nlocal module = {}\nlocal function reload()\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.testingModule = script.Parent:Clone()\n    module.testingModule.Parent = script.Parent.Parent\n    module.testingModule.Archivable = false\n    module.testingModule.Name = module.testingModule.Name .. \"_TESTING\"\n    module.unload = require(module.testingModule)\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf2d\ub2c8\ub2e4. \uc774\ubbf8 \ucf1c\uc838\uc788\uc73c\uba74 \ub2e4\uc2dc \ub85c\ub4dc\ud569\ub2c8\ub2e4\nfunction module.load()\n    reload()\n    if not module.autoreload then\n        module.autoreload = tracker.new(script.Parent)\n        module.autoreload:init(); wait()\n        module.autoreload:connect(\"updated\",reload)\n    end\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ub044\uace0 \ud14c\uc2a4\ud2b8\ub85c \uc0dd\uae34\uac83\uc744 \uc9c0\uc6c1\ub2c8\ub2e4\nfunction module.unload()\n    if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.autoreload = nil\n    module.unload = nil\n    module.testingModule = nil\nend\n\nreturn module\n

\uc774\uc81c \uba85\ub839\uc5b4 \ucc3d\uc5d0\uc11c \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf1c\uac70\ub098 \ub04c \uc218 \uc788\uc2b5\ub2c8\ub2e4. rojo \ub098 \ud3b8\uc9d1\uae30\ub85c \uc778\ud574 \ucf54\ub4dc\uac00 \ubcc0\uacbd\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4!

require(path.to.your.module).load()\n
"},{"location":"tutorial/10_signal/","title":"Signal - \uc774\ubca4\ud2b8 \uc0dd\uc131\uacfc \uc5f0\uacb0","text":"\uc77d\uae30 \uc804...

\ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Bindable, Disconnecter \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Bindable, Disconnecter \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

Quad \uc5d0\ub294 \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 RBXScriptSignal \uc758 \uc720\uc0ac\ud488\uacfc, \ud55c\ubc88\uc5d0 \uc2dc\uadf8\ub110\uc744 \ub04a\uc5b4\uc8fc\ub294 Disconnecter \ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c Extend \uc758 GetPropertyChangedSignal \uac19\uc740 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ub418\uae30\ub3c4 \ud569\ub2c8\ub2e4.

"},{"location":"tutorial/10_signal/#bindable","title":"Bindable","text":"

Bindable \uc740 RBXScriptSignal \uacfc \uc720\uc0ac\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. Signal.Bindable.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 BindableEvent \uc640\ub294 \ub2e4\ub974\uac8c :Fire \uac00 \ud55c\uacf3\uc5d0 \ud569\uccd0\uc838 \uc788\uc2b5\ub2c8\ub2e4.

Note

\ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Signal = Quad.Signal\n\nlocal mySignal = Signal.Bindable.New()\n\nlocal connection = mySignal:Connect(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nconnection:Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\ntask.spawn(function()\n    task.wait(5)\n    mySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \uc9c0\uc5f0\ub41c \ud6c4 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nend)\nprint(mySignal:Wait())\n\nmySignal:Once(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\nmySignal:Once(function(v)\n    print(v)\nend):Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n
"},{"location":"tutorial/10_signal/#bindable_1","title":"Bindable \uba54\uc18c\ub4dc","text":"

Bindable \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

:Fire(...any)

\ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

:Wait()->(...any)

Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

:Connect((...any)->())->Connection

Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

:Once((...any)->())->Connection

Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

:CheckConnected(func)->boolean

\ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:DisconnectAll()

\ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

:Destroy()

:DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"tutorial/10_signal/#connection","title":"Connection \uba54\uc18c\ub4dc","text":"

Bindable:Connect \uc640 Bindable:Once \ub294 Connection \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. Connection \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

:Disconnect()

\uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

:Destroy()

:Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

"},{"location":"tutorial/10_signal/#disconnecter","title":"Disconnecter","text":"

Disconnecter \ub294 \uc77c\uc885\uc758 Maid \ubaa8\ub4c8\uacfc \ube44\uc2b7\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. \uc774 \uac1d\uccb4\uc5d0\ub294 Connection (\ub85c\ube14\ub85d\uc2a4, Quad \ubaa8\ub450 \ud638\ud658) \uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc73c\uba70, \ub098\uc911\uc5d0 \ucd94\uac00\ub41c Connection \uc744 \ud55c\uaebc\ubc88\uc5d0 Disconnect \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Signal.Disconnecter.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

Note

\ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

:Add(connection:Connection|RBXScriptConnection)

connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

:Disconnect()

\ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

:Destroy()

:Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

"},{"location":"tutorial/11_extend/","title":"Extend - \ud655\uc7a5\uacfc \uc7ac\uc0ac\uc6a9","text":""},{"location":"tutorial/11_extend/#extend","title":"Extend \ub780?","text":"

Quad \uc5d0\uc11c\ub294 \ub85c\ube14\ub85d\uc2a4\uc758 Frame \uc774\ub098 TextButton \uac19\uc740 \uae30\ubcf8 \uc624\ube0c\uc81d\ud2b8\ub9cc \ub9cc\ub4e4 \uc218 \uc788\ub294\uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. Quad \ub294 \uc790\uc2e0\ub9cc\uc758 \ubc84\ud2bc, \ud639\uc740 \uc5ec\ub7ec \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc744 \ucd94\uc0c1\uc801\uc73c\ub85c \ub9cc\ub4e4\uace0. \ub2e4\uc2dc \ud65c\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Extend \ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.

Extend \ub294 Register \uc640 \ub354\ubd88\uc5b4 Quad \uc758 \uac00\uc7a5 \uc911\uc694\ud55c \uae30\ub2a5\uc73c\ub85c\uc368, \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc9c0\ub2d9\ub2c8\ub2e4.

  1. \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud569\ub2c8\ub2e4. \ub098\ub9cc\uc758 \ubc84\ud2bc\uc744 \ub9cc\ub4e4\uace0, \uace0\uce58\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc0dd\uaca8 \uace0\uce58\uba74 \uc790\ub3d9\uc73c\ub85c \uc0ac\uc6a9\ub41c \uacf3\ub4e4\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.
  2. \uae34 \ucf54\ub4dc\ub97c \ub098\ub204\uc5b4 \ucf54\ub4dc\ub9c8\ub2e4 \ud655\uc2e4\ud55c \ubaa9\uc801\uc744 \ubd80\uc5ec\ud574 \ub354 \uba85\ud655\ud55c \ucf54\ub4dc \uc791\uc131\uc774 \uac00\ub2a5\ud574\uc9d1\ub2c8\ub2e4.
  3. \uc790\uc2e0\ub9cc\uc758 \ud504\ub85c\ud37c\ud2f0\ub97c \ub9cc\ub4e4\uac70\ub098 \uc644\uc804\ud788 \uc6d0\ud558\ub294\ub300\ub85c \uc624\ube0c\uc81d\ud2b8\ub97c \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
  4. \ud568\uc218\ub098 \uc0dd\uc131\uae30\ub97c \uc9c1\uc811 \ub9cc\ub4dc\ub294 \uac83 \ubcf4\ub2e4 \uc77c\uad00\ub41c \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.
  5. \ub9e4\uc6b0 \uc720\uc5f0\ud569\ub2c8\ub2e4. \ub2e4\uc591\ud55c \ubc29\ubc95\uc758 \uad6c\ud604\ubc95\uc744 \uc6d0\ud558\ub294\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
"},{"location":"tutorial/11_extend/#_1","title":"\ub098\ub9cc\uc758 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uae30","text":"

Extend \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uc131\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\n-- extend \uac1d\uccb4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myClass = Class.Extend()\n
\uc77c\ubc18\uc801\uc73c\ub85c Extend \ub294 \ud55c \ubaa8\ub4c8\uc5d0 \ud558\ub098\uc529 \ub123\uc2b5\ub2c8\ub2e4.

\ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc \uad6c\uc870\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc138\uc694. \uc544\ub798\uc758 \ucf54\ub4dc\ub294 \ubaa8\ub4e0 Extend \ubb38\ubc95\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.

 - ScreenGUI\n |-- localscript\n    |-- myClass (ModuleScript)\n

localscriptlocalscript.myClass Extend \ud074\ub798\uc2a4\ub97c \ubd88\ub7ec\uc624\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Mount = Quad.Mount\nlocal Class = Quad.Class\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.bgColor = Color3.fromRGB(0,0,0)\n\n-- Class(require(script.myClass)) \uc640 \uac19\uc2b5\ub2c8\ub2e4.\n-- \uc904\uc5ec\uc11c Class(script.myClass) \ub85c \uc4f8 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nlocal myClass = Class(script.myClass)\n\n-- \ud504\ub808\uc784\uc5d0 \ub123\uac70\ub098 \ud558\uc5ec\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4\n-- \uc77c\ubc18 \uc624\ube0c\uc81d\ud2b8\uc640 \ub611\uac19\uc774 id \ub97c \ub123\uace0 GetObject \ub85c\n-- \uac00\uc838\uc62c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\nlocal main = myClass \"main\" {\n    -- \uc774 \ud14c\uc774\ube14\uc740 \ubaa8\ub4c8\uc758 :Init(props) \uc5d0 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n    -- :Render(props) \uc5d0\ub3c4 \uc774 \ud14c\uc774\ube14\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n    Testing = 1;\n    Text = \"Test\";\n    -- \ub808\uc9c0\uc2a4\ud130 \uac12\uc744 \ub118\uaca8\uc904 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \ubc1b\ub294\ucabd\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc778 \uacbd\uc6b0 \uac12\uc774 \uc5f0\ub3d9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"bgColor\";\n}\n\nMount(ScreenGUI, main)\nprint(Store.GetObject(\"main\") == main) -- true\n\n-- \uc774 \uac12\uc744 \ubc14\uafb8\uba74 \uc5f0\ub3d9\ub41c BackgroundColor3 \ub3c4 \ubc14\ub014\uac83\uc785\ub2c8\ub2e4\nmyStore.bgColor = Color3.fromRGB(255,255,255)\n\n-- \uac12 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud558\uae30\nmain\n    :GetPropertyChangedSignal(\"AbsolutePosition\")\n    :Connect(function()\n        print(\"AbsolutePosition\",main.AbsolutePosition)\n    end)\n\n-- main:Update()\n-- \uac15\uc81c\ub85c \ub2e4\uc2dc Render \ub97c \uc2e4\ud589\ud558\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.\n\n-- main.Testing = 2\n-- \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\uc774\ubbc0\ub85c \uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74.\n-- main:Update() \uc640 \uac19\uc740 \ud6a8\uacfc\uac00 \ub0a9\ub2c8\ub2e4.\n
Extend \ud074\ub798\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \ub2e4\ub978\uacf3\uc5d0\uc11c \ubd88\ub7ec\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\n\nlocal TextLabel = Class \"TextLabel\"\n\nlocal myClass = Class.Extend()\n\n-- Init \ub294 Render \uc804 props \ub97c \ucd08\uae30\ud654 \ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4\n-- Init \uc5d0\ub294 \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. Init \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:Init(props)\n    -- \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud504\ub77c\uc774\ube57 \uac12\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc774\ub984 \uc55e\uc5d0 _ \uac00 \ubd87\uc73c\uba74 \uc678\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc774 \uc544\ub2cc\n    -- \ub0b4\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774 \uacbd\uc6b0 \uc548\uc804\uc131\uc744 \uc704\ud574 register \ub97c \uc0ac\uc6a9\ud560 \uc218\n    -- \uc5c6\uc2b5\ub2c8\ub2e4.\n    self._testValue = 2\n\n    -- \ud504\ub85c\ud37c\ud2f0\uc758 \uae30\ubcf8\uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \uc0dd\uc131 \uc2dc \uac12\uc774 \ub204\ub77d\ub41c \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ud0a4, \uac12 \uc73c\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4\n    props:Default(\"Text\",   \"Testing Label\")\n    props:Default(\"ZIndex\", 1)\nend\n\n-- myClass \uac00 \uc9c4\uc9dc \uadf8\ub824\uc9c0\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4.\n-- Render \ub3c4 Init \ucc98\ub7fc \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4.\nfunction myClass:Render(props)\n    return TextLabel {\n        Size = UDim2.fromOffset(200,200);\n        -- self \uc5d0 _label \ub85c \uc774 TextLabel \uc744 \ub123\uc2b5\ub2c8\ub2e4.\n        -- \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        self \"_label\";\n\n        -- _holder \ub294 \uc608\uc57d\ub41c \uac12\uc785\ub2c8\ub2e4. \uc790\uc2dd\ub4e4\uc774 \uc5ec\uae30\uc5d0 \ub4e4\uc5b4\uc640\uc57c\n        -- \ud568\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ub9ac\uc2a4\ud2b8\ub098 \uadf8\ub9ac\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 \uc720\uc6a9\ud569\ub2c8\ub2e4.\n        -- \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 Render \uac00 \ub9ac\ud134\ud55c \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\n        self \"_holder\";\n\n        -- GetPropertyChangedSignal \uac00 \uc791\ub3d9\ud560 \uc218 \uc788\ub3c4\ub85d\n        -- \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud574\uc90d\ub2c8\ub2e4\n        -- \uc774 \ub610\ud55c \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        [Event.Prop \"AbsolutePosition\"] = self \"AbsolutePosition\";\n        -- \ub9c8\uc6b0\uc2a4 \ud074\ub9ad\uac19\uc740 \ub2e4\ub978 \uc774\ubca4\ud2b8\ub97c GetPropertyChangedSignal \uc5d0\n        -- \uc5f0\uacb0\ud558\ub824\uba74 :EmitPropertyChangedSignal() \ub97c \ud638\ucd9c\ud574\uc8fc\uba74 \ub429\ub2c8\ub2e4.\n        [Event \"MouseEnter\"] = function (this,x,y)\n            -- \ud0a4, \uac12\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4. \uac12\uc774 \uc5c6\uc73c\uba74 self[key] \ub85c \ub300\uc2e0\ud569\ub2c8\ub2e4.\n            self:EmitPropertyChangedSignal(\"Testing2\",1)\n        end;\n\n        -- \ubc1b\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5f0\ub3d9\ud569\ub2c8\ub2e4.\n        -- \ub9cc\uc57d props.BackgroundColor3 \ub9cc \uc0ac\uc6a9\ud558\uba74\n        -- \ucc98\uc74c\uc5d0\ub9cc \ub808\uc9c0\uc2a4\ud130\uc5d0\uc11c \uac12\uc744 \uc77d\uc5b4\uc635\ub2c8\ub2e4.\n        -- \ub530\ub77c\uc11c \uac12\uc744 \ubcc0\uacbd\ud574\ub3c4 \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = props \"BackgroundColor3\":Tween();\n\n        -- \uc785\ub825 \uac12\uacfc \uc0c1\uad00\uc5c6\uc774 \ub808\uc9c0\uc2a4\ud130\ub97c \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        -- \uc774 \uacbd\uc6b0 main.Text = \"New\" \ucc98\ub7fc \uc9c1\uc811 \ubcc0\uacbd\ud558\uba74\n        -- \uadf8 \ubcc0\uacbd\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.\n        Text = props \"Text\";\n        ZIndex = props \"ZIndex\";\n        -- ... \uc790\uc2dd\uc744 \ub123\uc5b4\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\n        -- Frame {\n        --    [Event.Created] = function(self)\n        --        print(self.Parent) -- nil \uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\n        --        \ub530\ub77c\uc11c \ubd80\ubaa8\ub97c \uac74\ub4e4\uc5ec\uc57c \ud558\ub294 \uacbd\uc6b0, self \"\" \ub97c \ud1b5\ud574\n        --        self \uac12\uc5d0 \ub123\uc5b4\ub193\uace0 \ub098\uc911\uc5d0 AfterRender \ub85c \ud574\uacb0\ud574\uc57c\ud569\ub2c8\ub2e4.\n        --    end;\n        -- }\n    }\nend\n\n\n-- AfterRender \ub294 Render \uc9c1\ud6c4 \uc2e4\ud589\ub429\ub2c8\ub2e4.\n-- \ub80c\ub354\ub9c1 \ud6c4 \uc2e4\ud589\ud574\uc57c \ud560 \uac83\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4.\n-- AfterRender \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:AfterRender(object)\n    print(self._label,\"\uc774 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    -- \uc774\ub807\uac8c \ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c \ubd80\ubd84\ub3c4 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\n    self.ZIndex = 2\nend\n\n-- function myClass:Unload(object)\n-- :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4\n-- \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4\n\n-- AbsolutePosition \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Getter.AbsolutePosition(self)\n    return self._label.AbsolutePosition\nend\n\n-- AbsolutePosition \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Setter.AbsolutePosition(self,newValue)\n    -- \ud544\uc694\ud55c \uacbd\uc6b0 \uac12\uc744 \uc124\uc815\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    error(\"AbsolutePosition \uac12\uc740 \uc124\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4\")\nend\n\n-- main.Testing = 2 \ub2e4\uc74c\uacfc \uac19\uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 \uc624\ube0c\uc81d\ud2b8\uac00\n-- \uc644\uc804\ud788 \ub2e4\uc2dc \uadf8\ub824\uc9d1\ub2c8\ub2e4. \uc989 \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\nmyClass.UpdateTriggers.Testing = true\n\n-- \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub97c \ubc18\ud658\ud574\uc90d\uc2dc\ub2e4.\nreturn myClass\n
"},{"location":"tutorial/11_extend/#extend_1","title":"Extend","text":"

Extend \uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uac12\ub4e4\uacfc \uba54\uc18c\ub4dc\uc785\ub2c8\ub2e4.

self(name:string)->linker

Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

Overwite REQUIRED :Render(props:valueStore)

\ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

Overwite Option :Init(props:valueStore)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

Overwite Option :AfterRender(object:any)

\uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

Overwite Option :Update()

:Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

Overwite Option .Getter.<PropertyName>(self)

\uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

Overwite Option .Setter.<PropertyName>(self,newValue:any)

\uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

\ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

Overwite Option :Unload(object)

:Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

:GetPropertyChangedSignal(propertyName:string)->Bindable

\uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

\ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

Event .ChildAdded:Connect((child)->())->Connection

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \ub610\ub294 :AfterRender \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

:GetChildren()

\uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

"},{"location":"tutorial/1_import/","title":"Import - \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131","text":""},{"location":"tutorial/1_import/#_1","title":"\ub85c\ube14\ub85d\uc2a4 \uc624\ube0c\uc81d\ud2b8 \ubd88\ub7ec\uc624\uae30","text":"

Frame \uacfc \uac19\uc740 UI \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uba3c\uc800 import \ub97c \uc774\uc6a9\ud574\uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud574\ubcf4\uc138\uc694!

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\nprint(\n    Frame {\n        Name = \"Wow!\";\n        -- \ub2e4\uc74c\uacfc \uac19\uc774 \uc790\uc2dd\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n        Frame {\n            Name = \"Child\";\n        };\n    }\n)\n

\ub098\uc911\uc5d0 \uc790\uc2e0\ub9cc\uc758 UI \uc624\ube0c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc77c\ubc18\uc801\uc778 \ub85c\ube14\ub85d\uc2a4\uac00 \uc9c0\uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\uc758 \uacbd\uc6b0 Class(ClassName:string) \uc73c\ub85c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"tutorial/1_import/#class","title":"\ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12 \uc124\uc815","text":"

\ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12\uc744 \uc124\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 BorderSizePixel \uc640 \uac19\uc774 \uc790\uc8fc \uc0ac\uc6a9\ub420 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub97c \ubbf8\ub9ac \uc9c0\uc815\ud574 \ub458 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal FrameWithoutBorder = Class \"Frame\"\nFrameWithoutBorder.BorderSizePixel = 0\n\nlocal FrameWithBorder = Class \"Frame\"\nFrameWithBorder.BorderSizePixel = 1\n\nlocal frame1 = FrameWithoutBorder {}\nlocal frame2 = FrameWithBorder {}\nlocal frame3 = FrameWithBorder {\n    -- \uac12\uc744 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774\ub807\uac8c \ud558\uba74 \uae30\ubcf8\uac12\uc774 \ubb34\uc2dc\ub429\ub2c8\ub2e4.\n    BorderSizePixel = 0;\n}\n\nprint(frame1.FrameWithBorder.BorderSizePixel)\nprint(frame2.FrameWithBorder.BorderSizePixel)\nprint(frame3.FrameWithBorder.BorderSizePixel)\n

\uc774\uc81c \uadf8\ub824\ub0b8 \ud504\ub808\uc784\uc744 \ud654\uba74\uc5d0 \uadf8\ub824\ubcf4\uace0 \uc2f6\ub098\uc694? \ub2e4\uc74c \ud29c\ud1a0\ub9ac\uc5bc Mount \ub97c \ud655\uc778\ud574\ubcf4\uc138\uc694!

"},{"location":"tutorial/2_mount/","title":"Mount - \ud654\uba74\uc5d0 UI \ud45c\ud604","text":""},{"location":"tutorial/2_mount/#ui","title":"\ud654\uba74\uc5d0 UI \ub97c \ud45c\uc2dc\ud558\uae30","text":"

Quad \ubaa8\ub4c8\uc5d0\uc11c \ubaa8\ub4e0 Parent \ucc98\ub9ac\ub294 Mount \ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4. Mount(to:any,...item:any?)->mounts \ud568\uc218\ub97c \uc774\uc6a9\ud558\uba74 \ub2e4\ub8e8\ub294 \uc624\ube0c\uc81d\ud2b8\uac00 \ub85c\ube14\ub85d\uc2a4 Instance \uc778\uc9c0, \ud5a5\ud6c4 \uc18c\uac1c\ub420 Quad \ud655\uc7a5 \ud074\ub798\uc2a4\uc778\uc9c0 \uc0c1\uad00\uc5c6\uc774 \uc54c\uc544\uc11c Parent \uac00 \ucc98\ub9ac\ub429\ub2c8\ub2e4.

--- StarterGui \uc548\uc5d0 ScreenGui \ub97c \ub123\uace0 \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\ub85c \uc785\ub825\ud574\ubcf4\uc138\uc694\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nMount(ScreenGui,\n    Frame {\n        Name = \"Wow!\";\n    }\n    --[[\n    , Frame {} , Frame {}\n    \ub354\ub9ce\uc740 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\uac19\uc774 Mount \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    ]]\n)\n
"},{"location":"tutorial/2_mount/#_1","title":"\ub9c8\uc6b4\ud2b8 \uac1d\uccb4","text":"

\ud3b8\uc758\ub97c \uc704\ud574\uc11c Mount \ud568\uc218\ub294 mounts \ub77c\ub294 \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\uac83\uc744 \uc774\uc6a9\ud558\uba74 \ud544\uc694\uc5d0 \ub530\ub77c\uc11c Mount \uc0c1\ud0dc\ub97c \ud574\uc81c\ud558\uac70\ub098 \ucd94\uac00 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. mounts \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub97c \uac00\uc9d1\ub2c8\ub2e4.

:Unmount()

\uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

:Add(item:any)

Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

\uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

\ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

"},{"location":"tutorial/3_getObject/","title":"GetObject - \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec","text":"\uc77d\uae30 \uc804...

\ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetObject \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetObject \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

"},{"location":"tutorial/3_getObject/#_1","title":"\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec\ud558\uae30, \uc0ac\uc6a9\ud558\uae30","text":"

\ubcc0\uc218\uc5d0 \ub9cc\ub4e4\uc5b4\uc9c4 \uc624\ube0c\uc81d\ud2b8\ub97c \ud558\ub098\ud558\ub098 \uc800\uc7a5\ud574\uc57c\ud558\ub098\uc694? \uc544\ub2c8\uc694, Quad \uc5d0\ub294 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

\uc544\uc774\ub514\uc5d0 \ud5c8\uc6a9\ub418\ub294 \uae00\uc790\ub294 \ubcc0\uc218\uba85\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub300\uc18c\ubb38\uc790, \uc22b\uc790, \uc5b8\ub354\ubc14(_) \ub97c \ud5c8\uc6a9\ud569\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc Frame \"mainFrame\" {} \uc640 \uac19\uc774 id \uac12\uc744 \uc9c0\uc815\ud574 \uc900\ub2e4\uba74 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub294 \uadf8 \uc544\uc774\ub514\ub97c \uac00\uc9c0\uac8c \ub429\ub2c8\ub2e4. Store.GetObject(id:string)->Object? \ub294 \uc0dd\uc131\ub41c \uac1d\uccb4\uc911 \uac00\uc7a5 \uccab\ubc88\uc9f8\uc758 id \uac00 \uc77c\uce58\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud574 \uc90d\ub2c8\ub2e4.

local index = 1\nFrame (\"mainFrame\" .. index) {}\nprint(Store.GetObject(\"mainFrame\" .. index))\n

\uc704\ucc98\ub7fc \uc0dd\uc131\uc774\ub098 \uac00\uc838\uc624\uae30\uc5d0\uc11c \uc2dd\uc744 \ub9cc\ub4e4\uc5b4 \ub123\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

"},{"location":"tutorial/3_getObject/#_2","title":"\ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30","text":"\uc8fc\uc758

Store.GetObjects\uc758 \ubc18\ud658\uac12\uc778 objectList\ub294 \uce90\uc2dc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. objectList\ub97c local \uc5d0 \ub123\uace0 \uacc4\uc18d\ud574\uc11c \uc720\uc9c0\uc2dc\ud0a4\uc9c0 \ub9c8\uc2ed\uc2dc\uc624, \ubc18\ud658\uac12\uc740 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

Quad \ub294 \ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30 \ud3b8\ud558\ub3c4\ub85d Store.GetObjects(id:string)->objectList \ub77c\ub294 \ud568\uc218\ub97c \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4.

\uc2e4\ud5d8\uc73c\ub85c, \uc0c9\uae54\uc774 \ub79c\ub364\ud558\uac8c \ubc14\ub00c\ub294 \ud504\ub808\uc784\ub4e4\uc744 \ub9cc\ub4e4\uc5b4 \ubd05\uc2dc\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(30,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(60,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(90,0);\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uac12\uc744 \uc77d\uac70\ub098 :Connect \ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"Child\").Size = UDim2.fromOffset(30,30)\n\n-- \ud544\uc694\uc5d0 \ub530\ub77c Store.GetObjects(\"Child\") \ub97c pairs \uc5d0 \ub123\uc5b4 for \ubb38\uc744 \uc0ac\uc6a9\ud558\uac70\ub098\n-- :Each , :EachAsync , :IsEmpty \ud568\uc218\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\ntask.spawn(function()\n    while true do\n        Store.GetObjects(\"Child\"):Each(function (item, index)\n            item.BackgroundColor3 = Color3.fromRGB(\n                math.random(0,255),\n                math.random(0,255),\n                math.random(0,255)\n            )\n        end)\n        task.wait(1)\n    end)\nend\n\n-- for \ubb38\uc744 \uc774\uc6a9\ud574\uc11c \ucd9c\ub825\ud569\ub2c8\ub2e4\nfor _,child in ipairs(Store.GetObjects(\"Child\")) do\n    print(child)\nend\n
"},{"location":"tutorial/3_getObject/#objectlist","title":"objectList","text":"

Store.GetObjects() \uc758 \ubc18\ud658 objectList \uc758 \uba54\uc18c\ub4dc\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

:Each((item:any, index:number)->())

\uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

:EachAsync((item:any, index:number)->())

\ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

:IsEmpty()

\uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

:Remove(indexOrItem:number|any)

objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

"},{"location":"tutorial/3_getObject/#id","title":"\uace0\uae09 ID \uc0ac\uc6a9\ud558\uae30","text":"

id \uae30\ub2a5\uc744 \uc870\uae08\ub354 \uace0\uae09\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

\uc6a9\ubc95\uc608\uc81c
-- \ub450 \uc544\uc774\ub514\ub97c \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4\nFrame \"a,b\" {}\n-- a \ub97c \uac00\uc9c4\uac83\uacfc, a \uc640 b \ub97c \uac00\uc9c4\uac83\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\nStore.GetObjects(\"a,a&b\"):Each(function(item)\n    print(item)\nend)\n
\uc880\ub354 \uc9c1\uad00\uc801\uc778 \ud655\uc778\uc744 \uc704\ud574\uc11c \uc791\ub3d9\uc2dc\ucf1c\ubcf4\uc138\uc694.
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Mount\nlocal Mount = Quad.Store\nlocal Store = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\n--\ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ubaa8\ub450 \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nFrame \"a,b\" {\n    Name = \"main\";\n    Frame \"a\" {\n        Name = \"Child1\";\n    };\n    Frame \"b\" {\n        Name = \"Child2\";\n    };\n}\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub458\ub2e4 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a,b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4 \uac83\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a\uc640b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4\uac83\uacfc, b \ub97c \uac00\uc9c4\uac83\uc744 \uc120\ud0dd\n-- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b,b\"):Each(function(item, index)\n    print(item.Name)\nend)\n
  • \ub610\ub294(or) \uc5f0\uc0b0 ,
  • \uadf8\ub9ac\uace0(and) \uc5f0\uc0b0 &

GetObjects \uc5d0\ub294 \uc774 \ub450 \uc5f0\uc0b0\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0, \uc0dd\uc131\uc2dc\uc5d0\ub294 , \uc73c\ub85c \uc5ec\ub7ec \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub744\uc5b4\uc4f0\uae30\ub294 \ubb34\uc2dc\ub429\ub2c8\ub2e4

\uc8fc\uc758
  • GetObject \uc5d0\ub294 \uc774 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
  • \uace0\uae09 ID \uc0ac\uc6a9\uc2dc objectList:Remove \uba54\uc18c\ub4dc\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
"},{"location":"tutorial/3_getObject/#id_1","title":"id \ucd94\uac00\uc640 \uc81c\uac70","text":"

\uacbd\uc6b0\uc5d0 \ub530\ub77c \uc774\ubbf8 \uc0dd\uc131\ud55c \uc624\ube0c\uc81d\ud2b8\uc5d0 id \ub97c \ucd94\uac00 \ud639\uc740 \uc81c\uac70\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Store = Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"testing\" {}\n\n-- \uc544\uc774\ub514\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4\nStore.AddObject(\n    \"a,b\", Store.GetObject(\"testing\")\n)\n\n-- \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4\nStore.GetObjects(\"a\"):Remove(Store.GetObject(\"testing\"))\n

Store.AddObject(ids:string, item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \ucd94\uac00\ud558\uace0 :Remove(item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4

"},{"location":"tutorial/4_style/","title":"Style - \uc18d\uc131 \uac12 \ubc88\ub4e4\ub9c1","text":"\uc77d\uae30 \uc804...

\ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Style \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Style \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

"},{"location":"tutorial/4_style/#_1","title":"\ubc18\ubcf5\ub418\ub294 \uc18d\uc131\uac12\uc744 \uc904\uc774\uae30","text":"

Quad \uc5d0\uc11c\ub294 \ubc18\ubcf5\uc801\uc778 \uc18d\uc131\ub4e4\uc744 \uc904\uc5ec \uc4f8 \uc218 \uc788\ub3c4\ub85d Style \uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc0c8\ub85c\uc6b4 \uc2a4\ud0c0\uc77c\uc744 \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myStyle = Style {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        myStyle; -- \uc2a4\ud0c0\uc77c\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4!\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(30,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(60,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(90,0);\n        -- \uc2a4\ud0c0\uc77c\uc740 \ub36e\uc5b4\uc368 \uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        myStyle;\n    };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

Style\uc744 \uc0ac\uc6a9\ud558\uba74 \ub9ce\uc740 \uc591\uc758 \uc18d\uc131\uc744 \ud558\ub098\uc5d0 \ubcc0\uc218\ub85c \uc9d1\uc5b4\ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Style\uc744 \uc0ac\uc6a9\ud574\uc11c \ub9ce\uc740 \uc591\uc758 \ucf54\ub4dc\ub97c \uc904\uc5ec\ubcf4\uc138\uc694

"},{"location":"tutorial/4_style/#id","title":"ID \ub85c \ud0c0\uac9f\uc744 \uc9c0\uc815\ud558\uae30","text":"

Style\uc5d0\ub294 \ud0c0\uac9f id\ub97c \uc9c0\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc5ec\uae30\uc5d0\ub294 & \ub098 , \uac00 \uc801\uc6a9\ub418\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4!\nStyle \"Child\" {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\n-- \ub2e8, Style\uc740 \uba3c\uc800 \uc120\uc5b8\ud574\uc57c\ud569\ub2c8\ub2e4, Frame\uc744 \uba3c\uc800 \ub9cc\ub4e4\uace0\n-- Style\uc744 \uc120\uc5b8\ud558\uba74 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {};\n    Frame \"Child\" { Position = UDim2.fromOffset(30,0) };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

Style(id:string){ any }\ub97c \uc774\uc6a9\ud574 \uc2a4\ud0c0\uc77c\uc744 \uc120\uc5b8\ud574\uc8fc\uba74 \ub098\uc911\uc5d0 \ud574\ub2f9 id\ub97c \uac00\uc9c4 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc \ud574\ub2f9 \uc2a4\ud0c0\uc77c\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.

"},{"location":"tutorial/5_event/","title":"Event - \uc774\ubca4\ud2b8 \ud578\ub4e4\ub9c1","text":""},{"location":"tutorial/5_event/#_1","title":"\uc774\ubca4\ud2b8 \ub4f1\ub85d\ud558\uae30","text":"

MouseButton1Click \ud639\uc740 GetPropertyChangedSignal \uac19\uc740 \ub85c\ube14 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub97c \uac04\ub2e8\ud558\uac8c \ub4f1\ub85d\ud558\uace0 \uc2f6\uc73c\uc2e0\uac00\uc694? Event \ub97c \uc774\uc6a9\ud574\ubcf4\uc138\uc694.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Store = Quad.Store\n\nlocal TextButton = Class \"TextButton\"\nlocal Count = 0\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    Text = \"0 \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\";\n    [Event \"MouseButton1Click\"] = function(self,x,y)\n        Count = Count + 1\n        self.Text = Count .. \" \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\"\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n
"},{"location":"tutorial/5_event/#_2","title":"\uc774\ubc34\ud2b8 \ub9ac\uc2a4\ud2b8","text":"

\uc801\uc6a9\uac00\ub2a5\ud55c Event \ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4

Event(name:string)

\ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

Event.Created

\uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

\uc8fc\uc758

Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

Event.CreatedAsync

Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

\uc8fc\uc758

Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

Event.Prop(propertyName:string)

\ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

-- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

"},{"location":"tutorial/6_tween/","title":"Tween - \ud2b8\uc708\ud6a8\uacfc","text":""},{"location":"tutorial/6_tween/#_1","title":"\ud2b8\uc704\ub2dd","text":"

Quad\uc5d0\ub294 \ud2b8\uc708\uc744 \ub3c4\uc640\uc8fc\ub294 \ubaa8\ub4c8\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud2b8\uc708 \ubaa8\ub4c8\uc740 \ub2e8\uc21c\ud55c Instance\ub4e4\uc744 \ub118\uc5b4\uc11c table \ud615\uc2dd\ub3c4 \ud2b8\uc708\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub098\uc911\uc5d0 \ucee4\uc2a4\ud140 \uc624\ube0c\uc81d\ud2b8\ub97c \ud2b8\uc708\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4. Quad \uc5d0\uc11c\ub294 \uc2e4\uc81c\ub85c \uc9c1\uc811\uc801\uc73c\ub85c Tween \uc744 \uc0ac\uc6a9\ud560 \uc77c\uc740 \uc801\uc73c\uba70 \ucd94\ud6c4 \uc124\uba85\ub418\ub294 register:Tween()\ub85c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uad8c\uc7a5\ub429\ub2c8\ub2e4.

\ud2b8\uc708\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\ud589\ud569\ub2c8\ub2e4.

\uc6a9\ubc95\uc608\uc81c - \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc
Tween.RunTween(myFrame,{\n    -- \ud2b8\uc708 \uc635\uc158\n    Easing = Tween.Easing.Expo;\n    Direction = Tween.Directions.Out;\n    Time = 1;\n    ...\n},{\n    -- \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\n})\n
\ud074\ub9ad\uc2dc \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Tween = Quad.Tween\n\nlocal Frame = Class \"Frame\"\nlocal TextButton = Class \"TextButton\"\nlocal on = false\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(300,300);\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    TextButton \"Child\" {\n        Text = \"Click Me!\";\n        BackgroundColor3 = Color3.fromRGB(255,100,255);\n        Position = UDim2.fromOffset(80,100);\n        Size = UDim2.fromOffset(20,20);\n        [Event \"MouseButton1Click\"] = function(self,x,y)\n            on = not on\n            Tween.RunTween(self,{\n                -- \ud2b8\uc708 \uc635\uc158\uc785\ub2c8\ub2e4. \uc544\ub798\uc5d0\uc11c \uc124\uba85\ub429\ub2c8\ub2e4\n                Easing = Tween.Easing.Expo;\n                Direction = Tween.Directions.Out;\n                Time = 1;\n            },{\n                -- \ud2b8\uc708\ud560 \ubaa9\ud45c \ud504\ub85c\ud37c\ud2f0\uc785\ub2c8\ub2e4\n                Position = on\n                    and UDim2.fromOffset(200,100)\n                    or UDim2.fromOffset(80,100);\n            })\n        end;\n    };\n}\n\nMount(ScreenGUI, Store.GetObejct(\"mainFrame\"))\n
"},{"location":"tutorial/6_tween/#_2","title":"\ud2b8\uc708 \uc635\uc158","text":"

\ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708 \uc635\uc158\uc774 \ub4e4\uc5b4\uac00\uba70, \uc5ec\uae30\uc5d0\ub294 \ud2b8\uc708\uc758 \ubc29\ud5a5, \uac00\uac10\uc18d, \uc2dc\uac04 \ub4f1\uc744 \uc124\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub123\uc744 \uc218 \uc788\ub294 \ud2b8\uc708 \uc635\uc158\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

Option Time:number?

\ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

Option Easing:string|(index:number)->number?

\ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option Direction:string?

\ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

Option Getter:(Item:any, Property:string)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

\uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

Warning

register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

"},{"location":"tutorial/6_tween/#_3","title":"\ud2b8\uc708 \ud568\uc218","text":"

Quad \uc758 \ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708\uc744 \uba48\ucd94\uac70\ub098 \ud2b8\uc708\uc911\uc778\uc9c0 \ud655\uc778\ud558\ub294 \ub4f1\uc758 \uc791\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \uc5ec\ub7ec \ud568\uc218\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Tween \uc548\uc758 \ubaa8\ub4e0 \ud568\uc218\uc640 \uac12\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

\ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

Tween.StopTween(ItemOrHandler:TweenHandler|any)

\ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

Tween.StopPropertyTween(Item:any, PropertyName:string)

\uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

Tween.IsPropertyTweening(Item:any, PropertyName:string)

\ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
\uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

Tween.Easings: { [string]: EasingFunction }

\uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
\uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

"},{"location":"tutorial/7_quadProperty/","title":"QuadProperty - \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0","text":"\uc8fc\uc758\uc0ac\ud56d

\ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 Tween \uc774 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 register\uc758 :Tween()\uc758 \uacbd\uc6b0 \ud638\ud658\ub418\ubbc0\ub85c, \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0 \uac12\uc744 \ud2b8\uc708\ud558\ub824\uba74 \ud5a5\ud6c4 \uc124\uba85\ub418\ub294 register \uc640 \ud568\uae68 \uc0ac\uc6a9\ud574\uc57c\ud569\ub2c8\ub2e4.

Tween.RunTween, Tween.RunTweens \uc640\ub294 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

"},{"location":"tutorial/7_quadProperty/#_1","title":"\ud2b9\uc218\ud55c \ud504\ub85c\ud37c\ud2f0","text":"

Quad \uc5d0\uc11c\ub294 \ud3b8\ub9ac\uc131\uc744 \uc704\ud574 \uc77c\ubd80 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub4e0 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 \ud5a5\ud6c4 \uc18c\uac1c\ub418\ub294 register\uc640 \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal ImageFrame = Class \"ImageFrame\"\nImageFrame.BackgroundTransparency = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    PaddingAllOffset = 50; -- Padding \uc744 50 \uc529 \ubaa8\ub4e0 \ubc29\ud5a5\uc73c\ub85c \uc90d\ub2c8\ub2e4\n    BackgroundColor3 = Color3.fromRGB(40,40,40);\n    ImageFrame {\n        ImageColor3 = Color3.fromRGB(60,60,60);\n        RoundSize = 16; -- \uc774\ubbf8\uc9c0\ub85c \ub77c\uc6b4\ub4dc \ud504\ub808\uc784\uc744 \ub9cc\ub4ed\ub2c8\ub2e4\n        Size = UDim2.fromScale(1,1);\n        ImageFrame {\n            BackgroundColor3 = Color3.fromRGB(80,80,80);\n        };\n    };\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

RoundSize:number?

ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

Corner:number?

\ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

PaddingAll:UDim?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

PaddingAllOffset:number?

UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

Scale:number?

UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

"},{"location":"tutorial/8_register/","title":"Register - \uac12 \ubcc0\uacbd \uc5f0\ub3d9","text":"\uc77d\uae30 \uc804...

\ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetStore \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetStore \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

"},{"location":"tutorial/8_register/#_1","title":"\ub808\uc9c0\uc2a4\ud130","text":"

\ub808\uc9c0\uc2a4\ud130\ub294 \ud55c \uac12\uc774 \ubcc0\uacbd\ub420 \ub54c, \uadf8 \uac12\uc744 \uc0ac\uc6a9\ud55c \uacf3\uc774 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc8fc\ub294 Quad \uc758 \uc8fc\uc694 \uae30\uc220\uc785\ub2c8\ub2e4. \ucd94\ud6c4 \uc124\uba85\ub420 Class.Extend \uc640\ub3c4 \uac19\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

\ub808\uc9c0\uc2a4\ud130\ub294 \uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

  1. UI \uc758 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\ubc88\uc5d0 \ud398\uc774\ub4dc \uc544\uc6c3 \ud639\uc740 \ud398\uc774\ub4dc \uc778 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
  2. \uac00\ubcc0 \ud06c\uae30\uc758 UI \ub97c \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
  3. \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\uc2dc\ud0a4\ub294 \uacbd\uc6b0.
  4. \ub2e4\ud06c\ud14c\ub9c8/\ud654\uc774\ud2b8\ud14c\ub9c8 \ubcc0\uacbd\ud560 \uc218 \uc788\uac8c \ub9cc\ub4dc\ub294 \uacbd\uc6b0.

\uc774\uc678\uc5d0\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc758 \ud65c\uc6a9 \ubc29\ubc95\uc740 \ubb34\uad81\ubb34\uc9c4\ud569\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130\uc758 \uc0ac\uc6a9\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

local myStore = Store.GetStore(\"myStore\")\nmyStore.color = Color3.fromRGB(255,255,255)\nFrame { BackgroundColor3 = myStore \"color\" }\n-- \uc5f0\ub3d9\ub41c \ud504\ub808\uc784\ub3c4 \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4\nmyStore.color = Color3.fromRGB(0,0,0)\n
\uc8fc\uc758

\uad6c\ud604\uc758 \ubcf5\uc7a1\uc131\uc758 \uc774\uc720\ub85c \ub808\uc9c0\uc2a4\ud130\ub294 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local myFrame = Frame{}\nFrame.BackgroundColor3 = myStore \"color\"\n
\uc704\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

local myFrame = Frame{}\nApply (myFrame) {\n    BackgroundColor3 = myStore \"color\";\n}\n
  1. \uc2a4\ud1a0\uc5b4\ub97c \uc0dd\uc131\ud568.
  2. \uae30\ubcf8 \uac12\uc744 \uc124\uc815\ud568.
  3. \uc2a4\ud1a0\uc5b4\ub97c \ud638\ucd9c\ud574 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5bb\uc5b4 \ub4f1\ub85d\ud568.

\uc608\uc2dc \ucf54\ub4dc\ub85c \uc815\ud655\ud558\uac8c \ud655\uc778\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub294 \ud14c\uc774\ube14\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n-- \uc5ec\uae30\uc5d0 \ub2f4\uc544\ub0b4\ub294 \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud558\ub294 \uacbd\uc6b0 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c\n-- \uc624\ube0c\uc81d\ud2b8\ub4e4\ub3c4 \uac19\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\nlocal myStore = Store.GetStore(\"myStore\")\nlocal TextLabel = Class \"TextLabel\"\n\nmyStore.Text = \"0 \ucd08 \uc9c0\ub0a8\"\nmyStore.Color = Color3.fromRGB(255,100,255)\n\nTextLabel \"mainLabel\" {\n    Size = UDim2.fromOffset(100,200);\n    -- myStore \uc758 Text \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \ucd94\uc801\ud558\uace0, Text \uac12\uc744\n    -- \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0b5\ub2c8\ub2e4.\n    Text = myStore \"Text\";\n\n    -- \uc774\uac83\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uc544\ub2c8\ub77c \ub2e8\uc21c\ud788 \uac12\ub9cc\n    -- \ubd88\ub7ec\uc640 \ub123\uc5b4\uc8fc\ub294 \uac83\uc785\ub2c8\ub2e4. \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8\uac00 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    BackgroundColor3 = myStore.Color;\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainLabel\"))\n\n-- \ubc14\uafb8\ub354\ub77c\ub3c4 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544 \ubc18\uc601\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nmyStore.Color = Color3.fromRGB(255,255,255)\n\nlocal Count = 1\nwhile task.wait(1) do\n    -- \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud569\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \ub77c\ubca8\ub3c4\n    -- \uc790\ub3d9\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4.\n    myStore.Text = Count .. \" \ucd08 \uc9c0\ub0a8\"\n    Count = Count + 1\nend\n
"},{"location":"tutorial/8_register/#_2","title":"\ub808\uc9c0\uc2a4\ud130 \uba54\uc18c\ub4dc","text":"

\ub808\uc9c0\uc2a4\ud130\uc5d0\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uba54\uc18c\ub4dc\uac00 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4. \uc774 \uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub97c \ubcf4\ub2e4 \ub354 \ub2e4\uc591\ud558\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

:Add(value:any)->register

\uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:With((store:valueStore, newValue:any, key:string)->())->register

\ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:Tween(options:TweenOptions)->register

\ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
-- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

\ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
\uc8fc\uc758

\uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

:Default(value:any)->register

\uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

-- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

\uc8fc\uc758
  • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
  • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

\ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

\uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
\uc8fc\uc758

Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

:Observe((newValue:any)->())

:Register\uc758 \uac04\uc18c\ud654 \ubc84\uc804\uc785\ub2c8\ub2e4. :Register\uc640 \ub2e4\ub974\uac8c \uc790\ub3d9\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c GC \ub85c \ubd80\ud130 \ubcf4\ud638\ud558\uae30 \ub54c\ubb38\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c \ub530\ub85c \uc800\uc7a5 \ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70, \uc778\uc790\ub294 newValue \ud558\ub098\ub9cc \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

newValue \ub294 :Add, :With, :Tween, :Default \uac00 \uacc4\uc0b0\ub41c \uc0c1\ud0dc\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4.

\uac04\ub7b5\ud55c \uc6a9\ubc95
myStore.test = 1\nmyStore \"test\":Add(1):Observe(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n
"},{"location":"tutorial/9_lang/","title":"Lang - \uc5b8\uc5b4\uad00\ub9ac","text":"\uc77d\uae30 \uc804...

\ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Lang \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Lang \uc740 \uacf5\uc720\ub429\ub2c8\ub2e4

"},{"location":"tutorial/9_lang/#_1","title":"\uc5b8\uc5b4\uad00\ub9ac","text":"

Quad \uc5d0\ub294 \uadc0\ucc2e\uc740 \uc5b8\uc5b4\uad00\ub9ac\ub97c \uc790\ub3d9\uc73c\ub85c \ud574\uc8fc\ub294 \uae30\ub2a5\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae30\ub2a5\uc740 register \uc640 \uc5f0\ub3d9\ud574 \uc801\uc740 \uc904\uc758 \ucf54\ub4dc\ub85c \ubcc0\ud558\ub294 \ud14d\uc2a4\ud2b8\ub3c4 \uc5b8\uc5b4\uc5d0 \ub9de\uac8c \ucd9c\ub825\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\ubc88\uc5ed \ud14c\uc774\ube14\uc740 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) \ub2e4\uc74c\uc744 \uc774\uc6a9\ud574 \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70. Lang(LangName:string)(options)->register \ub85c UI \uc5d0 \uc801\uc6a9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.

Lang.Locales.Default \ub294 \uc77c\uce58\ud558\ub294 \uc5b8\uc5b4\uac00 \uc5c6\uc744\ub54c \ubcf4\uc5ec\uc904 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uc601\uc5b4\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4.

\uc6a9\ubc95\uc608\uc81c - \ub2e4\uc911\uc5b8\uc5b4 \uce74\uc6b4\ud130 \uc790\uc138\ud55c \uc124\uba85\uc740 \uc608\uc81c\ub97c \ucc38\uace0\ud558\uc138\uc694
Lang.New(\"Test\",{\n    [Lang.Locales.Korean] = \"{won} \uc6d0\";\n    [Lang.Locales.Default] = \"{won} Won\";\n})\nTextLabel {\n    Lang \"Test\" {\n        won = 100;\n    };\n}\n
1\ucd08\uac00 \uc9c0\ub0a0 \ub54c \ub9c8\ub2e4 \uce74\uc6b4\ud2b8\ub97c \uc99d\uac00\ud569\ub2c8\ub2e4. \uc601\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \uc601\uc5b4\ub97c, \ud55c\uad6d\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \ud55c\uad6d\uc5b4\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.
local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Lang = Quad.Lang\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.count = 0\n\nLang.New(\"TimePassed\",{\n    [Lang.Locales.Korean] = \"{count}\ucd08 \uc9c0\ub0ac\uc5b4\uc694\";\n    [Lang.Locales.Default] = function (options)\n        -- \ud568\uc218 \ub610\ud55c \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        if options.count > 1 then\n            return (\"%d seconds passed\"):format(options.count)\n        else\n            return (\"%d second passed\"):format(options.count)\n        end\n    end;\n})\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(100,100);\n    Text = Lang \"TimePassed\" {\n        -- count = 1 \uc77c\ubc18\uc801\uc778 \uac12\ub3c4 \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4\n        count = myStore \"count\";\n    };\n    [Event \"MouseButton1Click\"] = function()\n        -- \ud074\ub9ad\uc2dc \uc5b8\uc5b4\uac00 \ubcc0\uacbd\ub429\ub2c8\ub2e4\n        if Lang.CurrentLocale == Lang.Locales.Default then\n            Lang.CurrentLocale = Lang.Locales.Korean\n        else\n            Lang.CurrentLocale = Lang.Locales.Default\n        end\n    end\n}\nMount(ScreenGUIk,Store.GetObject(\"mainButton\"))\n\nwhile task.wait(1) do\n    myStore.count = myStore.count + 1\nend\n
\uc8fc\uc758

\uad6c\ud604\uc758 \ubcf5\uc7a1\uc131\uc758 \uc774\uc720\ub85c Lang \uc740 \ub808\uc9c0\uc2a4\ud130\uc640 \uac19\uc740 \uc81c\uc57d\uc744 \uac00\uc9d1\ub2c8\ub2e4 (\uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4)

local myLabel = TextLabel{}\nLang.new(\"Test\",{ [Lang.Locales.Default] = \"{lang}\" })\nmyLabel.Text = Lang \"Test\" { lang = 1 }\n
\uc704\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

\ub300\uc2e0\uc5d0 :Register \ubb38\ubc95\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

local myLabel = TextLabel{}\nLang.new(\"Test\",{ [Lang.Locales.Default] = \"{lang}\" })\nApply (myLabel) {\n    Text = Lang \"Test\" { lang = 1 };\n}\n
"},{"location":"tutorial/9_lang/#locale","title":"Locale \ubaa9\ub85d","text":"

\ub85c\ucf00\uc77c \uac12\ub4e4\uc740 Lang.Locales\uc5d0\uc11c \uac00\uc838\uc62c \uc218 \uc788\uc73c\uba70, \uc0ac\uc6a9\uac00\ub2a5\ud55c \ub85c\ucf00\uc77c \ubaa9\ub85d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

"}]} \ No newline at end of file diff --git a/docs/kr/sitemap.xml b/docs/kr/sitemap.xml deleted file mode 100644 index 4c904df..0000000 --- a/docs/kr/sitemap.xml +++ /dev/null @@ -1,248 +0,0 @@ - - - - https://quad.qwreey.kr/kr/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/changelogs/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/gallery/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/license/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/todo/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/bindable/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/connection/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/directions/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/disconnecter/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/easings/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/events/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/extend/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/locales/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/mounts/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/objectList/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/quad/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/quadProperty/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/register/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/tween/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/tweenOptions/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/typeDirections/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/include/typeEasings/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/event/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/extend/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/lang/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/mounts/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/quadProperty/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/signal/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/signal/bindable/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/signal/disconnecter/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/store/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/store/objectList/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/tween/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/tween/directions/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/tween/easings/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/reference/tween/tweenOptions/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/10_signal/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/11_extend/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/1_import/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/2_mount/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/3_getObject/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/4_style/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/5_event/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/6_tween/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/7_quadProperty/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/8_register/ - 2023-05-23 - daily - - - https://quad.qwreey.kr/kr/tutorial/9_lang/ - 2023-05-23 - daily - - \ No newline at end of file diff --git a/docs/kr/sitemap.xml.gz b/docs/kr/sitemap.xml.gz deleted file mode 100644 index 591fac0..0000000 Binary files a/docs/kr/sitemap.xml.gz and /dev/null differ diff --git a/docs/kr/todo/index.html b/docs/kr/todo/index.html deleted file mode 100644 index c977448..0000000 --- a/docs/kr/todo/index.html +++ /dev/null @@ -1,1307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 로드맵 - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

할일

-

진행중이거나 검토중

-

Easing 문서

-

Easing 문서에 Out In Inout 비교 영상 만들기

-

Spring

-

Spring 물리 계산을 UI 애니메이션에 적용합니다
-WIP. 아직 진행중인 프로젝트.

-

Quad Debuger

-

Register 의 상태와 Store 의 값, Class 의 동작 여부 등 Quad 의 여러 자원을 긴밀하게 디버그합니다.
-WIP. 아직 진행중인 프로젝트.

-

Selection

-

Tab 키등으로 버튼 선택하기 (... 가능함?) -WIP. 검토중인 프로젝트.

-
-

먼 미래에 . . .

-

혹은 이루워지지 않는

-

Quad Component Studio

-

눈에 보이는 워지워그식 편집기를 이용해 Quad Class 를 생성합니다.

-

Quad WebRender

-

HTML, CSS, JS 로써 스크립트를 변형해 스튜디오 없이 개발하는 가벼운 개발법입니다.

-

Quad Prerender

-

미리 렌더링된 rbxm 객체를 반환합니다. lua 스크립트들이 매핑되어 일반적이게 돌아갑니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/10_signal/index.html b/docs/kr/tutorial/10_signal/index.html deleted file mode 100644 index d820382..0000000 --- a/docs/kr/tutorial/10_signal/index.html +++ /dev/null @@ -1,1386 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Signal - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Signal - 이벤트 생성과 연결

-
-읽기 전... -

모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Bindable, Disconnecter 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Bindable, Disconnecter 는 공유됩니다

-
-

Quad 에는 편의상의 이유로 로블록스의 RBXScriptSignal 의 유사품과, 한번에 시그널을 끊어주는 Disconnecter 를 제공합니다.
-이는 내부적으로 ExtendGetPropertyChangedSignal 같은 곳에서 사용되기도 합니다.

-

Bindable

-

Bindable 은 RBXScriptSignal 과 유사한 객체입니다. Signal.Bindable.New(id:string?) 으로 생성할 수 있습니다.
-로블록스의 기본 BindableEvent 와는 다르게 :Fire 가 한곳에 합쳐져 있습니다.

-
-Note -

만약 id 를 지정한 경우, 같은 id 를 가진 Bindable 이 있으면 이전것을 반환합니다.

-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
local Quad = require(path.to.module).Init()
-local Signal = Quad.Signal
-
-local mySignal = Signal.Bindable.New()
-
-local connection = mySignal:Connect(function(v)
-    print(v)
-end)
-mySignal:Fire("이 메시지는 출력되어야 합니다.")
-connection:Disconnect()
-mySignal:Fire("이 메시지는 출력되면 안됩니다.")
-
-task.spawn(function()
-    task.wait(5)
-    mySignal:Fire("이 메시지는 지연된 후 출력되어야 합니다.")
-end)
-print(mySignal:Wait())
-
-mySignal:Once(function(v)
-    print(v)
-end)
-mySignal:Fire("이 메시지는 출력되어야 합니다.")
-mySignal:Fire("이 메시지는 출력되면 안됩니다.")
-
-mySignal:Once(function(v)
-    print(v)
-end):Disconnect()
-mySignal:Fire("이 메시지는 출력되면 안됩니다.")
-
-

Bindable 메소드

-

Bindable 에는 다음과 같은 메소드들이 제공됩니다.

-

:Fire(...any)

-
-

등록된 연결들을 실행하고, Wait 을 풀어줍니다.

-
-
-

:Wait()->(...any)

-
-

Fire 가 호출될 때 까지 기다립니다. Fire 에 사용된 값이 반환됩니다.

-
-
-

:Connect((...any)->())->Connection

-
-

Fire 가 호출 될 때 함수가 실행되도록 만듭니다. Fire 에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록 Connection 이 제공됩니다.

-
-
-

:Once((...any)->())->Connection

-
-

Connect 와 유사하지만, Fire 가 한번 호출된 뒤 연결이 끊어집니다/

-
-
-

:CheckConnected(func)->boolean

-
-

함수가 이미 등록되어 있는지 여부를 반환합니다.

-
-
-

:DisconnectAll()

-
-

모든 연결을 끊습니다. Wait 으로 기다리고 있는 곳에는 nil 을 반환합니다.

-
-
-

:Destroy()

-
-

:DisconnectAll() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
-

Connection 메소드

-

Bindable:Connect 와 Bindable:Once 는 Connection 을 반환합니다. Connection 에는 다음과 같은 메소드들이 제공됩니다.

-

:Disconnect()

-
-

연결을 끊습니다. Fire 가 호출되더라도 Connect 혹은 Once 에 사용된 함수가 실행되지 않습니다.

-
-
-

:Destroy()

-
-

:Disconnect() 의 별칭입니다.

-
-
-

Disconnecter

-

Disconnecter 는 일종의 Maid 모듈과 비슷한 객체입니다. 이 객체에는 Connection (로블록스, Quad 모두 호환) 을 추가할 수 있으며, 나중에 추가된 Connection 을 한꺼번에 Disconnect 할 수 있습니다. Signal.Disconnecter.New(id:string?) 으로 생성할 수 있습니다.

-
-Note -

만약 id 를 지정한 경우, 같은 id 를 가진 Bindable 이 있으면 이전것을 반환합니다.

-
-

:Add(connection:Connection|RBXScriptConnection)

-
-

connection을 리스트에 추가합니다. 나중에 :Disconnect를 호출하면 추가된 연결이 파기됩니다.

-
-
-

:Disconnect()

-
-

추가된 모든 연결에 Disconnect() 를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시 :Add 를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면 :Destroy 를 호출하세요

-
-
-

:Destroy()

-
-

:Disconnect() 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/11_extend/index.html b/docs/kr/tutorial/11_extend/index.html deleted file mode 100644 index a69726c..0000000 --- a/docs/kr/tutorial/11_extend/index.html +++ /dev/null @@ -1,2142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Extend - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Extend - 확장과 재사용

-

Extend 란?

-

Quad 에서는 로블록스의 Frame 이나 TextButton 같은 기본 오브젝트만 만들 수 있는것이 아닙니다. Quad 는 자신만의 버튼, 혹은 여러 컴포넌트들을 추상적으로 만들고. 다시 활용할 수 있도록 Extend 를 지원합니다.

-

ExtendRegister 와 더불어 Quad 의 가장 중요한 기능으로써, 다음과 같은 장점을 지닙니다.

-
-
    -
  1. 재사용 가능합니다. 나만의 버튼을 만들고, 고치고 싶은 마음이 생겨 고치면 자동으로 사용된 곳들이 업데이트됩니다.
  2. -
  3. 긴 코드를 나누어 코드마다 확실한 목적을 부여해 더 명확한 코드 작성이 가능해집니다.
  4. -
  5. 자신만의 프로퍼티를 만들거나 완전히 원하는대로 오브젝트를 커스터마이징 할 수 있습니다.
  6. -
  7. 함수나 생성기를 직접 만드는 것 보다 일관된 방법을 제공합니다.
  8. -
  9. 매우 유연합니다. 다양한 방법의 구현법을 원하는대로 사용할 수 있습니다.
  10. -
-
-
-

나만의 클래스를 만들어보기

-

Extend 객체는 다음과 같이 생성합니다.
-

1
-2
-3
-4
-5
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
--- extend 객체를 만듭니다
-local myClass = Class.Extend()
-
-일반적으로 Extend 는 한 모듈에 하나씩 넣습니다.

-

다음과 같은 코드 구조를 만들어보세요. 아래의 코드는 모든 Extend 문법을 설명합니다.
-

1
-2
-3
 - ScreenGUI
- |-- localscript
-    |-- myClass (ModuleScript)
-

-
-
-
-
Extend 클래스를 불러오고 사용합니다
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Mount = Quad.Mount
-local Class = Quad.Class
-local Store = Quad.Store
-
-local myStore = Store.GetStore("myStore")
-myStore.bgColor = Color3.fromRGB(0,0,0)
-
--- Class(require(script.myClass)) 와 같습니다.
--- 줄여서 Class(script.myClass) 로 쓸 수도 있습니다.
-local myClass = Class(script.myClass)
-
--- 프레임에 넣거나 하여도 무방합니다
--- 일반 오브젝트와 똑같이 id 를 넣고 GetObject 로
--- 가져올 수도 있습니다
-local main = myClass "main" {
-    -- 이 테이블은 모듈의 :Init(props) 에 제공됩니다.
-    -- :Render(props) 에도 이 테이블이 제공됩니다.
-    Testing = 1;
-    Text = "Test";
-    -- 레지스터 값을 넘겨줄 수도 있습니다.
-    -- 받는쪽도 레지스터인 경우 값이 연동됩니다.
-    BackgroundColor3 = myStore "bgColor";
-}
-
-Mount(ScreenGUI, main)
-print(Store.GetObject("main") == main) -- true
-
--- 이 값을 바꾸면 연동된 BackgroundColor3 도 바뀔것입니다
-myStore.bgColor = Color3.fromRGB(255,255,255)
-
--- 값 변경됨을 연결하기
-main
-    :GetPropertyChangedSignal("AbsolutePosition")
-    :Connect(function()
-        print("AbsolutePosition",main.AbsolutePosition)
-    end)
-
--- main:Update()
--- 강제로 다시 Render 를 실행하도록 만듭니다.
-
--- main.Testing = 2
--- 업데이트 트리거이므로 이 값을 변경하면.
--- main:Update() 와 같은 효과가 납니다.
-
-
-
-
Extend 클래스를 만듭니다. 다른곳에서 불러서 사용할 수 있습니다.
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Event = Quad.Event
-
-local TextLabel = Class "TextLabel"
-
-local myClass = Class.Extend()
-
--- Init 는 Render 전 props 를 초기화 하는 용도로 사용합니다
--- Init 에는 프로퍼티 리스트가 제공됩니다. Init 는 없더라도 무방합니다.
-function myClass:Init(props)
-    -- 생성된 오브젝트에 프라이빗 값을 만듭니다.
-    -- 이름 앞에 _ 가 붇으면 외부에서 사용되는 목적이 아닌
-    -- 내부에서 사용되는 목적으로만 사용할 수 있습니다
-    -- 이 경우 안전성을 위해 register 를 사용할 수
-    -- 없습니다.
-    self._testValue = 2
-
-    -- 프로퍼티의 기본값을 정해줄 수 있습니다.
-    -- 생성 시 값이 누락된 경우 사용할 값을 정해줄 수 있습니다
-    -- 키, 값 으로 구성합니다
-    props:Default("Text",   "Testing Label")
-    props:Default("ZIndex", 1)
-end
-
--- myClass 가 진짜 그려지는 부분입니다.
--- Render 도 Init 처럼 프로퍼티 리스트가 제공됩니다.
-function myClass:Render(props)
-    return TextLabel {
-        Size = UDim2.fromOffset(200,200);
-        -- self 에 _label 로 이 TextLabel 을 넣습니다.
-        -- 자식 오브젝트에도 사용할 수 있는 문법입니다.
-        self "_label";
-
-        -- _holder 는 예약된 값입니다. 자식들이 여기에 들어와야
-        -- 함을 나타냅니다. 리스트나 그리드가 있는 경우 유용합니다.
-        -- 따로 설정하지 않는 경우 Render 가 리턴한 값을 사용합니다.
-        self "_holder";
-
-        -- GetPropertyChangedSignal 가 작동할 수 있도록
-        -- 프로퍼티 변경 이벤트를 연결해줍니다
-        -- 이 또한 자식 오브젝트에도 사용할 수 있는 문법입니다.
-        [Event.Prop "AbsolutePosition"] = self "AbsolutePosition";
-        -- 마우스 클릭같은 다른 이벤트를 GetPropertyChangedSignal 에
-        -- 연결하려면 :EmitPropertyChangedSignal() 를 호출해주면 됩니다.
-        [Event "MouseEnter"] = function (this,x,y)
-            -- 키, 값이 들어갑니다. 값이 없으면 self[key] 로 대신합니다.
-            self:EmitPropertyChangedSignal("Testing2",1)
-        end;
-
-        -- 받은 레지스터를 연동합니다.
-        -- 만약 props.BackgroundColor3 만 사용하면
-        -- 처음에만 레지스터에서 값을 읽어옵니다.
-        -- 따라서 값을 변경해도 변경사항이 적용되지 않습니다.
-        BackgroundColor3 = props "BackgroundColor3":Tween();
-
-        -- 입력 값과 상관없이 레지스터를 쓸 수 있습니다.
-        -- 이 경우 main.Text = "New" 처럼 직접 변경하면
-        -- 그 변경이 적용됩니다.
-        Text = props "Text";
-        ZIndex = props "ZIndex";
-        -- ... 자식을 넣어도 무방합니다.
-        -- Frame {
-        --    [Event.Created] = function(self)
-        --        print(self.Parent) -- nil 일 수도 있습니다
-        --        따라서 부모를 건들여야 하는 경우, self "" 를 통해
-        --        self 값에 넣어놓고 나중에 AfterRender 로 해결해야합니다.
-        --    end;
-        -- }
-    }
-end
-
-
--- AfterRender 는 Render 직후 실행됩니다.
--- 렌더링 후 실행해야 할 것을 넣을 수 있습니다.
--- object 는 :Render 가 반환한 값입니다.
--- AfterRender 는 없더라도 무방합니다.
-function myClass:AfterRender(object)
-    print(self._label,"이 생성되었습니다")
-    -- 이렇게 하면 레지스터로 연결된 부분도 업데이트됩니다.
-    self.ZIndex = 2
-end
-
--- function myClass:Unload(object)
--- :Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도
--- 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다
--- object 는 :Render 가 반환한 값입니다
-
--- AbsolutePosition 값을 반환할 수 있도록 만듭니다
-function myClass.Getter.AbsolutePosition(self)
-    return self._label.AbsolutePosition
-end
-
--- AbsolutePosition 값을 설정할 수 없도록 만듭니다
-function myClass.Setter.AbsolutePosition(self,newValue)
-    -- 필요한 경우 값을 설정하도록 만들 수 있습니다
-    error("AbsolutePosition 값은 설정할 수 없습니다")
-end
-
--- main.Testing = 2 다음과 같이 값을 변경하면 오브젝트가
--- 완전히 다시 그려집니다. 즉 업데이트 트리거로 사용합니다.
-myClass.UpdateTriggers.Testing = true
-
--- 만든 클래스를 반환해줍시다.
-return myClass
-
-
-
-
-
-

Extend

-

Extend 에서 사용할 수 있는 값들과 메소드입니다.

-

self(name:string)->linker

-
-

Extend 메소드 전역에서 사용가능합니다. 링커를 만들며, PropertyChangedSignal 를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.

-
-
-

Overwite REQUIRED :Render(props:valueStore)

-
-

화면에 그려지는 UI 를 만들어지게 하는 함수입니다. Extend 가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Event = Quad.Event
-local Mount = Quad.Mount
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        [Event "MouseButton1Click"] = function (self,x,y)
-            print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y))
-        end;
-        Size = props "Size";
-        Text = props "Text"; -- 레지스터를 이용합니다
-    }
-end
-
-local myImported = Class(myClass)
-myImported.Size = UDim2.fromOffset(200,200)
-
-local test = myImported {
-    Text = "wow"
-}
-Mount(ScreenGUI, test)
-
--- 텍스트를 업데이트합니다
-while task.wait(1) do
-    test.Text = "w"..("o"):rep(#test.Text-1).."w"
-end
-
-
-
-

Overwite Option :Init(props:valueStore)

-
-

선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Init(props)
-    -- Size 값이 없다면 기본값을 사용하도록 합니다.
-    props:Default("Size", UDim2.fromOffset(100,100))
-
-    -- 앞에 _ 를 붇여 내부 변수를 만듭니다.
-    -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다.
-    self._asdf = true
-end
-function myClass:Render(props)
-    return TextButton {
-        props "Size"
-    }
-end
-
-local myImported = Class(myClass)
-local myButton = myImported() -- 옵션 없음
-print(myButton.Size)
-
-
-
-

Overwite Option :AfterRender(object:any)

-
-

선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button"; -- 자기 자신에 이 버튼을 넣습니다
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button == object) -- true
-end
-
-local myImported = Class(myClass)
-myImported() -- 옵션 없음
-
-
-
-

Overwite Option :Update()

-
-

:Render:AfterRender 를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:Update() -- update
-myButton:Update() -- update
-myButton:Update() -- update
-

-
-
-

Overwite Option .Getter.<PropertyName>(self)

-
-

값을 얻는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {}
-end
--- 값을 읽는데 사용할 함수를 등록합니다
-function myClass.Getter.Test(self)
-    return "Hello World"
-end
-
-local myImported = Class(myClass)
-print(myImported().Test)
-

-
-
-

Overwite Option .Setter.<PropertyName>(self,newValue:any)

-
-

값을 설정하는데 사용됩니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_button";
-        Text = "wow";
-    }
-end
--- 값을 지정하는데 사용할 함수를 등록합니다
-function myClass.Setter.Test(self,newValue)
-    self._button.Text = newValue
-end
-function myClass.Getter.Test(self)
-    return self._button.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-print(myButton.Test)
-myButton.Test = "Hello World"
-print(myButton.Test)
-

-
-
-

Overwite Option .UpdateTriggers.<PropertyName> = boolean?

-
-

해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-local count = 0
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    print("Rendering!")
-    count = count + 1
-    return TextButton {
-        self "_button";
-        Name = tostring(count);
-    }
-end
-function myClass:AfterRender(object)
-    print(self._button.Name)
-end
--- 값 변경시 업데이트 여부를 지정합니다
-myClass.UpdateTriggers.Test = true
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-myButton.Test = 1 -- update
-

-
-
-

Overwite Option :Unload(object)

-
-

:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다

-
-
-

:GetPropertyChangedSignal(propertyName:string)->Bindable

-
-

값 변경을 연결할 수 있는 Bindable을 반환합니다. :EmitPropertyChangedSignal 으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.

-
-
-

:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

-
-

프로퍼티 변경시 :GetPropertyChangedSignal 에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로 self.a = 1 과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다. changedValue 는 선택사항이며, 주어지지 않으면 self[propertyName]을 반환합니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_box";
-        Text = "test";
-        Size = UDim2.fromOffset(200,200);
-        [Evnet.Prop "Text"] = function (this,newValue)
-            self:EmitPropertyChangedSignal("Text",newValue)
-        end;
-        -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다.
-        -- self(name:string) 문법으로 변경 이벤트 역시 링크
-        -- 할 수 있습니다.
-    }
-end
-function myClass.Getter.Text(self)
-    return self._box.Text
-end
-
-local myImported = Class(myClass)
-local myButton = myImported()
-myButton:GetPropertyChangedSignal("Text"):Connect(function()
-    print(myButton.Text)
-end)
-Mount(ScreenGUI, myButton)
-

-
-
-

Event .ChildAdded:Connect((child)->())->Connection

-
-

자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 또는 :AfterRender 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, 추후 Mount 를 통해 추가되는 자식 오브젝트 또한 이 이벤트로 얻어질 수 있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    self.ChildAdded:Connect(function(child)
-        print(child.Name)
-    end)
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
-    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
-    -- 얻어올 수 있습니다.
-    TextButton { Name = "Hello "};
-}
-
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
-
-

:GetChildren()

-
-

자식 오브젝트들을 가져오는 함수입니다. :Init():AfterRender() 에서는 빈 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. -

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Evnet = Quad.Event
-
-local TextButton = Class "TextButton"
-
-local myClass = Class.Extend()
-function myClass:Render(props)
-    return TextButton {
-        self "_holder";
-    }
-end
-function myClass:AfterRender()
-    for i,v in ipairs(self:GetChildren()) do
-        print(v.Name)
-    end
-end
-
-local myImported = Class(myClass)
-local myButton = myImported{
-    TextButton { Name = "Hello World"};
-}
-
--- 나중에 추가하는 오브젝트는 출력되지 않습니다.
-Mount(myButton, TextButton{ Name = "Hello" })
-Mount(myButton, TextButton{ Name = "World" })
-

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/1_import/index.html b/docs/kr/tutorial/1_import/index.html deleted file mode 100644 index f83e36a..0000000 --- a/docs/kr/tutorial/1_import/index.html +++ /dev/null @@ -1,1302 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Import - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Import - 오브젝트 생성

-

로블록스 오브젝트 불러오기

-

Frame 과 같은 UI 오브젝트를 만들고 싶은 경우 먼저 import 를 이용해주어야 합니다. -다음과 같이 입력해보세요!

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local Frame = Class "Frame"
-
-print(
-    Frame {
-        Name = "Wow!";
-        -- 다음과 같이 자식을 추가할 수 있습니다
-        Frame {
-            Name = "Child";
-        };
-    }
-)
-
-

나중에 자신만의 UI 오브젝트를 생성할 수 있지만, 일반적인 로블록스가 지원하는 오브젝트의 경우 Class(ClassName:string) 으로 불러올 수 있습니다

-
-

불러온 Class 에 기본값 설정

-

불러온 Class 에 기본값을 설정할 수도 있습니다.
-이렇게 하면 BorderSizePixel 와 같이 자주 사용될 수 있는 프로퍼티를 미리 지정해 둘 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-local FrameWithoutBorder = Class "Frame"
-FrameWithoutBorder.BorderSizePixel = 0
-
-local FrameWithBorder = Class "Frame"
-FrameWithBorder.BorderSizePixel = 1
-
-local frame1 = FrameWithoutBorder {}
-local frame2 = FrameWithBorder {}
-local frame3 = FrameWithBorder {
-    -- 값을 덮어 쓸 수 있습니다
-    -- 이렇게 하면 기본값이 무시됩니다.
-    BorderSizePixel = 0;
-}
-
-print(frame1.FrameWithBorder.BorderSizePixel)
-print(frame2.FrameWithBorder.BorderSizePixel)
-print(frame3.FrameWithBorder.BorderSizePixel)
-
-

이제 그려낸 프레임을 화면에 그려보고 싶나요? 다음 튜토리얼 Mount 를 확인해보세요!

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/2_mount/index.html b/docs/kr/tutorial/2_mount/index.html deleted file mode 100644 index 01a1aff..0000000 --- a/docs/kr/tutorial/2_mount/index.html +++ /dev/null @@ -1,1349 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mount - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Mount - 화면에 UI 표현

-

화면에 UI 를 표시하기

-

Quad 모듈에서 모든 Parent 처리는 Mount 를 이용합니다. Mount(to:any,...item:any?)->mounts 함수를 이용하면 다루는 오브젝트가 로블록스 Instance 인지, 향후 소개될 Quad 확장 클래스인지 상관없이 알아서 Parent 가 처리됩니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
--- StarterGui 안에 ScreenGui 를 넣고 로컬스크립트로 입력해보세요
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-Mount(ScreenGui,
-    Frame {
-        Name = "Wow!";
-    }
-    --[[
-    , Frame {} , Frame {}
-    더많은 오브젝트를 다같이 Mount 할 수 있습니다
-    ]]
-)
-
-
-

마운트 객체

-

편의를 위해서 Mount 함수는 mounts 라는 객체를 반환합니다. 이것을 이용하면 필요에 따라서 Mount 상태를 해제하거나 추가 할 수 있습니다. mounts 객체는 다음과 같은 메소드를 가집니다.

-

:Unmount()

-
-

이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해 Store.GetObject 에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui,mainFrame)
-
-local childFrame = Frame {}
-local childFrameMount = Mount(mainFrame,childFrame)
-childFrameMount:Unmount()
--- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다
--- 즉, Destroy() 가 호출됩니다
-
-
-
-

:Add(item:any)

-
-

Mount 에 오브젝트를 추가합니다. 처음 설정한 to 값을 따라 부모가 결정됩니다.

-

이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount = Quad.Class,Quad.Mount
-
-local Frame = Class "Frame"
-
-local mainFrame = Frame {}
-Mount(ScreenGui, mainFrame)
-
-local lastListMount = Mount(mainFrame)
-local function refreshList()
-    lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다
-    for i = 1,10 do
-        lastListMount:Add(Frame { Name = tostring(i) })
-    end
-end
-
-task.spawn(function()
-    while true do
-        refreshList()
-        task.wait(2)
-    end
-end)
-
-

다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단 ScrollFrame 의 경우 CanvasPosition이 초기화 되어버리므로 자식들을 :Unmount() 하기 전에 위치를 저장하고 다시 불러와야 합니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/3_getObject/index.html b/docs/kr/tutorial/3_getObject/index.html deleted file mode 100644 index 348f56b..0000000 --- a/docs/kr/tutorial/3_getObject/index.html +++ /dev/null @@ -1,1567 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - GetObject - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

GetObject - 오브젝트에 아이디 부여

-
-읽기 전... -

모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Store.GetObject 가 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Store.GetObject 는 공유됩니다

-
-
-

오브젝트에 아이디 부여하기, 사용하기

-

변수에 만들어진 오브젝트를 하나하나 저장해야하나요? 아니요, Quad 에는 오브젝트에 아이디를 부여할 수 있습니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store
-
-local Frame = Class "Frame"
-
-Frame "mainFrame" {
-    Size = UDim2.fromScale(1,1);
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-

아이디에 허용되는 글자는 변수명과 같습니다. 대소문자, 숫자, 언더바(_) 를 허용합니다.
-오브젝트 생성시 Frame "mainFrame" {} 와 같이 id 값을 지정해 준다면 생성된 오브젝트는 그 아이디를 가지게 됩니다.
-Store.GetObject(id:string)->Object? 는 생성된 객체중 가장 첫번째의 id 가 일치하는 오브젝트를 반환해 줍니다.

-
1
-2
-3
local index = 1
-Frame ("mainFrame" .. index) {}
-print(Store.GetObject("mainFrame" .. index))
-
-

위처럼 생성이나 가져오기에서 식을 만들어 넣을 수도 있습니다.

-
-

다량의 오브젝트를 다루기

-
-주의 -

Store.GetObjects의 반환값인 objectList는 캐시해서는 안됩니다. objectList를 local 에 넣고 계속해서 유지시키지 마십시오, 반환값은 자동으로 업데이트 되지 않습니다.

-
-

Quad 는 다량의 오브젝트를 다루기 편하도록 Store.GetObjects(id:string)->objectList 라는 함수를 가지고 있습니다.

-

실험으로, 색깔이 랜덤하게 바뀌는 프레임들을 만들어 봅시다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store
-
-local Frame = Class "Frame"
-
-Frame "mainFrame" {
-    Size = UDim2.fromScale(1,1);
-    Frame "Child" {
-        Size = UDim2.fromOffset(20,20);
-    };
-    Frame "Child" {
-        Size = UDim2.fromOffset(20,20);
-        Position = UDim2.fromOffset(30,0);
-    };
-    Frame "Child" {
-        Size = UDim2.fromOffset(20,20);
-        Position = UDim2.fromOffset(60,0);
-    };
-    Frame "Child" {
-        Size = UDim2.fromOffset(20,20);
-        Position = UDim2.fromOffset(90,0);
-    };
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
--- 값을 설정할 수 있습니다. 그러나 값을 읽거나 :Connect 할 수는 없습니다
-Store.GetObjects("Child").Size = UDim2.fromOffset(30,30)
-
--- 필요에 따라 Store.GetObjects("Child") 를 pairs 에 넣어 for 문을 사용하거나
--- :Each , :EachAsync , :IsEmpty 함수를 이용할 수 있습니다
-task.spawn(function()
-    while true do
-        Store.GetObjects("Child"):Each(function (item, index)
-            item.BackgroundColor3 = Color3.fromRGB(
-                math.random(0,255),
-                math.random(0,255),
-                math.random(0,255)
-            )
-        end)
-        task.wait(1)
-    end)
-end
-
--- for 문을 이용해서 출력합니다
-for _,child in ipairs(Store.GetObjects("Child")) do
-    print(child)
-end
-
-

objectList

-

Store.GetObjects() 의 반환 objectList 의 메소드들은 다음과 같습니다.

-

:Each((item:any, index:number)->())

-
-

일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다

-
-
-

:EachAsync((item:any, index:number)->())

-
-

반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-코루틴이 이용됩니다. wrap() 코루틴을 모르거나, 필요성이 없는경우 일반적으로 :Each 를 사용해도 됩니다

-
-
-

:IsEmpty()

-
-

이 ObjectList 가 비어있는지 여부를 반환합니다.

-
-
-

:Remove(indexOrItem:number|any)

-
-

objectList 에서 해당하는 오브젝트를 제거합니다.
-, & 를 사용한 고급 검색에서는 작동하지 않습니다

-
-
-

고급 ID 사용하기

-

id 기능을 조금더 고급적인 방법으로 사용할 수도 있습니다.

-
-
-
-
1
-2
-3
-4
-5
-6
-- 두 아이디를 가진 프레임을 생성합니다
-Frame "a,b" {}
--- a 를 가진것과, a 와 b 를 가진것을 가져옵니다
-Store.GetObjects("a,a&b"):Each(function(item)
-    print(item)
-end)
-
-
-
-
좀더 직관적인 확인을 위해서 작동시켜보세요.
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Mount
-local Mount = Quad.Store
-local Store = Quad.Class
-
-local Frame = Class "Frame"
-
---다음과 같이 a 와 b 모두 가진 프레임을 생성할 수도 있습니다.
-Frame "a,b" {
-    Name = "main";
-    Frame "a" {
-        Name = "Child1";
-    };
-    Frame "b" {
-        Name = "Child2";
-    };
-}
-
--- 다음과 같이 a 와 b 둘다 선택할 수 있습니다
-Store.GetObjects("a,b"):Each(function(item, index)
-    print(item.Name)
-end)
-print("----")
-
--- 다음과 같이 a 와 b 를 동시에 가진 것을 선택할 수 있습니다
-Store.GetObjects("a&b"):Each(function(item, index)
-    print(item.Name)
-end)
-print("----")
-
--- 다음과 같이 a와b 를 동시에 가진것과, b 를 가진것을 선택
--- 할 수 있습니다
-Store.GetObjects("a&b,b"):Each(function(item, index)
-    print(item.Name)
-end)
-
-
-
-
-
    -
  • 또는(or) 연산 ,
  • -
  • 그리고(and) 연산 &
  • -
-

GetObjects 에는 이 두 연산을 사용할 수 있고, 생성시에는 , 으로 여러 아이디를 부여해줄 수 있습니다. 띄어쓰기는 무시됩니다

-
-주의 -
    -
  • GetObject 에는 이 방식을 사용할 수 없습니다.
  • -
  • 고급 ID 사용시 objectList:Remove 메소드는 사용할 수 없습니다.
  • -
-
-
-

id 추가와 제거

-

경우에 따라 이미 생성한 오브젝트에 id 를 추가 혹은 제거해줄 수 있습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Store = Quad.Store
-
-local Frame = Class "Frame"
-
-Frame "testing" {}
-
--- 아이디를 추가합니다
-Store.AddObject(
-    "a,b", Store.GetObject("testing")
-)
-
--- 아이디를 제거합니다
-Store.GetObjects("a"):Remove(Store.GetObject("testing"))
-
-

Store.AddObject(ids:string, item:any) 를 이용해 item 에 아이디를 추가하고
-:Remove(item:any) 를 이용해 item 에 아이디를 제거합니다

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/4_style/index.html b/docs/kr/tutorial/4_style/index.html deleted file mode 100644 index 036ed74..0000000 --- a/docs/kr/tutorial/4_style/index.html +++ /dev/null @@ -1,1360 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Style - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Style - 속성 값 번들링

-
-읽기 전... -

모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Style 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Style 는 공유됩니다

-
-
-

반복되는 속성값을 줄이기

-

Quad 에서는 반복적인 속성들을 줄여 쓸 수 있도록 Style 을 제공합니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Style = Quad.Style
-
-local Frame = Class "Frame"
-
--- 새로운 스타일을 하나 만듭니다
-local myStyle = Style {
-    Size = UDim2.fromOffset(20,20);
-    BackgroundColor3 = Color3.fromRGB(255,255,0);
-    BackgroundTransparency = 0.5;
-}
-
-Frame "mainFrame" {
-    Size = UDim2.fromScale(1,1);
-    Frame "Child" {
-        myStyle; -- 스타일을 적용합니다!
-    };
-    Frame "Child" {
-        Position = UDim2.fromOffset(30,0);
-        myStyle;
-    };
-    Frame "Child" {
-        Position = UDim2.fromOffset(60,0);
-        myStyle;
-    };
-    Frame "Child" {
-        Position = UDim2.fromOffset(90,0);
-        -- 스타일은 덮어써 질 수 있습니다.
-        BackgroundColor3 = Color3.fromRGB(255,0,0);
-        myStyle;
-    };
-}
-
-Mount(ScreenGUI,Store.GetObject("mainFrame"))
-
-

Style을 사용하면 많은 양의 속성을 하나에 변수로 집어넣을 수 있습니다. Style을 사용해서 많은 양의 코드를 줄여보세요

-
-

ID 로 타겟을 지정하기

-

Style에는 타겟 id를 지정해줄 수 있습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Style = Quad.Style
-
-local Frame = Class "Frame"
-
--- 여기에는 & 나 , 가 적용되지는 않습니다!
-Style "Child" {
-    Size = UDim2.fromOffset(20,20);
-    BackgroundColor3 = Color3.fromRGB(255,255,0);
-    BackgroundTransparency = 0.5;
-}
-
--- 단, Style은 먼저 선언해야합니다, Frame을 먼저 만들고
--- Style을 선언하면 적용되지 않습니다.
-Frame "mainFrame" {
-    Size = UDim2.fromScale(1,1);
-    Frame "Child" {};
-    Frame "Child" { Position = UDim2.fromOffset(30,0) };
-}
-
-Mount(ScreenGUI,Store.GetObject("mainFrame"))
-
-

Style(id:string){ any }를 이용해 스타일을 선언해주면 나중에 해당 id를 가진 오브젝트 생성시 해당 스타일이 적용됩니다.

- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/5_event/index.html b/docs/kr/tutorial/5_event/index.html deleted file mode 100644 index 586ef79..0000000 --- a/docs/kr/tutorial/5_event/index.html +++ /dev/null @@ -1,1400 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Event - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Event - 이벤트 핸들링

-

이벤트 등록하기

-

MouseButton1Click 혹은 GetPropertyChangedSignal 같은 로블 기본 이벤트를 간단하게 등록하고 싶으신가요? Event 를 이용해보세요.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Event = Quad.Event
-local Store = Quad.Store
-
-local TextButton = Class "TextButton"
-local Count = 0
-
-TextButton "mainButton" {
-    Size = UDim2.fromOffset(200,200);
-    Text = "0 번 클릭했습니다";
-    [Event "MouseButton1Click"] = function(self,x,y)
-        Count = Count + 1
-        self.Text = Count .. " 번 클릭했습니다"
-    end;
-}
-Mount(ScreenGUI, Store.GetObject("mainButton"))
-
-
-

이밴트 리스트

-

적용가능한 Event 들은 다음과 같습니다

-

Event(name:string)

-
-

모든 로블록스 이벤트들을 나타냅니다, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up 등이 될 수 있습니다
-기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로 self 를 받을 수 있습니다.

-
-
-
-
1
-2
-3
-4
-5
Frame {
-    [Event "MouseEnter"] = function (self)
-        print(self.Name .. "에 마우스가 올라왔습니다")
-    end;
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local TextButton = Class "TextButton"
-
-TextButton "mainButton" {
-    Size = UDim2.fromOffset(200,200);
-    [Event "MouseEnter"] = function (self)
-        print("버튼이 클릭되었습니다")
-    end;
-}
-Mount(ScreenGUI, Store.GetObject("mainButton"))
-
-
-
-
-
-
-

Event.Created

-
-

오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로 self 를 받을 수 있습니다.
-

1
-2
-3
-4
-5
-6
-- 용법
-Frame {
-    [Event.Created] = function (self)
-        print(self.Name .. "이 생성되었어요")
-    end;
-}
-

-
-주의 -

Event.Created 가 실행될 때는 Parent 값이 정해지지 않았을 수 있습니다. self.Parent 는 접근해서는 안됩니다. Class.Extend 에서는 AfterRender 를 이용해야 합니다.

-
-
-
-

Event.CreatedAsync

-
-

Event.Created 와 비슷하지만, 코루틴 안에서 작동합니다. objectList:EachAsync() 처럼 반환을 기다리지 않습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-- 용법
-Frame {
-    Frame {
-        Name = "A";
-        [Event.CreatedAsync] = function (self)
-            -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다
-            task.wait(5)
-        end;
-    };
-    Frame {
-        Name = "B";
-        [Event.Created] = function (self)
-            print(self.Name .. "가 생성되었습니다")
-        end;
-    };
-}
-

-
-주의 -

Event.CreatedAsync 가 실행될 때는 Parent 값이 정해지지 않았을 수 있습니다. self.Parent 는 접근해서는 안됩니다.

-
-
-
-

Event.Prop(propertyName:string)

-
-

프로퍼티 값이 변경됨을 연결합니다.
-

1
-2
-3
-4
-5
-6
-7
-8
-- 용법
-TextBox {
-    Text = "아무거나 입력하세요";
-    [Event.Prop "Text"] = function (self,text)
-        -- 편의상의 이유로 변경된 값이 제공됩니다
-        print(text)
-    end;
-}
-

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/6_tween/index.html b/docs/kr/tutorial/6_tween/index.html deleted file mode 100644 index ede9d96..0000000 --- a/docs/kr/tutorial/6_tween/index.html +++ /dev/null @@ -1,1586 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tween - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Tween - 트윈효과

-

트위닝

-

Quad에는 트윈을 도와주는 모듈이 내장되어 있습니다. 이 트윈 모듈은 단순한 Instance들을 넘어서 table 형식도 트윈을 수행할 수 있습니다. 이는 나중에 커스텀 오브젝트를 트윈할 때 유용합니다.
-Quad 에서는 실제로 직접적으로 Tween 을 사용할 일은 적으며 추후 설명되는 register:Tween()로 사용하는것이 권장됩니다.

-

트윈은 일반적으로 다음과 같이 수행합니다.

-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
-9
Tween.RunTween(myFrame,{
-    -- 트윈 옵션
-    Easing = Tween.Easing.Expo;
-    Direction = Tween.Directions.Out;
-    Time = 1;
-    ...
-},{
-    -- 프로퍼티 목록
-})
-
-
-
-
클릭시 움직이는 버튼을 구현합니다.
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Tween = Quad.Tween
-
-local Frame = Class "Frame"
-local TextButton = Class "TextButton"
-local on = false
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(300,300);
-    BackgroundColor3 = Color3.fromRGB(255,255,255);
-    TextButton "Child" {
-        Text = "Click Me!";
-        BackgroundColor3 = Color3.fromRGB(255,100,255);
-        Position = UDim2.fromOffset(80,100);
-        Size = UDim2.fromOffset(20,20);
-        [Event "MouseButton1Click"] = function(self,x,y)
-            on = not on
-            Tween.RunTween(self,{
-                -- 트윈 옵션입니다. 아래에서 설명됩니다
-                Easing = Tween.Easing.Expo;
-                Direction = Tween.Directions.Out;
-                Time = 1;
-            },{
-                -- 트윈할 목표 프로퍼티입니다
-                Position = on
-                    and UDim2.fromOffset(200,100)
-                    or UDim2.fromOffset(80,100);
-            })
-        end;
-    };
-}
-
-Mount(ScreenGUI, Store.GetObejct("mainFrame"))
-
-
-
-
-
-

트윈 옵션

-

트윈에는 트윈 옵션이 들어가며, 여기에는 트윈의 방향, 가감속, 시간 등을 설정해줄 수 있습니다.
-넣을 수 있는 트윈 옵션은 다음과 같습니다.

-

Option Time:number?

-
-

트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면 1이 사용됩니다.

-
-
-

Option Easing:string|(index:number)->number?

-
-

트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나, Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면 Exp2가 사용됩니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option Direction:string?

-
-

트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나, Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면 Out이 사용됩니다. -

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요

-
-
-

Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

-
-

선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며, "*" 를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.

-
-
-

Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 "*" 를 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

-
-

CallBack 에 1을 넣은것과 동일한 효과를 가지는 별칭입니다

-
-
-

Option Getter:(Item:any, Property:string)->any?

-
-

선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
-
-

Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

-
-

선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.

-
-Warning -

register:Tween() 와 호환되지 않습니다.

-
-
-
-

트윈 함수

-

Quad 의 트윈에는 트윈을 멈추거나 트윈중인지 확인하는 등의 작업을 할 수 있는 여러 함수들이 제공됩니다.
-Tween 안의 모든 함수와 값들은 다음과 같습니다.

-

Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

-
-

트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -Ended, OnStepped, Setter, Getter 값이 설정되면 Option 안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록 TweenHandler 가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. -

1
-2
-3
-4
-5
Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

-
-

Tween.RunTween 와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
-

1
-2
-3
-4
-5
Tween.RunTween({myFrame1, myFrame2, myFrame3},{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-

-
-
-

Tween.StopTween(ItemOrHandler:TweenHandler|any)

-
-

트윈을 멈춥니다. TweenHandler 또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.

-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(Handler)
-
-
-
-
1
-2
-3
-4
-5
-6
-7
local Handler = Tween.RunTween(myFrame,{
-    Time = 1;
-},{
-    Position = UDim2.new(1,0,1,0);
-})
-
-Tween.StopTween(myFrame)
-
-
-
-
-
-
-

Tween.StopPropertyTween(Item:any, PropertyName:string)

-
-

오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

-
-

해당 오브젝트 또는 TweenHandler 로 트윈이 진행중인지 여부를 판단합니다.

-
-
-

Tween.IsPropertyTweening(Item:any, PropertyName:string)

-
-

해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다. TweenHandler 는 사용할 수 없습니다.

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
type Easing =
-    "Linear" // 아무런 가감속이 없는 1차형
-    |"Quint" // 5 제곱
-    |"Quart" // 네제곱
-    |"Cubic" // 세제곱
-    |"Quad" // 제곱
-    |"Sin" // 사인 파형
-    |"Circle" // 사분원
-    |"Expo" // 지수형
-    |"Elastic" // 탄성
-    |"Bounce" // 튀어오름
-    |"Back" // 뒤로 가감속
-    |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2
-    |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4
-    |EasingFunction?;
-
-그래프와 미리보기는 Easings 에서 확인할 수 있습니다

-
-
-

Tween.Easings: { [string]: EasingFunction }

-
-

이징 함수들이 담겨있습니다.
-

1
-2
-3
-4
-5
-6
-7
type Direction =
-    // 초반에 가속이 이루워지며, 후반에 느려집니다.
-    "Out"
-    // 초반에는 느리며, 점점 가속이 늘어납니다.
-    |"In"
-    //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
-    |"InOut"
-
-자세한 정보는 Easings 에서 확인할 수 있습니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/7_quadProperty/index.html b/docs/kr/tutorial/7_quadProperty/index.html deleted file mode 100644 index 607f72c..0000000 --- a/docs/kr/tutorial/7_quadProperty/index.html +++ /dev/null @@ -1,1300 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - QuadProperty - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

QuadProperty - 특수 프로퍼티

-
-주의사항 -

특수 프로퍼티는 Tween 이 지원되지 않습니다. 그러나 register:Tween()의 경우 호환되므로, 특수 프로퍼티 값을 트윈하려면 향후 설명되는 register 와 함깨 사용해야합니다.

-
-

Tween.RunTween, Tween.RunTweens 와는 같이 사용할 수 없습니다.

-
-
-
-

특수한 프로퍼티

-

Quad 에서는 편리성을 위해 일부 특수 프로퍼티를 사용할 수 있습니다.
-이 모든 특수 프로퍼티는 향후 소개되는 register와 함깨 사용할 수 있습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local ImageFrame = Class "ImageFrame"
-ImageFrame.BackgroundTransparency = 1
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(200,200);
-    PaddingAllOffset = 50; -- Padding 을 50 씩 모든 방향으로 줍니다
-    BackgroundColor3 = Color3.fromRGB(40,40,40);
-    ImageFrame {
-        ImageColor3 = Color3.fromRGB(60,60,60);
-        RoundSize = 16; -- 이미지로 라운드 프레임을 만듭니다
-        Size = UDim2.fromScale(1,1);
-        ImageFrame {
-            BackgroundColor3 = Color3.fromRGB(80,80,80);
-        };
-    };
-}
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-

사용할 수 있는 프로퍼티는 다음과 같습니다.

-

RoundSize:number?

-
-

ImageLabel, ImageButton 에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로 UICorner보다 부드러운 코너효과를 제공합니다.

-
-
-

Corner:number?

-
-

모든 로블록스 UI오브젝트에 적용됩니다. UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.

-
-
-

PaddingAll:UDim?

-
-

UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다. PaddingAllOffset 과 함깨 사용할 수 없습니다.

-
-
-

PaddingAllOffset:number?

-
-

UIPadding을 적용합니다. PaddingAll과 같은 방법으로 작동하나, Offset값만 설정할 수 있습니다. PaddingAll 과 함깨 사용할 수 없습니다.

-
-
-

Scale:number?

-
-

UIScale을 적용합니다. UIScale.Scale 과 같은 효과를 나타냅니다

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/8_register/index.html b/docs/kr/tutorial/8_register/index.html deleted file mode 100644 index 0594b53..0000000 --- a/docs/kr/tutorial/8_register/index.html +++ /dev/null @@ -1,1862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Register - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Register - 값 변경 연동

-
-읽기 전... -

모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Store.GetStore 가 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Store.GetStore 는 공유됩니다

-
-
-

레지스터

-

레지스터는 한 값이 변경될 때, 그 값을 사용한 곳이 업데이트 될 수 있도록 만들어주는 Quad 의 주요 기술입니다. 추후 설명될 Class.Extend 와도 같이 사용됩니다.

-

레지스터는 이러한 시나리오에서 사용될 수 있습니다.

-
-
    -
  1. UI 의 여러 오브젝트를 한번에 페이드 아웃 혹은 페이드 인 시키는 경우.
  2. -
  3. 가변 크기의 UI 를 업데이트 시키는 경우.
  4. -
  5. 여러 오브젝트들을 한꺼번에 트윈시키는 경우.
  6. -
  7. 다크테마/화이트테마 변경할 수 있게 만드는 경우.
  8. -
-
-

이외에도 레지스터의 활용 방법은 무궁무진합니다. 레지스터의 사용법은 다음과 같습니다.

-
1
-2
-3
-4
-5
local myStore = Store.GetStore("myStore")
-myStore.color = Color3.fromRGB(255,255,255)
-Frame { BackgroundColor3 = myStore "color" }
--- 연동된 프레임도 업데이트 됩니다
-myStore.color = Color3.fromRGB(0,0,0)
-
-
-주의 -

구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다.

-

1
-2
local myFrame = Frame{}
-Frame.BackgroundColor3 = myStore "color"
-
-위처럼 사용할 수 없습니다.

-
1
-2
-3
-4
local myFrame = Frame{}
-Apply (myFrame) {
-    BackgroundColor3 = myStore "color";
-}
-
-
-
-
    -
  1. 스토어를 생성함.
  2. -
  3. 기본 값을 설정함.
  4. -
  5. 스토어를 호출해 레지스터를 얻어 등록함.
  6. -
-
-

예시 코드로 정확하게 확인해 볼 수 있습니다

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
--- 레지스터를 만들 수 있는 테이블을 만듭니다.
--- 여기에 담아내는 값을 업데이트 하는 경우 레지스터로 연결된
--- 오브젝트들도 같이 업데이트됩니다.
-local myStore = Store.GetStore("myStore")
-local TextLabel = Class "TextLabel"
-
-myStore.Text = "0 초 지남"
-myStore.Color = Color3.fromRGB(255,100,255)
-
-TextLabel "mainLabel" {
-    Size = UDim2.fromOffset(100,200);
-    -- myStore 의 Text 값이 변경됨을 추적하고, Text 값을
-    -- 업데이트 시킵니다.
-    Text = myStore "Text";
-
-    -- 이것은 레지스터를 사용하는것이 아니라 단순히 값만
-    -- 불러와 넣어주는 것입니다. 자동 업데이트가 가능하지 않습니다.
-    BackgroundColor3 = myStore.Color;
-}
-
-Mount(ScreenGUI, Store.GetObject("mainLabel"))
-
--- 바꾸더라도 레지스터를 사용하지 않아 반영되지 않습니다
-myStore.Color = Color3.fromRGB(255,255,255)
-
-local Count = 1
-while task.wait(1) do
-    -- 값을 업데이트 합니다. 텍스트 라벨도
-    -- 자동적으로 업데이트 됩니다.
-    myStore.Text = Count .. " 초 지남"
-    Count = Count + 1
-end
-
-
-

레지스터 메소드

-

레지스터에는 여러가지 메소드가 담겨있습니다. 이 메소드를 사용하면 레지스터를 보다 더 다양하게 활용할 수 있습니다.

-

register 특수 메소드가 적용되는 순서는 다음과 같습니다.

-

:Add(value:any)->register

-
-

값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다.
-number, Udim, UDim2, Color3, Vector2 등 더할 수 있는 모든것을 사용할 수 있습니다
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-myStore.pos = UDim2.fromOffset(100,0)
-
-Frame "mainFrame" {
-    Position = myStore "pos":Add(UDim2.fromOffset(0,100));
-}
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-while true do
-    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)
-    task.wait(2)
-end
-

-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:With((store:valueStore, newValue:any, key:string)->())->register

-
-

함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다.
-첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다

-
-
-
-
1
-2
-3
myStore "size":With(function (_,value)
-    return value * 2
-end)
-
-
-
-

width 값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-myStore.topbarSize = 60
-myStore.width = 200
-
--- 레지스터를 변수로 두고 사용합니다
-local listItemSize = myStore "width":With(function()
-    return UDim2.fromOffset(myStore.width,60)
-end)
-
-Frame "mainFrame" {
-    Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder };
-
-    -- 사이즈가 width 에 맞게 업데이트됩니다
-    Size = myStore "width":With(function ()
-        return UDim.fromOffset(store.width,400)
-    end);
-
-    Frame "Topbar" {
-        LayoutOrder = 1;
-        BackgroundColor3 = Color3.fromRGB(255,0,0);
-        -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을
-        -- 만들 수 있습니다.
-        Size = myStore "topbarSize,width":With(function()
-            return UDim2.fromOffset(myStore.width,myStore.topbarSize)
-        end);
-    }
-    Frame "ListItem" {
-        LayoutOrder = 2;
-        BackgroundColor3 = Color3.fromRGB(0,255,0);
-        Size = listItemSize;
-    };
-    Frame "ListItem" {
-        LayoutOrder = 3;
-        BackgroundColor3 = Color3.fromRGB(0,0,255);
-        Size = listItemSize;
-    };
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
--- width 값을 변경해보세요
-while true do
-    myStore.width = myStore.width + 10
-    task.wait(1)
-end
-
-
-
-

colors 테이블 안에 있는 색깔들을 돌아가며 보여줍니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-local colors = {
-    Color3.fromRGB(255,255,255);
-    Color3.fromRGB(255,255,0);
-    Color3.fromRGB(0,255,255);
-    Color3.fromRGB(255,0,255);
-    Color3.fromRGB(255,0,0);
-    Color3.fromRGB(0,255,0);
-    Color3.fromRGB(0,0,255);
-}
-myStore.color = 1
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(200,200);
-    -- colors 에서 인덱싱해 값을 가져옵니다
-    BackgroundColor3 = myStore "color":With(colors);
-}
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
--- 인덱스를 순회합니다
-while task.wait(1) do
-    myStore.color = (i-1)%(#colors)+2
-end
-
-
-
-
-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:Tween(options:TweenOptions)->register

-
-

트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다.

-
-
-
-
1
-2
-- Tween 옵션을 넣을 수 있습니다
-myStore "size":Tween{ Time = 2 }
-
-
-
-

프레임을 한꺼번에 움직입니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-local Style = Quad.Style
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-myStore.pos = UDim2.fromOffset(50,0)
-Style "TweenFrame" {
-    Size = UDim2.fromOffset(50,50);
-    BackgroundColor3 = Color3.fromRGB(255,100,255);
-}
-
-Frame "mainFrame" {
-    BackgroundColor3 = Color3.fromRGB(255,255,255);
-    Size = UDim2.fromOffset(500,500);
-    Frame "TweenFrame" {
-        Position = myStore "pos":Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,100))
-            :Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,200))
-            :Tween{Time = 2};
-    };
-    Frame "TweenFrame" {
-        Position = myStore "pos"
-            :Add(UDim2.fromOffset(0,300))
-            :Tween{Time = 2};
-    }
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-local on = false
-while true do
-    on = not on
-    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)
-    task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다
-    -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다
-end
-
-
-
-
-
-주의 -

구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다

-
-
-
-

:Default(value:any)->register

-
-

기본값을 정합니다. 만약 값이 nil 인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다.
-

 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-- 용법
-local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Class = Quad.Class
-local Mount = Quad.Mount
-
-local Frame = Class "Frame"
-local myStore = Store.GetStore("myStore")
-
-Frame "mainFrame" {
-    Size = UDim2.fromOffset(200,200);
-    -- color 값이 없으므로 Default 안의 값이 사용됩니다.
-    BackgroundColor3 = myStore "color"
-        :Default(Color3.fromRGB(255,0,0));
-}
-
-Mount(ScreenGUI, Store.GetObject("mainFrame"))
-
-task.wait(5)
-myStore.color = Color3.fromRGB(0,255,0)
-

-
-주의 -
    -
  • 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다.
  • -
  • 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다.
  • -
-
-
-
-

:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

-
-

레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다

-

newValue 에는 :Add, :With, :Tween, :Default 가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다

-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
-9
myStore.test = 1
--- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다
--- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다
--- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다
-local func = myStore "test":Register(function(_,newValue)
-    -- 값 변경시 출력됩니다
-    print(newValue)
-end)
-myStore.test = 2
-
-
-
-

myStore.test1, myStore.test2 가 변화하면 print 함수를 실행합니다.

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-
-local myStore = Store.GetStore("myStore")
-
-myStore.test1 = 1
-myStore.test2 = "Hello"
-
-local func = myStore "test1,test2":Register(function()
-    print(myStore.test1,myStore.test2)
-end)
-
-myStore.test1 = 2
-
-
-
-
-
-주의 -

Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다.

-
-
-
-

:Observe((newValue:any)->())

-
-

:Register의 간소화 버전입니다. :Register와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는 newValue 하나만 주어집니다.

-

newValue:Add, :With, :Tween, :Default 가 계산된 상태로 제공됩니다.

-
-
-
-
1
-2
-3
-4
-5
-6
myStore.test = 1
-myStore "test":Add(1):Observe(function(_,newValue)
-    -- 값 변경시 출력됩니다
-    print(newValue)
-end)
-myStore.test = 2
-
-
-
-
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/9_lang/index.html b/docs/kr/tutorial/9_lang/index.html deleted file mode 100644 index d7628eb..0000000 --- a/docs/kr/tutorial/9_lang/index.html +++ /dev/null @@ -1,1426 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lang - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Lang - 언어관리

-
-읽기 전... -

모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Lang 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Lang 은 공유됩니다

-
-
-

언어관리

-

Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되어 있습니다. 이 기능은 register 와 연동해 적은 줄의 코드로 변하는 텍스트도 언어에 맞게 출력되도록 만들 수 있습니다.

-

번역 테이블은 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) 다음을 이용해 만들 수 있으며.
-Lang(LangName:string)(options)->register 로 UI 에 적용시킬 수 있습니다.

-

Lang.Locales.Default 는 일치하는 언어가 없을때 보여줄 언어입니다. 일반적으로 영어를 추천합니다.

-
-
-
-
자세한 설명은 예제를 참고하세요
1
-2
-3
-4
-5
-6
-7
-8
-9
Lang.New("Test",{
-    [Lang.Locales.Korean] = "{won} 원";
-    [Lang.Locales.Default] = "{won} Won";
-})
-TextLabel {
-    Lang "Test" {
-        won = 100;
-    };
-}
-
-
-
-
1초가 지날 때 마다 카운트를 증가합니다. 영어 사용자에겐 영어를, 한국어 사용자에겐 한국어를 보여줍니다.
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
local ScreenGUI = script.Parent
-local Quad = require(path.to.module).Init()
-local Store = Quad.Store
-local Mount = Quad.Mount
-local Event = Quad.Event
-local Lang = Quad.Lang
-local Class = Quad.Class
-
-local TextButton = Class "TextButton"
-
-local myStore = Store.GetStore("myStore")
-myStore.count = 0
-
-Lang.New("TimePassed",{
-    [Lang.Locales.Korean] = "{count}초 지났어요";
-    [Lang.Locales.Default] = function (options)
-        -- 함수 또한 등록할 수 있습니다.
-        if options.count > 1 then
-            return ("%d seconds passed"):format(options.count)
-        else
-            return ("%d second passed"):format(options.count)
-        end
-    end;
-})
-
-TextButton "mainButton" {
-    Size = UDim2.fromOffset(100,100);
-    Text = Lang "TimePassed" {
-        -- count = 1 일반적인 값도 사용가능합니다
-        count = myStore "count";
-    };
-    [Event "MouseButton1Click"] = function()
-        -- 클릭시 언어가 변경됩니다
-        if Lang.CurrentLocale == Lang.Locales.Default then
-            Lang.CurrentLocale = Lang.Locales.Korean
-        else
-            Lang.CurrentLocale = Lang.Locales.Default
-        end
-    end
-}
-Mount(ScreenGUIk,Store.GetObject("mainButton"))
-
-while task.wait(1) do
-    myStore.count = myStore.count + 1
-end
-
-
-
-
-
-주의 -

구현의 복잡성의 이유로 Lang 은 레지스터와 같은 제약을 가집니다 (오브젝트 생성시에만 등록할 수 있습니다)

-

1
-2
-3
local myLabel = TextLabel{}
-Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" })
-myLabel.Text = Lang "Test" { lang = 1 }
-
-위처럼 사용할 수 없습니다.

-

대신에 :Register 문법을 사용하여 등록할 수 있습니다.

-
1
-2
-3
-4
-5
local myLabel = TextLabel{}
-Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" })
-Apply (myLabel) {
-    Text = Lang "Test" { lang = 1 };
-}
-
-
-
-

Locale 목록

-

로케일 값들은 Lang.Locales에서 가져올 수 있으며, 사용가능한 로케일 목록은 다음과 같습니다.

-
-

Default (default)
-English (en-us)
-Spanish (es-es)
-French (fr-fr)
-Indonesian (id-id)
-Italian (it-it)
-Japanese (ja-jp)
-Korean (ko-kr)
-Russian (ru-ru)
-Thai (th-th)
-Turkish (tr-tr)
-Vietnamese (vi-vn)
-Portuguese (pt-br)
-German (de-de)
-ChineseSimplified (zh-cn)
-ChineseTraditional (zh-tw)
-Bulgarian (bg-bg)
-Bengali (bn-bd)
-Czech (cs-cz)
-Danish (da-dk)
-Greek (el-gr)
-Estonian (et-ee)
-Finnish (fi-fi)
-Hindi (hi-in)
-Croatian (hr-hr)
-Hungarian (hu-hu)
-Georgian (ka-ge)
-Kazakh (kk-kz)
-Khmer (km-kh)
-Lithuanian (lt-lt)
-Latvian (lv-lv)
-Malay (ms-my)
-Burmese (my-mm)
-Bokmal (nb-no)
-Dutch (nl-nl)
-Filipino (fil-ph)
-Polish (pl-pl)
-Romanian (ro-ro)
-Ukrainian (uk-ua)
-Sinhala (si-lk)
-Slovak (sk-sk)
-Slovenian (sl-sl)
-Albanian (sq-al)
-Bosnian (bs-ba)
-Serbian (sr-rs)
-Swedish (sv-se)
-Arabic (ar-001)

-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/kr/tutorial/index.html b/docs/kr/tutorial/index.html deleted file mode 100644 index 75c7750..0000000 --- a/docs/kr/tutorial/index.html +++ /dev/null @@ -1,1370 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Getting Started - Quad 한국어 문서 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Getting Started

-
-

실험적인 모듈

-

이 모듈은 업데이트가 빈번합니다! 항상 Github 를 확인해주세요!

-
-
-

머리말

-

이 페이지는 Quad 모듈을 쉽게 시작할 수 있도록 튜토리얼을 제공하고 있습니다. 이 페이지를 정독해 Quad 모듈의 전반적인 사용법을 파악해보세요!

-

변경 사항은 여기에서 확인할 수 있습니다.

-
-

설치

-

3가지 방법중 가장 편한 방법을 선택해 모듈을 설치해주세요.

-

드레그 엔 드롭 / rbxmx 파일

-

드레그해 스튜디오에 넣을 수 있는 모듈 파일입니다.

-

RBXMX 다운로드

-

다운로드해 스튜디오에 옮겨주세요.

-

git clone

-

rojo 를 사용해 빌드하는 방법을 사용할 수 있다면 Quad 를 직접 빌드할 수 있습니다.

-
1
-2
-3
git clone https://github.com/qwreey75/Quad Quad
-cd Quad
-make build
-
-

윈도우의 경우 make build 대신 rojo build default.project.json -o output.rbxmx 를 입력해 주어야 합니다.

-

git submodule

-

프로젝트가 rojo 를 사용하고 git 을 사용하는 경우 submodule 로 추가할 수 있습니다.

-
1
-2
-3
-4
# 이미 submodule 을 사용하고 있는 경우 입력할 필요가 없습니다
-git submodule init
-# 서브모듈의 루트는 직접 정해주세요
-git submodule add https://github.com/qwreey75/Quad Quad
-
-
-

모듈 불러오기/초기화

-
1
local Quad = require(path.to.module).Init()
-
-

모듈을 셋업하기 위해서는 .Init(QuadId:string?) 을 이용합니다. 일반적으로 QuadId 값은 필요하지 않지만, 나중에 소개할 Store 와 같은 일부 기능들이 QuadId:string 에 영향받기도 합니다.

-

.Init(QuadId:string) 함수는 QuadId 가 같은 불러오기가 이미 있었던 경우, 초기화 하지 않고 불러왔던것을 반환합니다.
-따라서 모듈들 끼리 QuadId 가 같은 경우 Store 같은것들이 공유됩니다.

-

QuadId 가 비워진 경우 한번도 생성된 적 없는 새로운 Quad 가 생성됩니다

-
1
-2
local Quad = require(path.to.module).Init()
-local Class = Quad.Class
-
-

불러오기가 끝났다면 이제 Quad 의 자원들을 이용할 수 있습니다!
-다음 페이지로 넘어가 어서 활용해 봅시다

-
-

추가적 환경 설정

-

타입 불러오기

-

기본적으로 Quad 는 로드시 타입 같이 반환하지만. 직접적으로 타입을 지정하고 싶은 경우 types.lua 를 불러올 수 있습니다

-
1
-2
local types = require(path.to.module.types)
-local Quad = (require(path.to.module)::types.module).Init()
-
-
-

테스트 환경 준비

-

테스트 환경은 rojo 와의 개발통합을 위해 Play 버튼을 누르지 않고 미리보기를 사용할 수 있도록 만들어줍니다
-이를 통해 다른 코드 방식의 UI 프레임 워크보다 빠른 개발속도를 달성할 수 있습니다

-

편의상을 위해 자동 리로드를 설정해 줄 수 있습니다.

-
-주의 -

rojo 환경이 아니라면 자동 리로드는 랙을 동반할 수 있습니다

-
-

일반적으로, 로컬 편집 환경에서 로블록스의 script editor 는 한글자 한글자 변경시 마다 .Source 를 업데이트합니다. 이는 한글자 한글자 타이핑 시 마다 UI 가 업데이트 될 수 있음을 의미합니다. Quad 의 tracker 모듈은 순간적으로 많은양의 리로드가 발생하지 않도록 적절한 쿨타임과 시간분배를 가지고 있지만, 이 경우에도 Ctrl+S 를 눌러 저장해야 적용되는 vscode 와 같은 타 편집기와는 차이가 날 수 있습니다. 코드가 커짐으로 인해 자동 리로드에서 퍼포먼스적 이슈를 겪는다면, rojo 를 활용해 코드를 외부로 옮긴 후, vscode 를 스튜디오 위에 놓고 미리보기와 코드를 동시에 보면서 편집하세요.
-프로젝트가 매우 거대하지 않다면 크게 걱정하지 않아도 됩니다.

-
-
-

다음과 같은 코드트리를 만들어주세요.

-
1
-2
-3
 | Main (ModuleScript)
- |-- Loader (LocalScript)
- |-- Test (ModuleScript)
-
-
-
-
-
실제로 UI 들을 그리는 코드들이 담깁니다.
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
local Quad = require(path.to.module).Init()
-local IsTestMode = script.Name:match("_TESTING") -- 테스트모드 여부
-local LocalPlayer = game.Players.LocalPlayer
-local ScreenGUI = Instance.new("ScreenGui",
-    LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui)
-ScreenGUI.Name = "MyGUI"
-ScreenGUI.ResetOnSpawn = false
-
--- 실제 그리는 코드들이 들어갑니다.
-
-return function()
-    -- 테스트가 끝나 만든걸 지워야 할 때 사용됩니다.
-    -- 추후 설명될 Unmount() 를 이용하세요.
-    ScreenGUI:Destroy()
-end
-
-
-
-
게임을 플레이 할 때 코드가 로드될 수 있도록 만드는 로더입니다.
1
require(script.Parent)
-
-
-
-
명령창에서 명령어 입력으로 테스트를 실행 할 수 있도록 만드는 코드들이 담깁니다.
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-- 모듈 위치로 알맞게 변경해주세요
-local Quad = path.to.module
-local tracker = require(Quad.tracker)
-
-local module = {}
-local function reload()
-    if module.unload then pcall(module.unload) end
-    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end
-    module.testingModule = script.Parent:Clone()
-    module.testingModule.Parent = script.Parent.Parent
-    module.testingModule.Archivable = false
-    module.testingModule.Name = module.testingModule.Name .. "_TESTING"
-    module.unload = require(module.testingModule)
-end
-
--- 자동 리로드를 켭니다. 이미 켜져있으면 다시 로드합니다
-function module.load()
-    reload()
-    if not module.autoreload then
-        module.autoreload = tracker.new(script.Parent)
-        module.autoreload:init(); wait()
-        module.autoreload:connect("updated",reload)
-    end
-end
-
--- 자동 리로드를 끄고 테스트로 생긴것을 지웁니다
-function module.unload()
-    if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end
-    if module.unload then pcall(module.unload) end
-    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end
-    module.autoreload = nil
-    module.unload = nil
-    module.testingModule = nil
-end
-
-return module
-
-
-
-
-

이제 명령어 창에서 자동 리로드를 켜거나 끌 수 있습니다. rojo 나 편집기로 인해 코드가 변경되면 자동으로 업데이트됩니다!

-
1
require(path.to.your.module).load()
-
- - - - - - -
-
- - -
- - - -
- - - -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/md/en/index.md b/md/en/index.md deleted file mode 100644 index c771ecf..0000000 --- a/md/en/index.md +++ /dev/null @@ -1,6 +0,0 @@ - -# Please waitting... - -English docment is still writing. -You can see docment in korean too! - diff --git a/md/kr/assets/EasingStyles.jpg b/md/kr/assets/EasingStyles.jpg deleted file mode 100644 index ae1a3ef..0000000 Binary files a/md/kr/assets/EasingStyles.jpg and /dev/null differ diff --git a/md/kr/assets/LUAICON_DARK.png b/md/kr/assets/LUAICON_DARK.png deleted file mode 100644 index 408718d..0000000 Binary files a/md/kr/assets/LUAICON_DARK.png and /dev/null differ diff --git a/md/kr/assets/LUAICON_TP.png b/md/kr/assets/LUAICON_TP.png deleted file mode 100644 index 804a60e..0000000 Binary files a/md/kr/assets/LUAICON_TP.png and /dev/null differ diff --git a/md/kr/assets/Quad_Logo.png b/md/kr/assets/Quad_Logo.png deleted file mode 100644 index 852903e..0000000 Binary files a/md/kr/assets/Quad_Logo.png and /dev/null differ diff --git a/md/kr/assets/Quad_MiniLogo.png b/md/kr/assets/Quad_MiniLogo.png deleted file mode 100644 index 06d7abc..0000000 Binary files a/md/kr/assets/Quad_MiniLogo.png and /dev/null differ diff --git a/md/kr/assets/Quad_MiniLogoWhite.png b/md/kr/assets/Quad_MiniLogoWhite.png deleted file mode 100644 index af58237..0000000 Binary files a/md/kr/assets/Quad_MiniLogoWhite.png and /dev/null differ diff --git a/md/kr/assets/Quad_MiniLogoWhite.svg b/md/kr/assets/Quad_MiniLogoWhite.svg deleted file mode 100644 index 6c4dd51..0000000 --- a/md/kr/assets/Quad_MiniLogoWhite.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/md/kr/assets/easingVideo.mp4 b/md/kr/assets/easingVideo.mp4 deleted file mode 100644 index a141906..0000000 Binary files a/md/kr/assets/easingVideo.mp4 and /dev/null differ diff --git a/md/kr/assets/extra.css b/md/kr/assets/extra.css deleted file mode 100644 index 1b0023f..0000000 --- a/md/kr/assets/extra.css +++ /dev/null @@ -1,231 +0,0 @@ -/*D2Coding 폰트 불러오기*/ -@font-face { - font-family: "KawaiiMonoRegular"; - src:url("../assets/fonts/KawaiiMonoRegular.woff2") format("woff2"); - font-style: normal; - font-weight: normal; -} - -/*전체 폰트*/ -body, input { - font-family: KawaiiMonoRegular; -} -/*코드창 폰트*/ -code { - font-family: KawaiiMonoRegular; -} - -/*svg 글자 선택 불가능하도록 설정*/ -svg text { - pointer-events: none; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -khtml-user-select:none; - -o-user-select:none; - user-select: none; -} -/*메크로 변수 리스트 배경 색깔 지정*/ -table.pretty { - background-color: #262929 !important; -} - -/*메뉴 열면 배경 블러효과 주기*/ -.md-overlay { - background-color: rgba(0, 0, 0, 0.2) !important; - backdrop-filter: blur(3px); - -webkit-backdrop-filter: blur(3px); -} - -/* 검색 열면 배경 블러효과 주기 */ -@media screen and (min-width: 60em) { - .md-search__overlay { - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - } -} - -/* 디테일 안에 글자크기 */ -.md-typeset details { - font-size: .72rem !important; -} - -/*테이블 해더 꾸미기*/ -th { - /*최소 길이*/ - /* min-width: 5.8em !important; */ - /*글자 색깔*/ - /* color: rgb(255 255 255) !important; */ - /*배경 색깔*/ - /* background-color: rgb(26 27 31) !important; */ - /*라인*/ - /* border-bottom: .05em solid var(--md-accent-fg-color) !important; */ - /*주변 남기는 공간 (상하 / 좌우)*/ - /* padding: .85em 0.8em !important; */ -} -/*테이블 아이템 꾸미기*/ -td { - /*배경 색깔*/ - /* background-color: rgb(47 49 60) !important; */ - /*주변 남기는 공간 (상하 / 좌우)*/ - /* padding: .7em 0.8em !important; */ -} - -/*테이블 아이템 크기 (좌우)*/ -/* #table-em5 { - width: 5em !important; - min-width: 5em !important; -} -#table-em4 { - width: 4em !important; - min-width: 4em !important; -} -#table-em3 { - width: 3em !important; - min-width: 3em !important; -} -#table-em2 { - width: 2em !important; - min-width: 2em !important; -} -#table-em1 { - width: 1em !important; - min-width: 1em !important; -} -#table-custom { - min-width: 0em !important; -} */ - -/*테마 설정*/ -[data-md-color-scheme="darker"] { - /*글자 색깔*/ - --md-default-fg-color: rgb(225, 215, 225); - --md-default-fg-color--light: rgb(235, 215, 252); - --md-default-fg-color--lighter: rgb(105, 105, 105); - --md-default-fg-color--lightest: rgb(70, 70, 70); - - /* 마커 */ - --md-typeset-mark-color: hsl(271, 81%, 46%) !important; - - /*배경 색깔*/ - --md-default-bg-color: rgb(28, 25, 39); - --md-default-bg-color--light: hsla(259, 15%, 21%, 0.54); - --md-default-bg-color--lighter: hsla(259, 15%, 21%, 0.26); - --md-default-bg-color--lightest: hsla(259, 15%, 21%, 0.07); - - /*하이라이팅 색깔 (탑바, 링크)*/ - --md-primary-fg-color: hsl(268, 100%, 53%); - --md-primary-fg-color--light: hsl(271, 100%, 77%); - --md-primary-fg-color--dark :hsl(271, 82%, 72%); - --md-primary-bg-color: #f9e1ff; - --md-primary-bg-color--light: #f1d2ff; - - /*기타 (링크 마우스 온, 탭 컬러)*/ - --md-accent-fg-color: #bd78f5; - --md-accent-fg-color--transparent: hsla(0, 0%, 0%, 0.1); - --md-accent-bg-color: hsla(0, 0%, 100%, 1); - --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); - - /*모르겠음*/ - --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-primary-fg-color--light); - --md-typeset-del-color: hsla(6, 90%, 60%, 0.15); /*내용 비교 하이라이터 : 지움*/ - --md-typeset-ins-color: hsla(150, 90%, 44%, 0.15); /*내용 비교 하이라이터 : 만듬*/ - --md-typeset-kbd-color: hsla(232, 15%, 94%, 0.12); - --md-typeset-kbd-accent-color: hsla(232, 15%, 94%, 0.2); - --md-typeset-kbd-border-color: hsla(232, 15%, 14%, 1); - --md-admonition-fg-color: var(--md-default-fg-color); - --md-admonition-bg-color: hsla(232, 0%, 100%, 0.025); - - /* Footer */ - --md-footer-fg-color: hsla(0, 0%, 100%, 1); - --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); - --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); - --md-footer-bg-color: hsla(232, 15%, 12%, 0.87); - --md-footer-bg-color--dark: hsla(232, 15%, 10%, 1); - - /*Code block , Code highlighting*/ - --md-code-fg-color: rgb(249, 235, 255); /*일반 텍스트*/ - --md-code-bg-color: rgb(38, 31, 51); /*배경*/ - --md-code-hl-color: hsla(218, 100%, 63%, 0.15); /*수직선(왼쪽 숫자 옆)*/ - --md-code-hl-number-color:#f0b680; /*숫자*/ - --md-code-hl-special-color: #d17eeb; - --md-code-hl-function-color: #7db9eb; /*함수명 색깔*/ - --md-code-hl-constant-color: #50A8B3; /*내장함수 색깔*/ - --md-code-hl-keyword-color:#C577DC; /*local, function, do, for ...*/ - --md-code-hl-string-color: #98C279; /*문자열*/ - --md-code-hl-name-color: var(--md-code-fg-color); /*변수명 색깔*/ - --md-code-hl-operator-color: #50A8B3; /*연산자( = < > ^ * - + ) 색깔*/ - --md-code-hl-punctuation-color: #A9B0BD; /*구두점 문자 ( ) , ;*/ - --md-code-hl-comment-color: #5B626F; /*주석 색깔*/ - --md-code-hl-generic-color: var(--md-default-fg-color--light); - --md-code-hl-variable-color: var(--md-default-fg-color--light); -} - -/*테마 설정*/ -[data-md-color-scheme="dark"] { - /*글자 색깔*/ - --md-default-fg-color: rgb(225, 215, 225); - --md-default-fg-color--light: rgb(235, 215, 252); - --md-default-fg-color--lighter: rgb(105, 105, 105); - --md-default-fg-color--lightest: rgb(70, 70, 70); - - /* 마커 */ - --md-typeset-mark-color: hsl(271, 81%, 46%) !important; - - /*배경 색깔*/ - --md-default-bg-color: rgb(41, 43, 54); - --md-default-bg-color--light: hsla(232, 15%, 21%, 0.54); - --md-default-bg-color--lighter: hsla(232, 15%, 21%, 0.26); - --md-default-bg-color--lightest: hsla(232, 15%, 21%, 0.07); - - /*하이라이팅 색깔 (탑바, 링크)*/ - --md-primary-fg-color: hsl(268, 100%, 53%); - --md-primary-fg-color--light: hsl(271, 100%, 77%); - --md-primary-fg-color--dark :hsl(271, 82%, 72%); - --md-primary-bg-color: #f9e1ff; - --md-primary-bg-color--light: #f1d2ff; - - /*기타 (링크 마우스 온, 탭 컬러)*/ - --md-accent-fg-color: #bd78f5; - --md-accent-fg-color--transparent: hsla(0, 0%, 0%, 0.1); - --md-accent-bg-color: hsla(0, 0%, 100%, 1); - --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); - - /*모르겠음*/ - --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-primary-fg-color--light); - --md-typeset-mark-color: hsla(218, 100%, 63%, 0.3); /*마커로 마킹함*/ - --md-typeset-del-color: hsla(6, 90%, 60%, 0.15); /*내용 비교 하이라이터 : 지움*/ - --md-typeset-ins-color: hsla(150, 90%, 44%, 0.15); /*내용 비교 하이라이터 : 만듬*/ - --md-typeset-kbd-color: hsla(232, 15%, 94%, 0.12); - --md-typeset-kbd-accent-color: hsla(232, 15%, 94%, 0.2); - --md-typeset-kbd-border-color: hsla(232, 15%, 14%, 1); - --md-admonition-fg-color: var(--md-default-fg-color); - --md-admonition-bg-color: hsla(232, 0%, 100%, 0.025); - - /* Footer */ - --md-footer-fg-color: hsla(0, 0%, 100%, 1); - --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); - --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); - --md-footer-bg-color: hsla(232, 15%, 12%, 0.87); - --md-footer-bg-color--dark: hsla(232, 15%, 10%, 1); - - /*Code block , Code highlighting*/ - --md-code-fg-color: hsla(232, 18%, 86%, 1); /*일반 텍스트*/ - --md-code-bg-color: hsla(232, 15%, 15%, 1); /*배경*/ - --md-code-hl-color: hsla(218, 100%, 63%, 0.15); /*수직선(왼쪽 숫자 옆)*/ - --md-code-hl-number-color:#f0b680; /*숫자*/ - --md-code-hl-special-color: #d17eeb; - --md-code-hl-function-color: #7db9eb; /*함수명 색깔*/ - --md-code-hl-constant-color: #50A8B3; /*내장함수 색깔*/ - --md-code-hl-keyword-color:#C577DC; /*local, function, do, for ...*/ - --md-code-hl-string-color: #98C279; /*문자열*/ - --md-code-hl-name-color: var(--md-code-fg-color); /*변수명 색깔*/ - --md-code-hl-operator-color: #50A8B3; /*연산자( = < > ^ * - + ) 색깔*/ - --md-code-hl-punctuation-color: #A9B0BD; /*구두점 문자 ( ) , ;*/ - --md-code-hl-comment-color: #5B626F; /*주석 색깔*/ - --md-code-hl-generic-color: var(--md-default-fg-color--light); - --md-code-hl-variable-color: var(--md-default-fg-color--light); -} diff --git a/md/kr/assets/fonts/KawaiiMonoRegular.woff2 b/md/kr/assets/fonts/KawaiiMonoRegular.woff2 deleted file mode 100644 index 3386bd9..0000000 Binary files a/md/kr/assets/fonts/KawaiiMonoRegular.woff2 and /dev/null differ diff --git a/md/kr/assets/fonts/gmarketsansmedium.otf b/md/kr/assets/fonts/gmarketsansmedium.otf deleted file mode 100644 index af2cfc3..0000000 Binary files a/md/kr/assets/fonts/gmarketsansmedium.otf and /dev/null differ diff --git a/md/kr/changelogs.md b/md/kr/changelogs.md deleted file mode 100644 index 7a3fbca..0000000 --- a/md/kr/changelogs.md +++ /dev/null @@ -1,64 +0,0 @@ - -# 버전 번경사항 - -## 2.25 -실험적 API 로써 GetChildren() 과 ChildAdded::Bindable 이 추가되었습니다. - -## 2.24 -모든 문서가 정리되었습니다. - -## 2.23 -객체 생성시 일어나는 오류를 해결했습니다. -이제 Extend 객체 내부 자식이 Unmount 되는 경우 __child 에서 제거됩니다. -types 의 오타를 고쳤습니다. - -## 2.22 -더이상 Event.Prop 가 처음 생성시 실행되는 일이 일어나지 않습니다. - -## 2.21 -Linker 가 이제 클래스 안 클래스에서 사용될 수 있도록 변경되었습니다. - -## 2.20 -Docments 가 업데이트되었습니다. 많은양의 새로운 튜토리얼이 제공됩니다. -Mkdocs 테마와 여러가지 설정이 변경되었습니다. -이제 Makefile 을 통해서 rojo build 와 mkdocs build 를 사용할 수 있습니다. - -## 2.19 -Linker 객체가 추가되었습니다. 이제 GetPropertyChangedSignal 와, self 에 특정 오브젝트 혹은 이벤트를 연결할 수 있습니다 - -## 2.18 -이제 더이상 GC 에 의해 Store 의 Instance 값이 손실되지 않습니다 - -## 2.17 -Tween 의 CallBack 등록 시 주언지는 파라메터가 변경되었습니다. -이제 더이상 ~ 문이 사용되지 않습니다. - -## 2.15 BREAKING CHANGES -이제 Lang 에서 CurrentLocale, FailedMessage 을 변경하면 자동으로 변경사항이 업데이트됩니다. 또한 일부 필드의 네이밍이 변경되었습니다 - -## 2.14 -Lang 모듈이 추가되었습니다. register 를 사용해 사용자 지정 다중언어 지원을 추가할 수 있습니다 - -## 2.13 -Signal 모듈이 추가되었습니다. 이제 Class.Extend 에서 GetPropertyChangedSignal 과 EmitPropertyChangedSignal 를 사용할 수 있습니다 - -## 2.12 -Mount 반환 객체에 Add 를 사용할 수 있도록 Mount 객체가 변경되었습니다 - -## 2.11 -Store.GetObjects 에 이제 & 문법을 사용할 수 있습니다. - -## 2.9 -PreloadAsync 를 통해 이제 round.lua 에서 라운드 이미지를 미리 로드합니다. - -## 2.8 -반환 관련 코드가 exports 로 이주되었으며. init.lua 에서는 자동적으로 types 를 반환합니다. - -## 2.7 -이제 types 를 완전히 지원합니다. 직접 불러와 사용할 수 있습니다 - -## 2.1~2.6 BREAKING CHANGES -모든 모듈의 필드의 이름이 변경되었으며, 모든 클래스들이 기본적으로 대문자 시작 네이밍을 사용하도록 명명규칙을 변경했습니다. - -## 2.0 -버전 판올림, BREAKING CHANGES 를 위해 버전을 판올림 하였습니다. diff --git a/md/kr/gallery.md b/md/kr/gallery.md deleted file mode 100644 index 92ce86b..0000000 --- a/md/kr/gallery.md +++ /dev/null @@ -1,5 +0,0 @@ - -# 갤러리 - -여기는 여러분들의 작품을 올려볼 수 있는 곳입니다! -Quad 를 사용한 여러가지 훌륭한 작품들을 보여주세요! diff --git a/md/kr/include/bindable.md b/md/kr/include/bindable.md deleted file mode 100644 index f9d2050..0000000 --- a/md/kr/include/bindable.md +++ /dev/null @@ -1,34 +0,0 @@ - -`#!ts :Fire(...any)` -> 등록된 연결들을 실행하고, `Wait` 을 풀어줍니다. - ---- - -`#!ts :Wait()->(...any)` -> `Fire` 가 호출될 때 까지 기다립니다. `Fire` 에 사용된 값이 반환됩니다. - ---- - -`#!ts :Connect((...any)->())->Connection` -> `Fire` 가 호출 될 때 함수가 실행되도록 만듭니다. `Fire` 에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록 `Connection` 이 제공됩니다. - ---- - -`#!ts :Once((...any)->())->Connection` -> `Connect` 와 유사하지만, `Fire` 가 한번 호출된 뒤 연결이 끊어집니다/ - ---- - -`#!ts :CheckConnected(func)->boolean` -> 함수가 이미 등록되어 있는지 여부를 반환합니다. - ---- - -`#!ts :DisconnectAll()` -> 모든 연결을 끊습니다. `Wait` 으로 기다리고 있는 곳에는 `nil` 을 반환합니다. - ---- - -`#!ts :Destroy()` -> `#!ts :DisconnectAll()` 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다. -> `id` 가 등록되어 있는경우 저장소에서 파기하게 됩니다. diff --git a/md/kr/include/connection.md b/md/kr/include/connection.md deleted file mode 100644 index 3e51aad..0000000 --- a/md/kr/include/connection.md +++ /dev/null @@ -1,8 +0,0 @@ - -`#!ts :Disconnect()` -> 연결을 끊습니다. `Fire` 가 호출되더라도 `Connect` 혹은 `Once` 에 사용된 함수가 실행되지 않습니다. - ---- - -`#!ts :Destroy()` -> `#!ts :Disconnect()` 의 별칭입니다. diff --git a/md/kr/include/directions.md b/md/kr/include/directions.md deleted file mode 100644 index 4a58718..0000000 --- a/md/kr/include/directions.md +++ /dev/null @@ -1,12 +0,0 @@ -`Out` -초반에 가속이 이루워지며, 후반에 느려집니다. - ---- - -`In` -초반에는 느리며, 점점 가속이 늘어납니다. - ---- - -`InOut` -중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. diff --git a/md/kr/include/disconnecter.md b/md/kr/include/disconnecter.md deleted file mode 100644 index a8e2ce7..0000000 --- a/md/kr/include/disconnecter.md +++ /dev/null @@ -1,14 +0,0 @@ -`#!ts :Add(connection:Connection|RBXScriptConnection)` -> `connection`을 리스트에 추가합니다. 나중에 `:Disconnect`를 호출하면 추가된 연결이 파기됩니다. - ---- - -`#!ts :Disconnect()` -> 추가된 모든 연결에 `Disconnect()` 를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시 `:Add` 를 사용할 수 있습니다 -> Disconnecter 를 완전히 사용하지 못하도록 하려면 `:Destroy` 를 호출하세요 - ---- - -`#!ts :Destroy()` -> `#!ts :Disconnect()` 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다. -> `id` 가 등록되어 있는경우 저장소에서 파기하게 됩니다. diff --git a/md/kr/include/easings.md b/md/kr/include/easings.md deleted file mode 100644 index 0a769a2..0000000 --- a/md/kr/include/easings.md +++ /dev/null @@ -1,75 +0,0 @@ - -=== "미리보기" -
- -
- -=== "그래프 개형" -
- ![함수 개형](/kr/assets/EasingStyles.jpg) -
- -[모든 Easing 은 여기에서 직접적으로 확인할 수 있습니다.](https://easings.net/) - -`Linear` -> 아무런 가감속이 없는 1차형 함수입니다 -> `#!ts i=x, x=0 to 1` - ---- - -`Quint` -> 5 제곱을 이용한 가감속 함수입니다. Quart 보다 가파른 개형을 가졌습니다 -> `#!ts (^5) i=1-(1-x)^5, x=0 to 1` - ---- - -`Quart` -> 네제곱을 이용한 가감속 함수입니다. Cubic 보다 가파른 개형을 가졌습니다 -> `#!ts (^4) i=1-(1-x)^4, x=0 to 1` - ---- - -`Cubic` -> 세제곱을 이용한 가감속 함수입니다. Quad 보다 가파른 개형을 가졌습니다 -> `#!ts (^3) i=1-(1-x)^3, x=0 to 1` - ---- - -`Quad` -> 제곱을 이용한 가감속 함수입니다. -> `#!ts (^2) i=1-(1-x)^2, x=0 to 1` - ---- - -`Expo` -> 지수형 가감속 함수입니다. 매우 가파른 개형을 가졌습니다. -> `#!ts i=1-2^(-10*x), x=0 to 1` - ---- - -`Sin` -> 사인 파형 가감속 함수입니다. -> `#!ts i=sin(x*pi/2), x=0 to 1` - ---- - -`Circle` -> 사분원 가감속 함수입니다. -> `#!ts i=sqrt(1-(1-x)^2), x=0 to 1` - ---- - -`Back` -> 시작시 뒤로 이동이 있는 가감속 함수입니다. - ---- - -`Elastic` -> 탄성을 가지는 가감속 함수입니다. - ---- - -`Bounce` -> 튀어오름을 가지는 가감속 함수입니다. - -TODO: 애니메이션 미리보기 영상 추가 diff --git a/md/kr/include/events.md b/md/kr/include/events.md deleted file mode 100644 index 0947410..0000000 --- a/md/kr/include/events.md +++ /dev/null @@ -1,100 +0,0 @@ -`#!ts Event(name:string)` -
- -모든 로블록스 이벤트들을 나타냅니다, `MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up` 등이 될 수 있습니다 -기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로 `self` 를 받을 수 있습니다. - -=== "용법" - - ```lua - Frame { - [Event "MouseEnter"] = function (self) - print(self.Name .. "에 마우스가 올라왔습니다") - end; - } - ``` - -=== "예제 - 버튼클릭" - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Class = Quad.Class - local Mount = Quad.Mount - local TextButton = Class "TextButton" - - TextButton "mainButton" { - Size = UDim2.fromOffset(200,200); - [Event "MouseEnter"] = function (self) - print("버튼이 클릭되었습니다") - end; - } - Mount(ScreenGUI, Store.GetObject("mainButton")) - ``` - -
- ---- - -`#!ts Event.Created` -
- -오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로 `self` 를 받을 수 있습니다. -```lua --- 용법 -Frame { - [Event.Created] = function (self) - print(self.Name .. "이 생성되었어요") - end; -} -``` - -???+ Warning "주의" - `Event.Created` 가 실행될 때는 `Parent` 값이 정해지지 않았을 수 있습니다. `#!lua self.Parent` 는 접근해서는 안됩니다. `Class.Extend` 에서는 `AfterRender` 를 이용해야 합니다. -
- ---- - -`#!ts Event.CreatedAsync` -
- -`#!ts Event.Created` 와 비슷하지만, 코루틴 안에서 작동합니다. `#!ts objectList:EachAsync()` 처럼 반환을 기다리지 않습니다. -```lua --- 용법 -Frame { - Frame { - Name = "A"; - [Event.CreatedAsync] = function (self) - -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다 - task.wait(5) - end; - }; - Frame { - Name = "B"; - [Event.Created] = function (self) - print(self.Name .. "가 생성되었습니다") - end; - }; -} -``` -???+ Warning "주의" - `Event.CreatedAsync` 가 실행될 때는 `Parent` 값이 정해지지 않았을 수 있습니다. `#!lua self.Parent` 는 접근해서는 안됩니다. -
- ---- - -`#!ts Event.Prop(propertyName:string)` -
- -프로퍼티 값이 변경됨을 연결합니다. -```lua --- 용법 -TextBox { - Text = "아무거나 입력하세요"; - [Event.Prop "Text"] = function (self,text) - -- 편의상의 이유로 변경된 값이 제공됩니다 - print(text) - end; -} -``` -
diff --git a/md/kr/include/extend.md b/md/kr/include/extend.md deleted file mode 100644 index 1df8a1b..0000000 --- a/md/kr/include/extend.md +++ /dev/null @@ -1,370 +0,0 @@ - -`self(name:string)->linker` -> Extend 메소드 전역에서 사용가능합니다. 링커를 만들며, `PropertyChangedSignal` 를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요. - ---- - -==Overwite== ==**REQUIRED**== `#!ts :Render(props:valueStore)` -
- -화면에 그려지는 UI 를 만들어지게 하는 함수입니다. `Extend` 가 그려지려면 무조건 있어야합니다. -이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다. - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Event = Quad.Event -local Mount = Quad.Mount - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - [Event "MouseButton1Click"] = function (self,x,y) - print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y)) - end; - Size = props "Size"; - Text = props "Text"; -- 레지스터를 이용합니다 - } -end - -local myImported = Class(myClass) -myImported.Size = UDim2.fromOffset(200,200) - -local test = myImported { - Text = "wow" -} -Mount(ScreenGUI, test) - --- 텍스트를 업데이트합니다 -while task.wait(1) do - test.Text = "w"..("o"):rep(#test.Text-1).."w" -end -``` - -
- ---- - -==Overwite== ==Option== `#!ts :Init(props:valueStore)` -
- -선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다. - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Init(props) - -- Size 값이 없다면 기본값을 사용하도록 합니다. - props:Default("Size", UDim2.fromOffset(100,100)) - - -- 앞에 _ 를 붇여 내부 변수를 만듭니다. - -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다. - self._asdf = true -end -function myClass:Render(props) - return TextButton { - props "Size" - } -end - -local myImported = Class(myClass) -local myButton = myImported() -- 옵션 없음 -print(myButton.Size) -``` -
- ---- - -==Overwite== ==Option== `#!ts :AfterRender(object:any)` -
- -선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다. - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; -- 자기 자신에 이 버튼을 넣습니다 - } -end -function myClass:AfterRender(object) - print(self._button == object) -- true -end - -local myImported = Class(myClass) -myImported() -- 옵션 없음 -``` -
- ---- - -==Overwite== ==Option== `#!ts :Update()` -
- -`:Render` 와 `:AfterRender` 를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다. -이전의 Render 결과는 제거됩니다 -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:Update() -- update -myButton:Update() -- update -myButton:Update() -- update -``` -
- ---- - -==Overwite== ==Option== `#!ts .Getter.(self)` -
- -값을 얻는데 사용됩니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton {} -end --- 값을 읽는데 사용할 함수를 등록합니다 -function myClass.Getter.Test(self) - return "Hello World" -end - -local myImported = Class(myClass) -print(myImported().Test) -``` -
- ---- - -==Overwite== ==Option== `#!ts .Setter.(self,newValue:any)` -
- -값을 설정하는데 사용됩니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; - Text = "wow"; - } -end --- 값을 지정하는데 사용할 함수를 등록합니다 -function myClass.Setter.Test(self,newValue) - self._button.Text = newValue -end -function myClass.Getter.Test(self) - return self._button.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -print(myButton.Test) -myButton.Test = "Hello World" -print(myButton.Test) -``` -
- ---- - -==Overwite== ==Option== `#!ts .UpdateTriggers. = boolean?` -
- -해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end --- 값 변경시 업데이트 여부를 지정합니다 -myClass.UpdateTriggers.Test = true - -local myImported = Class(myClass) -local myButton = myImported() -myButton.Test = 1 -- update -myButton.Test = 1 -- update -myButton.Test = 1 -- update -``` -
- ---- - -==Overwite== ==Option== `#!ts :Unload(object)` -> :Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다 - ---- - -`#!ts :GetPropertyChangedSignal(propertyName:string)->Bindable` -> 값 변경을 연결할 수 있는 `Bindable`을 반환합니다. `:EmitPropertyChangedSignal` 으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다. - ---- - -`#!ts :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)` -
- -프로퍼티 변경시 `:GetPropertyChangedSignal` 에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로 `#!ts self.a = 1` 과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다. `changedValue` 는 선택사항이며, 주어지지 않으면 `#!ts self[propertyName]`을 반환합니다. -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Evnet = Quad.Event - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_box"; - Text = "test"; - Size = UDim2.fromOffset(200,200); - [Evnet.Prop "Text"] = function (this,newValue) - self:EmitPropertyChangedSignal("Text",newValue) - end; - -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다. - -- self(name:string) 문법으로 변경 이벤트 역시 링크 - -- 할 수 있습니다. - } -end -function myClass.Getter.Text(self) - return self._box.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:GetPropertyChangedSignal("Text"):Connect(function() - print(myButton.Text) -end) -Mount(ScreenGUI, myButton) -``` -
- ---- - -==Event== `#!ts .ChildAdded:Connect((child)->())->Connection` -
- -자식 오브젝트가 추가될 때 발생하는 이벤트입니다. `#!ts :Init` 또는 `#!ts :AfterRender` 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, 추후 `Mount` 를 통해 추가되는 자식 오브젝트 또한 이 이벤트로 얻어질 수 있습니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Evnet = Quad.Event - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_holder"; - } -end -function myClass:AfterRender() - self.ChildAdded:Connect(function(child) - print(child.Name) - end) -end - -local myImported = Class(myClass) -local myButton = myImported{ - -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다. - -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를 - -- 얻어올 수 있습니다. - TextButton { Name = "Hello "}; -} - -Mount(myButton, TextButton{ Name = "Hello" }) -Mount(myButton, TextButton{ Name = "World" }) -``` -
- ---- - -`#!ts :GetChildren()` -
- -자식 오브젝트들을 가져오는 함수입니다. `:Init()` 와 `:AfterRender()` 에서는 빈 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Evnet = Quad.Event - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_holder"; - } -end -function myClass:AfterRender() - for i,v in ipairs(self:GetChildren()) do - print(v.Name) - end -end - -local myImported = Class(myClass) -local myButton = myImported{ - TextButton { Name = "Hello World"}; -} - --- 나중에 추가하는 오브젝트는 출력되지 않습니다. -Mount(myButton, TextButton{ Name = "Hello" }) -Mount(myButton, TextButton{ Name = "World" }) -``` -
- diff --git a/md/kr/include/locales.md b/md/kr/include/locales.md deleted file mode 100644 index cd56585..0000000 --- a/md/kr/include/locales.md +++ /dev/null @@ -1,48 +0,0 @@ - -**Default** (default) -**English** (en-us) -**Spanish** (es-es) -**French** (fr-fr) -**Indonesian** (id-id) -**Italian** (it-it) -**Japanese** (ja-jp) -**Korean** (ko-kr) -**Russian** (ru-ru) -**Thai** (th-th) -**Turkish** (tr-tr) -**Vietnamese** (vi-vn) -**Portuguese** (pt-br) -**German** (de-de) -**ChineseSimplified** (zh-cn) -**ChineseTraditional** (zh-tw) -**Bulgarian** (bg-bg) -**Bengali** (bn-bd) -**Czech** (cs-cz) -**Danish** (da-dk) -**Greek** (el-gr) -**Estonian** (et-ee) -**Finnish** (fi-fi) -**Hindi** (hi-in) -**Croatian** (hr-hr) -**Hungarian** (hu-hu) -**Georgian** (ka-ge) -**Kazakh** (kk-kz) -**Khmer** (km-kh) -**Lithuanian** (lt-lt) -**Latvian** (lv-lv) -**Malay** (ms-my) -**Burmese** (my-mm) -**Bokmal** (nb-no) -**Dutch** (nl-nl) -**Filipino** (fil-ph) -**Polish** (pl-pl) -**Romanian** (ro-ro) -**Ukrainian** (uk-ua) -**Sinhala** (si-lk) -**Slovak** (sk-sk) -**Slovenian** (sl-sl) -**Albanian** (sq-al) -**Bosnian** (bs-ba) -**Serbian** (sr-rs) -**Swedish** (sv-se) -**Arabic** (ar-001) diff --git a/md/kr/include/mounts.md b/md/kr/include/mounts.md deleted file mode 100644 index ce43e8c..0000000 --- a/md/kr/include/mounts.md +++ /dev/null @@ -1,61 +0,0 @@ -`#!ts :Unmount()` -
- -이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해 `#!ts Store.GetObject` 에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다. - -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui,mainFrame) - -local childFrame = Frame {} -local childFrameMount = Mount(mainFrame,childFrame) -childFrameMount:Unmount() --- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다 --- 즉, Destroy() 가 호출됩니다 -``` -
- ---- - -`#!ts :Add(item:any)` -
- -Mount 에 오브젝트를 추가합니다. 처음 설정한 `to` 값을 따라 부모가 결정됩니다. - -이 동작은 리스트를 만들 때 유용할 수 있습니다. *다시로드 동작시 직접 제거가 필요하지 않습니다* - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui, mainFrame) - -local lastListMount = Mount(mainFrame) -local function refreshList() - lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다 - for i = 1,10 do - lastListMount:Add(Frame { Name = tostring(i) }) - end -end - -task.spawn(function() - while true do - refreshList() - task.wait(2) - end -end) -``` - -다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단 `ScrollFrame` 의 경우 `CanvasPosition`이 초기화 되어버리므로 자식들을 `#!ts :Unmount()` 하기 전에 위치를 저장하고 다시 불러와야 합니다 -
diff --git a/md/kr/include/objectList.md b/md/kr/include/objectList.md deleted file mode 100644 index eafb7be..0000000 --- a/md/kr/include/objectList.md +++ /dev/null @@ -1,19 +0,0 @@ -`#!ts :Each((item:any, index:number)->())` -> 일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다 - ---- - -`#!ts :EachAsync((item:any, index:number)->())` -> 반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다. -> 코루틴이 이용됩니다. `wrap()` 코루틴을 모르거나, 필요성이 없는경우 일반적으로 `#!ts :Each` 를 사용해도 됩니다 - ---- - -`#!ts :IsEmpty()` -> 이 ObjectList 가 비어있는지 여부를 반환합니다. - ---- - -`#!ts :Remove(indexOrItem:number|any)` -> objectList 에서 해당하는 오브젝트를 제거합니다. -> , & 를 사용한 고급 검색에서는 작동하지 않습니다 diff --git a/md/kr/include/quad.md b/md/kr/include/quad.md deleted file mode 100644 index e69de29..0000000 diff --git a/md/kr/include/quadProperty.md b/md/kr/include/quadProperty.md deleted file mode 100644 index 3c6c459..0000000 --- a/md/kr/include/quadProperty.md +++ /dev/null @@ -1,22 +0,0 @@ -`#!ts RoundSize:number?` -> `ImageLabel`, `ImageButton` 에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로 `UICorner`보다 부드러운 코너효과를 제공합니다. - ---- - -`#!ts Corner:number?` -> 모든 로블록스 UI오브젝트에 적용됩니다. `UICorner`를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다. - ---- - -`#!ts PaddingAll:UDim?` -> `UIPadding`을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다. `PaddingAllOffset` 과 함깨 사용할 수 없습니다. - ---- - -`#!ts PaddingAllOffset:number?` -> `UIPadding`을 적용합니다. `PaddingAll`과 같은 방법으로 작동하나, `Offset`값만 설정할 수 있습니다. `PaddingAll` 과 함깨 사용할 수 없습니다. - ---- - -`#!ts Scale:number?` -> `UIScale`을 적용합니다. `#!ts UIScale.Scale` 과 같은 효과를 나타냅니다 diff --git a/md/kr/include/register.md b/md/kr/include/register.md deleted file mode 100644 index 3fb4d08..0000000 --- a/md/kr/include/register.md +++ /dev/null @@ -1,328 +0,0 @@ - -`register` 특수 메소드가 적용되는 순서는 다음과 같습니다. - -`#!ts :Add(value:any)->register` -
- -값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다. -`number`, `Udim`, `UDim2`, `Color3`, `Vector2` 등 더할 수 있는 모든것을 사용할 수 있습니다 -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.pos = UDim2.fromOffset(100,0) - -Frame "mainFrame" { - Position = myStore "pos":Add(UDim2.fromOffset(0,100)); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -while true do - myStore.pos = myStore.pos + UDim2.fromOffset(10,0) - task.wait(2) -end -``` -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -
- ---- - -`#!ts :With((store:valueStore, newValue:any, key:string)->())->register` -
- -함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다. -첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다 - -=== "간략한 용법" - - ```lua - myStore "size":With(function (_,value) - return value * 2 - end) - ``` - -=== "예제 - 함수" - - `width` 값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - - myStore.topbarSize = 60 - myStore.width = 200 - - -- 레지스터를 변수로 두고 사용합니다 - local listItemSize = myStore "width":With(function() - return UDim2.fromOffset(myStore.width,60) - end) - - Frame "mainFrame" { - Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder }; - - -- 사이즈가 width 에 맞게 업데이트됩니다 - Size = myStore "width":With(function () - return UDim.fromOffset(store.width,400) - end); - - Frame "Topbar" { - LayoutOrder = 1; - BackgroundColor3 = Color3.fromRGB(255,0,0); - -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을 - -- 만들 수 있습니다. - Size = myStore "topbarSize,width":With(function() - return UDim2.fromOffset(myStore.width,myStore.topbarSize) - end); - } - Frame "ListItem" { - LayoutOrder = 2; - BackgroundColor3 = Color3.fromRGB(0,255,0); - Size = listItemSize; - }; - Frame "ListItem" { - LayoutOrder = 3; - BackgroundColor3 = Color3.fromRGB(0,0,255); - Size = listItemSize; - }; - } - - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - -- width 값을 변경해보세요 - while true do - myStore.width = myStore.width + 10 - task.wait(1) - end - ``` - -=== "예제 - 테이블" - - `colors` 테이블 안에 있는 색깔들을 돌아가며 보여줍니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - - local colors = { - Color3.fromRGB(255,255,255); - Color3.fromRGB(255,255,0); - Color3.fromRGB(0,255,255); - Color3.fromRGB(255,0,255); - Color3.fromRGB(255,0,0); - Color3.fromRGB(0,255,0); - Color3.fromRGB(0,0,255); - } - myStore.color = 1 - - Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- colors 에서 인덱싱해 값을 가져옵니다 - BackgroundColor3 = myStore "color":With(colors); - } - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - -- 인덱스를 순회합니다 - while task.wait(1) do - myStore.color = (i-1)%(#colors)+2 - end - ``` - -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -
- ---- - -`#!ts :Tween(options:TweenOptions)->register` -
- -트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다. - -=== "간략한 용법" - - ```lua - -- Tween 옵션을 넣을 수 있습니다 - myStore "size":Tween{ Time = 2 } - ``` - -=== "예제 - 한꺼번에 이동" - - 프레임을 한꺼번에 움직입니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - local Style = Quad.Style - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - myStore.pos = UDim2.fromOffset(50,0) - Style "TweenFrame" { - Size = UDim2.fromOffset(50,50); - BackgroundColor3 = Color3.fromRGB(255,100,255); - } - - Frame "mainFrame" { - BackgroundColor3 = Color3.fromRGB(255,255,255); - Size = UDim2.fromOffset(500,500); - Frame "TweenFrame" { - Position = myStore "pos":Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,100)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,200)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,300)) - :Tween{Time = 2}; - } - } - - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - local on = false - while true do - on = not on - myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0) - task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다 - -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다 - end - ``` -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -
- ---- - -`#!ts :Default(value:any)->register` -
- -기본값을 정합니다. 만약 값이 `#!lua nil` 인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다. -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- color 값이 없으므로 Default 안의 값이 사용됩니다. - BackgroundColor3 = myStore "color" - :Default(Color3.fromRGB(255,0,0)); -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -task.wait(5) -myStore.color = Color3.fromRGB(0,255,0) -``` -???+ Warning "주의" - + 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다. - + 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다. -
- ---- - -`#!ts :Register((store:valueStore, newValue:any, key:string)->())->INPUT` -
- -레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다 - -`newValue` 에는 `:Add`, `:With`, `:Tween`, `:Default` 가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다 - -=== "간략한 용법" - - ```lua - myStore.test = 1 - -- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다 - -- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다 - -- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다 - local func = myStore "test":Register(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) - end) - myStore.test = 2 - ``` - - -=== "예제 - 여러 변경사항 추적" - - `#!ts myStore.test1`, `#!ts myStore.test2` 가 변화하면 print 함수를 실행합니다. - - ```lua - local Quad = require(path.to.module).Init() - local Store = Quad.Store - - local myStore = Store.GetStore("myStore") - - myStore.test1 = 1 - myStore.test2 = "Hello" - - local func = myStore "test1,test2":Register(function() - print(myStore.test1,myStore.test2) - end) - - myStore.test1 = 2 - ``` -???+ Warning "주의" - Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다. -
- ---- - -`#!ts :Observe((newValue:any)->())` -
- -`#!ts :Register`의 간소화 버전입니다. `:Register`와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는 `newValue` 하나만 주어집니다. - -`newValue` 는 `:Add`, `:With`, `:Tween`, `:Default` 가 계산된 상태로 제공됩니다. - -=== "간략한 용법" - - ```lua - myStore.test = 1 - myStore "test":Add(1):Observe(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) - end) - myStore.test = 2 - ``` -
- - - diff --git a/md/kr/include/tween.md b/md/kr/include/tween.md deleted file mode 100644 index 856b4f3..0000000 --- a/md/kr/include/tween.md +++ /dev/null @@ -1,85 +0,0 @@ -`#!ts Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler` -> 트윈을 실행합니다. 트윈 옵션에 대한 정보는 [TweenOptions](./tweenOptions.md) 문서에서 찾을 수 있습니다. -> `Ended`, `OnStepped`, `Setter`, `Getter` 값이 설정되면 `Option` 안의 값보다 우선적으로 사용됩니다. 기능은 [TweenOptions](./tweenOptions.md)의 내용과 같습니다. -> 나중에 트윈을 중단시킬 수 있도록 `TweenHandler` 가 제공됩니다. -> 다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. -```lua -Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -``` - ---- - -`#!ts Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)` -> `#!ts Tween.RunTween` 와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다 -```lua -Tween.RunTween({myFrame1, myFrame2, myFrame3},{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -``` - ---- - -`#!ts Tween.StopTween(ItemOrHandler:TweenHandler|any)` -
- -트윈을 멈춥니다. `TweenHandler` 또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다. - -=== "TweenHandler 이용" - - ```lua - local Handler = Tween.RunTween(myFrame,{ - Time = 1; - },{ - Position = UDim2.new(1,0,1,0); - }) - - Tween.StopTween(Handler) - ``` - -=== "오브젝트 이용" - - ```lua - local Handler = Tween.RunTween(myFrame,{ - Time = 1; - },{ - Position = UDim2.new(1,0,1,0); - }) - - Tween.StopTween(myFrame) - ``` -
- ---- - -`#!ts Tween.StopPropertyTween(Item:any, PropertyName:string)` -> 오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다. `TweenHandler` 는 사용할 수 없습니다. - ---- - -`#!ts Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean` -> 해당 오브젝트 또는 `TweenHandler` 로 트윈이 진행중인지 여부를 판단합니다. - ---- - -`#!ts Tween.IsPropertyTweening(Item:any, PropertyName:string)` -> 해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다. `TweenHandler` 는 사용할 수 없습니다. - ---- - -`Tween.Easings: { [string]: EasingFunction }` -> 이징 함수들이 담겨있습니다. -{!include/typeEasings.md!} -> 그래프와 미리보기는 [Easings](./easings.md) 에서 확인할 수 있습니다 - ---- - -`Tween.Easings: { [string]: EasingFunction }` -> 이징 함수들이 담겨있습니다. -{!include/typeDirections.md!} -> 자세한 정보는 [Easings](./directions.md) 에서 확인할 수 있습니다 diff --git a/md/kr/include/tweenOptions.md b/md/kr/include/tweenOptions.md deleted file mode 100644 index 51bbc1e..0000000 --- a/md/kr/include/tweenOptions.md +++ /dev/null @@ -1,55 +0,0 @@ - -==Option== `#!ts Time:number?` -> 트윈의 총 길이를 정합니다. *아무 값도 지정하지 않으면 `#!ts 1`이 사용됩니다.* - ---- - -==Option== `#!ts Easing:string|(index:number)->number?` -> 트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나, `#!ts Tween.Easings.Linear`와 같이 열거형 방식으로 사용할 수 있습니다. -> 혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다. -> *아무 값도 지정하지 않으면 `Exp2`가 사용됩니다.* -{!include/typeEasings.md!} -> 함수에 관한 자세한 설명과 미리보기는 [여기에서](../reference/tween/easings) 확인하세요 - ---- - -==Option== `#!ts Direction:string?` -> 트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나, `#!ts Tween.Directions.Out`과 같이 열거형 방식으로 사용할 수 있습니다. -> *아무 값도 지정하지 않으면 `Out`이 사용됩니다.* -{!include/typeDirections.md!} -> 방향에 관한 자세한 설명과 미리보기는 [여기에서](../reference/tween/directions) 확인하세요 - ---- - -==Option== `#!ts CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?` -> 선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다. -> 인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며, `#!lua "*"` 를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다. -> 함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다. - ---- - -==Option== `#!ts OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?` -> CallBack 에 `#!lua "*"` 를 넣은것과 동일한 효과를 가지는 별칭입니다 - ---- - -==Option== `#!ts Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?` -> CallBack 에 `#!lua 1`을 넣은것과 동일한 효과를 가지는 별칭입니다 - ---- - -==Option== `#!ts Getter:(Item:any, Property:string)->any?` -> 선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다. -> 함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다. -> ???+ warning - `#!ts register:Tween()` 와 호환되지 않습니다. - ---- - -==Option== `#!ts Getter:(Item:any, Property:string, Value:Lerpable)->any?` -> 선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -> 함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다. -> ???+ warning - `#!ts register:Tween()` 와 호환되지 않습니다. - - diff --git a/md/kr/include/typeDirections.md b/md/kr/include/typeDirections.md deleted file mode 100644 index 1810f4b..0000000 --- a/md/kr/include/typeDirections.md +++ /dev/null @@ -1,9 +0,0 @@ -```ts -type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -``` \ No newline at end of file diff --git a/md/kr/include/typeEasings.md b/md/kr/include/typeEasings.md deleted file mode 100644 index 2952cbf..0000000 --- a/md/kr/include/typeEasings.md +++ /dev/null @@ -1,17 +0,0 @@ -```ts -type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -``` \ No newline at end of file diff --git a/md/kr/index.md b/md/kr/index.md deleted file mode 100644 index ab76e71..0000000 --- a/md/kr/index.md +++ /dev/null @@ -1,5 +0,0 @@ - -# Quad - -처음오셨나요? [튜토리얼 문서](tutorial)를 읽어보세요! -처음부터 차근차근 Quad 모듈을 정복할 수 있어요 diff --git a/md/kr/license.md b/md/kr/license.md deleted file mode 100644 index 6d61b12..0000000 --- a/md/kr/license.md +++ /dev/null @@ -1,119 +0,0 @@ - -# 라이선스 - -QwreeyKawaii License v1.3 - -=== "Korean" - - | Permissions | Limitations | Conditions | - |-------------|-------------|------------| - | ✅ 상업적 사용 | ❎ 보증 | ❓ 라이선스와 저작권 고지 (권고사항) | - | ✅ 배포 | ❎ 무례하게 굴기 | | - | ✅ 변경/수정/2차저작 | ❎ 러시아를 비롯한 전쟁을 돕는 | | - | ✅ 개인적 사용 | ❎ 아무런 변경사항 없이 복제 | | - - ``` - QwreeyKawaii license v1.3 - Copyright 2023. Qwreey [qwreey75@gmail.com] - - 이 라이선스는 DBAD 라이선스를 기반으로 합니다. - 누구든지 이 라이선스 문서의 원본 혹은 수정본을 - 복사, 편집, 배포 할 수 있습니다. - - QwreeyKawaii 라이선스의 복사 배포 및 수정에 - 관한 규정과 조건. - - 1. 당신은 이 귀여운 창작물을 가지고 어떠한 - 것이든 할 수 있습니다. 단, 무례하지 마세요. - 무례한 행동은 통상적으로 다음과 같습니다. - - 가. 귀여운 이 창작물을 어떠한 가공도 없이 - 복제하거나, 이름만 바꾸는 것은 무례하며 - 노골적인 저작권 침해입니다. - 나. 귀여운 이 창작물에 음란성 혹은 유해한 - 콘텐츠를 포함시키는 것은 무례합니다. - 귀여운 콘텐츠로 다른이를 해치지 마십시오. - - 그러나 이에만 국한되는것은 아닙니다. - 무엇보다도, 귀여운 타인을 상처주지 마세요. - - 2. 당신이 이 창작물을 사용해 많은 이득을 본 - 경우, 귀여운 창작자에게 사랑을 배푸세요. - 인간적인 사람은 귀여운 사람들을 외면하지 - 않습니다. 당신의 커피 한잔을 나눠주세요. - - 3. 이 창작물은 어떠한 보증 없이 제공됩니다. - 이 창작물을 사용하다, 창작자의 귀여운 - 실수로 인해 무언가 잘못되었다면, 문제를 직접 - 해결하세요. 무례하지 않은 사람은 적어도 - 귀여운 타인들을 비난하거나 모욕하지는 않으며 - 수정본을 제출하거나 버그리포트를 제출 할 - 것입니다. - - 4. 당신이 이 귀여운 창작물을 활용해 다른 창작물 - 을 만들고 싶은 경우 적어도 사용했다는 고지는 - 남겨주세요. 귀여운 창작자들은 자신의 창작물이 - 좋은곳에 사용되었음을 기뻐할 것입니다. - * 이는 권고 사항입니다. 필수가 아니며 불가피한 - 경우 무시될 수 있습니다 - - 5. 러시아 국적의 이들은 이 창작물을 영리 목적으로 - 사용할 수 없습니다. - 우리는 전쟁자금을 - 지원하지 않습니다. - 같은 이유로써, 전쟁이 지원될 수 있는 곳에서의 - 이 창작물 사용을 허용하지 않습니다. - ``` - -=== "English" - - | Permissions | Limitations | Conditions | - |-------------|-------------|------------| - | ✅ Commercial use | ❎ Warranty | ❓ License and copyright notice (Recommendation) | - | ✅ Distribution | ❎ Being Rude | | - | ✅ Modification | ❎ Russian, And supporting war | | - | ✅ Private use | ❎ Copy without any modification | | - - ``` - QwreeyKawaii license v1.3 - - Copyright 2023. Qwreey [qwreey75@gmail.com] - - This license is based on DBAD license. - Everyone is permitted to copy and distribute - verbatim or modified copies of this license - document. - - TERMS, AND CONDITIONS FOR COPYING, - DISTRIBUTION, AND MODIFICATION - - 1. You can do anything with this original work, - but don't be rude - - In general, being rude includes below - - First. Do not copy these cute works without - any modification. changing the name - only is outright copyright infringement - Second. Do not add some harmful or NSFW content. - It's very rude and may harm others - - Being rude is not limited to these instances. - Above all, don't hurt cute people - - 2. If you get any benefit or profit from these cute - works, Share the love. A polite person may share - the love with cute people. - 3. These cute works are provided with no warranty. - If something goes wrong due to the creator's cute - mistake, Fix it yourself. A polite person may - submit the fix or bug report. - 4. If you create something with these works, Leave - the original creator's name in your work. - the cute creator will be happy if their works are - used for good. - * This is a recommendation. Not required. - 5. Russian nationality can not use this creation for - commercial purposes. — We do not support the war. - Same reason, This creation cannot be used where - it can support the war. - ``` \ No newline at end of file diff --git a/md/kr/reference/event.md b/md/kr/reference/event.md deleted file mode 100644 index 87f2018..0000000 --- a/md/kr/reference/event.md +++ /dev/null @@ -1,3 +0,0 @@ -# Event - -{!include/evnets.md!} diff --git a/md/kr/reference/extend.md b/md/kr/reference/extend.md deleted file mode 100644 index 89e7514..0000000 --- a/md/kr/reference/extend.md +++ /dev/null @@ -1,3 +0,0 @@ -# Extend - -{!include/extend.md!} diff --git a/md/kr/reference/index.md b/md/kr/reference/index.md deleted file mode 100644 index e539bba..0000000 --- a/md/kr/reference/index.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Reference - -이 섹션은 api 내용을 나열하지만, 깊게 설명하지 않을 수 있습니다. [튜토리얼 문서](../tutorial/index.md)를 읽어보는것을 권장합니다. diff --git a/md/kr/reference/lang.md b/md/kr/reference/lang.md deleted file mode 100644 index 9860e12..0000000 --- a/md/kr/reference/lang.md +++ /dev/null @@ -1,17 +0,0 @@ -# Lang - -`#!ts Lang.FailedMessage:string` -> 아무런 번역 값도 얻어오지 못하였을때 보여줄 문자열입니다. -> 변경시 자동으로 업데이트가 이루워집니다. - ---- - -`#!ts Lang.CurrentLocale:Locale` -> 현제 사용중인 언어입니다. 변경시 자동으로 업데이트가 이루워집니다. -> Lang.Locales 안의 값을 사용합니다. - ---- - -## Lang.Locales - -{!include/locales.md!} diff --git a/md/kr/reference/mounts.md b/md/kr/reference/mounts.md deleted file mode 100644 index 742df16..0000000 --- a/md/kr/reference/mounts.md +++ /dev/null @@ -1,3 +0,0 @@ -# Mounts - -{!include/mounts.md!} diff --git a/md/kr/reference/quadProperty.md b/md/kr/reference/quadProperty.md deleted file mode 100644 index 4964480..0000000 --- a/md/kr/reference/quadProperty.md +++ /dev/null @@ -1,3 +0,0 @@ -# QuadProperty - -{!include/quadProperty.md!} diff --git a/md/kr/reference/signal/bindable.md b/md/kr/reference/signal/bindable.md deleted file mode 100644 index 483b443..0000000 --- a/md/kr/reference/signal/bindable.md +++ /dev/null @@ -1,3 +0,0 @@ -# Bindable - -{!include/bindable.md!} diff --git a/md/kr/reference/signal/disconnecter.md b/md/kr/reference/signal/disconnecter.md deleted file mode 100644 index 5f24bef..0000000 --- a/md/kr/reference/signal/disconnecter.md +++ /dev/null @@ -1,3 +0,0 @@ -# Disconnecter - -{!include/disconnecter.md!} diff --git a/md/kr/reference/signal/index.md b/md/kr/reference/signal/index.md deleted file mode 100644 index 695be2b..0000000 --- a/md/kr/reference/signal/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Signal - -`#! Signal.Bindable.New(id:string)->Bindable` -> 새로운 [Bindable](./bindable) 을 생성하거나 이전의 [Bindable](./bindable) 을 반환합니다. - -`#! Signal.Disconnecter.New(id:string)->Disconnecter` -> 새로운 [Disconnecter](./disconnecter) 을 생성하거나 이전의 [Disconnecter](./disconnecter) 을 반환합니다. diff --git a/md/kr/reference/store/index.md b/md/kr/reference/store/index.md deleted file mode 100644 index f7822fe..0000000 --- a/md/kr/reference/store/index.md +++ /dev/null @@ -1,16 +0,0 @@ - -# Store - -`#!ts Store.GetStore(id:string?)->store` -> 값들을 저장하고 레지스터를 생성할 수 있는 값 저장소를 반환합니다. - ---- - -`#!ts Store.GetObject(id:string)->Object?` -> 해당 id 를 가진 생성된 오브젝트를 반환합니다. - ---- - -`#!ts Store.GetObjects(id:string)->objectList?` -> 해당 id 를 가진 생성된 오브젝트들을 반환합니다. 반환은 [objectList](./objectList.md) 타입을 가지고 있습니다. -> 고급 ID 를 사용할 수 있습니다. 자세한 사항은 [튜토리얼 문서](../../tutorial/3_getObject.md#id)를 확인하세요. diff --git a/md/kr/reference/store/objectList.md b/md/kr/reference/store/objectList.md deleted file mode 100644 index 439f869..0000000 --- a/md/kr/reference/store/objectList.md +++ /dev/null @@ -1,3 +0,0 @@ -# ObjectList - -{!include/objectList.md!} diff --git a/md/kr/reference/tween/directions.md b/md/kr/reference/tween/directions.md deleted file mode 100644 index 7b2bc66..0000000 --- a/md/kr/reference/tween/directions.md +++ /dev/null @@ -1,3 +0,0 @@ -# Tween.Directions - -{!include/directions.md!} diff --git a/md/kr/reference/tween/easings.md b/md/kr/reference/tween/easings.md deleted file mode 100644 index d864846..0000000 --- a/md/kr/reference/tween/easings.md +++ /dev/null @@ -1,3 +0,0 @@ -# Tween.Easings - -{!include/easings.md!} diff --git a/md/kr/reference/tween/index.md b/md/kr/reference/tween/index.md deleted file mode 100644 index 42ca824..0000000 --- a/md/kr/reference/tween/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Tween - -{!include/tween.md!} diff --git a/md/kr/reference/tween/tweenOptions.md b/md/kr/reference/tween/tweenOptions.md deleted file mode 100644 index 9ea72db..0000000 --- a/md/kr/reference/tween/tweenOptions.md +++ /dev/null @@ -1,4 +0,0 @@ - -# TweenOptions - -{!include/tweenOptions.md!} diff --git a/md/kr/todo.md b/md/kr/todo.md deleted file mode 100644 index 994e0d4..0000000 --- a/md/kr/todo.md +++ /dev/null @@ -1,40 +0,0 @@ -# 할일 - -## 진행중이거나 검토중 - -### Easing 문서 - -Easing 문서에 Out In Inout 비교 영상 만들기 - -### Spring - -Spring 물리 계산을 UI 애니메이션에 적용합니다 -WIP. 아직 진행중인 프로젝트. - -### Quad Debuger - -Register 의 상태와 Store 의 값, Class 의 동작 여부 등 Quad 의 여러 자원을 긴밀하게 디버그합니다. -WIP. 아직 진행중인 프로젝트. - -### Selection - -Tab 키등으로 버튼 선택하기 (... 가능함?) -WIP. 검토중인 프로젝트. - ---- - -## 먼 미래에 . . . - -*혹은 이루워지지 않는* - -### Quad Component Studio - -눈에 보이는 워지워그식 편집기를 이용해 Quad Class 를 생성합니다. - -### Quad WebRender - -HTML, CSS, JS 로써 스크립트를 변형해 스튜디오 없이 개발하는 가벼운 개발법입니다. - -### Quad Prerender - -미리 렌더링된 rbxm 객체를 반환합니다. lua 스크립트들이 매핑되어 일반적이게 돌아갑니다. diff --git a/md/kr/tutorial/10_signal.md b/md/kr/tutorial/10_signal.md deleted file mode 100644 index b3305d8..0000000 --- a/md/kr/tutorial/10_signal.md +++ /dev/null @@ -1,69 +0,0 @@ - -# Signal - 이벤트 생성과 연결 - -???+ info "읽기 전..." - 모듈 설정시 `#!ts .Init()` 처럼 QuadId 란을 비워두는 경우 `Bindable`, `Disconnecter` 기능이 코드를 넘어 공유되지 않습니다 - 하지만 `#!ts .Init("Project1")` 처럼 아이디를 부여하는 경우 **다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `Bindable`, `Disconnecter` 는 공유됩니다** - -Quad 에는 편의상의 이유로 로블록스의 `RBXScriptSignal` 의 유사품과, 한번에 시그널을 끊어주는 `Disconnecter` 를 제공합니다. -이는 내부적으로 `Extend` 의 `GetPropertyChangedSignal` 같은 곳에서 사용되기도 합니다. - -## Bindable - -Bindable 은 `RBXScriptSignal` 과 유사한 객체입니다. `#!ts Signal.Bindable.New(id:string?)` 으로 생성할 수 있습니다. -로블록스의 기본 `BindableEvent` 와는 다르게 `:Fire` 가 한곳에 합쳐져 있습니다. -???+ note - 만약 `id` 를 지정한 경우, 같은 `id` 를 가진 `Bindable` 이 있으면 이전것을 반환합니다. - -```lua -local Quad = require(path.to.module).Init() -local Signal = Quad.Signal - -local mySignal = Signal.Bindable.New() - -local connection = mySignal:Connect(function(v) - print(v) -end) -mySignal:Fire("이 메시지는 출력되어야 합니다.") -connection:Disconnect() -mySignal:Fire("이 메시지는 출력되면 안됩니다.") - -task.spawn(function() - task.wait(5) - mySignal:Fire("이 메시지는 지연된 후 출력되어야 합니다.") -end) -print(mySignal:Wait()) - -mySignal:Once(function(v) - print(v) -end) -mySignal:Fire("이 메시지는 출력되어야 합니다.") -mySignal:Fire("이 메시지는 출력되면 안됩니다.") - -mySignal:Once(function(v) - print(v) -end):Disconnect() -mySignal:Fire("이 메시지는 출력되면 안됩니다.") -``` - -### Bindable 메소드 - -`Bindable` 에는 다음과 같은 메소드들이 제공됩니다. - -{!include/bindable.md!} - -### Connection 메소드 - -Bindable:Connect 와 Bindable:Once 는 `Connection` 을 반환합니다. `Connection` 에는 다음과 같은 메소드들이 제공됩니다. - -{!include/connection.md!} - ---- - -## Disconnecter - -`Disconnecter` 는 일종의 `Maid` 모듈과 비슷한 객체입니다. 이 객체에는 `Connection` (로블록스, Quad 모두 호환) 을 추가할 수 있으며, 나중에 추가된 `Connection` 을 한꺼번에 `Disconnect` 할 수 있습니다. `#!ts Signal.Disconnecter.New(id:string?)` 으로 생성할 수 있습니다. -???+ note - 만약 `id` 를 지정한 경우, 같은 `id` 를 가진 `Bindable` 이 있으면 이전것을 반환합니다. - -{!include/disconnecter.md!} diff --git a/md/kr/tutorial/11_extend.md b/md/kr/tutorial/11_extend.md deleted file mode 100644 index 1a445a6..0000000 --- a/md/kr/tutorial/11_extend.md +++ /dev/null @@ -1,202 +0,0 @@ -# Extend - 확장과 재사용 - -## Extend 란? - -Quad 에서는 로블록스의 `Frame` 이나 `TextButton` 같은 기본 오브젝트만 만들 수 있는것이 아닙니다. Quad 는 자신만의 버튼, 혹은 여러 컴포넌트들을 추상적으로 만들고. 다시 활용할 수 있도록 `Extend` 를 지원합니다. - -`Extend` 는 `Register` 와 더불어 Quad 의 가장 중요한 기능으로써, 다음과 같은 장점을 지닙니다. - -> 1. 재사용 가능합니다. 나만의 버튼을 만들고, 고치고 싶은 마음이 생겨 고치면 자동으로 사용된 곳들이 업데이트됩니다. -> 2. 긴 코드를 나누어 코드마다 확실한 목적을 부여해 더 명확한 코드 작성이 가능해집니다. -> 3. 자신만의 프로퍼티를 만들거나 완전히 원하는대로 오브젝트를 커스터마이징 할 수 있습니다. -> 4. 함수나 생성기를 직접 만드는 것 보다 일관된 방법을 제공합니다. -> 5. 매우 유연합니다. 다양한 방법의 구현법을 원하는대로 사용할 수 있습니다. - ---- - -## 나만의 클래스를 만들어보기 - -`Extend` 객체는 다음과 같이 생성합니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - --- extend 객체를 만듭니다 -local myClass = Class.Extend() -``` -일반적으로 Extend 는 한 모듈에 하나씩 넣습니다. - -다음과 같은 코드 구조를 만들어보세요. 아래의 코드는 모든 `Extend` 문법을 설명합니다. -``` - - ScreenGUI - |-- localscript - |-- myClass (ModuleScript) -``` - -=== "localscript" - - ```lua title="Extend 클래스를 불러오고 사용합니다" - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Mount = Quad.Mount - local Class = Quad.Class - local Store = Quad.Store - - local myStore = Store.GetStore("myStore") - myStore.bgColor = Color3.fromRGB(0,0,0) - - -- Class(require(script.myClass)) 와 같습니다. - -- 줄여서 Class(script.myClass) 로 쓸 수도 있습니다. - local myClass = Class(script.myClass) - - -- 프레임에 넣거나 하여도 무방합니다 - -- 일반 오브젝트와 똑같이 id 를 넣고 GetObject 로 - -- 가져올 수도 있습니다 - local main = myClass "main" { - -- 이 테이블은 모듈의 :Init(props) 에 제공됩니다. - -- :Render(props) 에도 이 테이블이 제공됩니다. - Testing = 1; - Text = "Test"; - -- 레지스터 값을 넘겨줄 수도 있습니다. - -- 받는쪽도 레지스터인 경우 값이 연동됩니다. - BackgroundColor3 = myStore "bgColor"; - } - - Mount(ScreenGUI, main) - print(Store.GetObject("main") == main) -- true - - -- 이 값을 바꾸면 연동된 BackgroundColor3 도 바뀔것입니다 - myStore.bgColor = Color3.fromRGB(255,255,255) - - -- 값 변경됨을 연결하기 - main - :GetPropertyChangedSignal("AbsolutePosition") - :Connect(function() - print("AbsolutePosition",main.AbsolutePosition) - end) - - -- main:Update() - -- 강제로 다시 Render 를 실행하도록 만듭니다. - - -- main.Testing = 2 - -- 업데이트 트리거이므로 이 값을 변경하면. - -- main:Update() 와 같은 효과가 납니다. - ``` - -=== "localscript.myClass" - - ```lua title="Extend 클래스를 만듭니다. 다른곳에서 불러서 사용할 수 있습니다." - local Quad = require(path.to.module).Init() - local Class = Quad.Class - local Event = Quad.Event - - local TextLabel = Class "TextLabel" - - local myClass = Class.Extend() - - -- Init 는 Render 전 props 를 초기화 하는 용도로 사용합니다 - -- Init 에는 프로퍼티 리스트가 제공됩니다. Init 는 없더라도 무방합니다. - function myClass:Init(props) - -- 생성된 오브젝트에 프라이빗 값을 만듭니다. - -- 이름 앞에 _ 가 붇으면 외부에서 사용되는 목적이 아닌 - -- 내부에서 사용되는 목적으로만 사용할 수 있습니다 - -- 이 경우 안전성을 위해 register 를 사용할 수 - -- 없습니다. - self._testValue = 2 - - -- 프로퍼티의 기본값을 정해줄 수 있습니다. - -- 생성 시 값이 누락된 경우 사용할 값을 정해줄 수 있습니다 - -- 키, 값 으로 구성합니다 - props:Default("Text", "Testing Label") - props:Default("ZIndex", 1) - end - - -- myClass 가 진짜 그려지는 부분입니다. - -- Render 도 Init 처럼 프로퍼티 리스트가 제공됩니다. - function myClass:Render(props) - return TextLabel { - Size = UDim2.fromOffset(200,200); - -- self 에 _label 로 이 TextLabel 을 넣습니다. - -- 자식 오브젝트에도 사용할 수 있는 문법입니다. - self "_label"; - - -- _holder 는 예약된 값입니다. 자식들이 여기에 들어와야 - -- 함을 나타냅니다. 리스트나 그리드가 있는 경우 유용합니다. - -- 따로 설정하지 않는 경우 Render 가 리턴한 값을 사용합니다. - self "_holder"; - - -- GetPropertyChangedSignal 가 작동할 수 있도록 - -- 프로퍼티 변경 이벤트를 연결해줍니다 - -- 이 또한 자식 오브젝트에도 사용할 수 있는 문법입니다. - [Event.Prop "AbsolutePosition"] = self "AbsolutePosition"; - -- 마우스 클릭같은 다른 이벤트를 GetPropertyChangedSignal 에 - -- 연결하려면 :EmitPropertyChangedSignal() 를 호출해주면 됩니다. - [Event "MouseEnter"] = function (this,x,y) - -- 키, 값이 들어갑니다. 값이 없으면 self[key] 로 대신합니다. - self:EmitPropertyChangedSignal("Testing2",1) - end; - - -- 받은 레지스터를 연동합니다. - -- 만약 props.BackgroundColor3 만 사용하면 - -- 처음에만 레지스터에서 값을 읽어옵니다. - -- 따라서 값을 변경해도 변경사항이 적용되지 않습니다. - BackgroundColor3 = props "BackgroundColor3":Tween(); - - -- 입력 값과 상관없이 레지스터를 쓸 수 있습니다. - -- 이 경우 main.Text = "New" 처럼 직접 변경하면 - -- 그 변경이 적용됩니다. - Text = props "Text"; - ZIndex = props "ZIndex"; - -- ... 자식을 넣어도 무방합니다. - -- Frame { - -- [Event.Created] = function(self) - -- print(self.Parent) -- nil 일 수도 있습니다 - -- 따라서 부모를 건들여야 하는 경우, self "" 를 통해 - -- self 값에 넣어놓고 나중에 AfterRender 로 해결해야합니다. - -- end; - -- } - } - end - - - -- AfterRender 는 Render 직후 실행됩니다. - -- 렌더링 후 실행해야 할 것을 넣을 수 있습니다. - -- object 는 :Render 가 반환한 값입니다. - -- AfterRender 는 없더라도 무방합니다. - function myClass:AfterRender(object) - print(self._label,"이 생성되었습니다") - -- 이렇게 하면 레지스터로 연결된 부분도 업데이트됩니다. - self.ZIndex = 2 - end - - -- function myClass:Unload(object) - -- :Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 - -- 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다 - -- object 는 :Render 가 반환한 값입니다 - - -- AbsolutePosition 값을 반환할 수 있도록 만듭니다 - function myClass.Getter.AbsolutePosition(self) - return self._label.AbsolutePosition - end - - -- AbsolutePosition 값을 설정할 수 없도록 만듭니다 - function myClass.Setter.AbsolutePosition(self,newValue) - -- 필요한 경우 값을 설정하도록 만들 수 있습니다 - error("AbsolutePosition 값은 설정할 수 없습니다") - end - - -- main.Testing = 2 다음과 같이 값을 변경하면 오브젝트가 - -- 완전히 다시 그려집니다. 즉 업데이트 트리거로 사용합니다. - myClass.UpdateTriggers.Testing = true - - -- 만든 클래스를 반환해줍시다. - return myClass - ``` - ---- - -## Extend - -Extend 에서 사용할 수 있는 값들과 메소드입니다. - -{!include/extend.md!} diff --git a/md/kr/tutorial/1_import.md b/md/kr/tutorial/1_import.md deleted file mode 100644 index 05339bf..0000000 --- a/md/kr/tutorial/1_import.md +++ /dev/null @@ -1,58 +0,0 @@ - -# Import - 오브젝트 생성 - -## 로블록스 오브젝트 불러오기 - -Frame 과 같은 UI 오브젝트를 만들고 싶은 경우 먼저 import 를 이용해주어야 합니다. -다음과 같이 입력해보세요! - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local Frame = Class "Frame" - -print( - Frame { - Name = "Wow!"; - -- 다음과 같이 자식을 추가할 수 있습니다 - Frame { - Name = "Child"; - }; - } -) -``` - -나중에 자신만의 UI 오브젝트를 생성할 수 있지만, 일반적인 로블록스가 지원하는 오브젝트의 경우 `#!ts Class(ClassName:string)` 으로 불러올 수 있습니다 - ---- - -## 불러온 Class 에 기본값 설정 - -불러온 Class 에 기본값을 설정할 수도 있습니다. -이렇게 하면 `BorderSizePixel` 와 같이 자주 사용될 수 있는 프로퍼티를 미리 지정해 둘 수 있습니다. - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local FrameWithoutBorder = Class "Frame" -FrameWithoutBorder.BorderSizePixel = 0 - -local FrameWithBorder = Class "Frame" -FrameWithBorder.BorderSizePixel = 1 - -local frame1 = FrameWithoutBorder {} -local frame2 = FrameWithBorder {} -local frame3 = FrameWithBorder { - -- 값을 덮어 쓸 수 있습니다 - -- 이렇게 하면 기본값이 무시됩니다. - BorderSizePixel = 0; -} - -print(frame1.FrameWithBorder.BorderSizePixel) -print(frame2.FrameWithBorder.BorderSizePixel) -print(frame3.FrameWithBorder.BorderSizePixel) -``` - -이제 그려낸 프레임을 화면에 그려보고 싶나요? 다음 튜토리얼 Mount 를 확인해보세요! diff --git a/md/kr/tutorial/2_mount.md b/md/kr/tutorial/2_mount.md deleted file mode 100644 index f5cd688..0000000 --- a/md/kr/tutorial/2_mount.md +++ /dev/null @@ -1,34 +0,0 @@ - -# Mount - 화면에 UI 표현 - -## 화면에 UI 를 표시하기 - -*Quad* 모듈에서 모든 Parent 처리는 `#!ts Mount` 를 이용합니다. `#!ts Mount(to:any,...item:any?)->mounts` 함수를 이용하면 다루는 오브젝트가 로블록스 `Instance` 인지, 향후 소개될 Quad 확장 클래스인지 상관없이 알아서 Parent 가 처리됩니다. - -```lua ---- StarterGui 안에 ScreenGui 를 넣고 로컬스크립트로 입력해보세요 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -Mount(ScreenGui, - Frame { - Name = "Wow!"; - } - --[[ - , Frame {} , Frame {} - 더많은 오브젝트를 다같이 Mount 할 수 있습니다 - ]] -) -``` - ---- - -## 마운트 객체 - -편의를 위해서 `Mount` 함수는 `mounts` 라는 객체를 반환합니다. 이것을 이용하면 필요에 따라서 Mount 상태를 해제하거나 추가 할 수 있습니다. `mounts` 객체는 다음과 같은 메소드를 가집니다. - -{!include/mounts.md!} - diff --git a/md/kr/tutorial/3_getObject.md b/md/kr/tutorial/3_getObject.md deleted file mode 100644 index 59575c6..0000000 --- a/md/kr/tutorial/3_getObject.md +++ /dev/null @@ -1,204 +0,0 @@ - -# GetObject - 오브젝트에 아이디 부여 - -???+ info "읽기 전..." - 모듈 설정시 `#!ts .Init()` 처럼 QuadId 란을 비워두는 경우 `#!ts Store.GetObject` 가 코드를 넘어 공유되지 않습니다 - 하지만 `#!ts .Init("Project1")` 처럼 아이디를 부여하는 경우 **다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `#!ts Store.GetObject` 는 공유됩니다** - ---- - -## 오브젝트에 아이디 부여하기, 사용하기 - -**변수에 만들어진 오브젝트를 하나하나 저장해야하나요?** 아니요, Quad 에는 오브젝트에 아이디를 부여할 수 있습니다. - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store - -local Frame = Class "Frame" - -Frame "mainFrame" { - Size = UDim2.fromScale(1,1); -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) -``` - -아이디에 허용되는 글자는 변수명과 같습니다. 대소문자, 숫자, 언더바(_) 를 허용합니다. -오브젝트 생성시 `#!ts Frame "mainFrame" {}` 와 같이 id 값을 지정해 준다면 생성된 오브젝트는 그 아이디를 가지게 됩니다. -`#!ts Store.GetObject(id:string)->Object?` 는 생성된 객체중 가장 첫번째의 id 가 일치하는 오브젝트를 반환해 줍니다. - -```lua -local index = 1 -Frame ("mainFrame" .. index) {} -print(Store.GetObject("mainFrame" .. index)) -``` - -위처럼 생성이나 가져오기에서 식을 만들어 넣을 수도 있습니다. - ---- - -## 다량의 오브젝트를 다루기 - -???+ Warning "주의" - `Store.GetObjects`의 반환값인 `objectList`는 캐시해서는 안됩니다. `objectList`를 local 에 넣고 계속해서 유지시키지 마십시오, 반환값은 자동으로 업데이트 되지 않습니다. - -Quad 는 다량의 오브젝트를 다루기 편하도록 `#!ts Store.GetObjects(id:string)->objectList` 라는 함수를 가지고 있습니다. - -실험으로, 색깔이 랜덤하게 바뀌는 프레임들을 만들어 봅시다 - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store - -local Frame = Class "Frame" - -Frame "mainFrame" { - Size = UDim2.fromScale(1,1); - Frame "Child" { - Size = UDim2.fromOffset(20,20); - }; - Frame "Child" { - Size = UDim2.fromOffset(20,20); - Position = UDim2.fromOffset(30,0); - }; - Frame "Child" { - Size = UDim2.fromOffset(20,20); - Position = UDim2.fromOffset(60,0); - }; - Frame "Child" { - Size = UDim2.fromOffset(20,20); - Position = UDim2.fromOffset(90,0); - }; -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - --- 값을 설정할 수 있습니다. 그러나 값을 읽거나 :Connect 할 수는 없습니다 -Store.GetObjects("Child").Size = UDim2.fromOffset(30,30) - --- 필요에 따라 Store.GetObjects("Child") 를 pairs 에 넣어 for 문을 사용하거나 --- :Each , :EachAsync , :IsEmpty 함수를 이용할 수 있습니다 -task.spawn(function() - while true do - Store.GetObjects("Child"):Each(function (item, index) - item.BackgroundColor3 = Color3.fromRGB( - math.random(0,255), - math.random(0,255), - math.random(0,255) - ) - end) - task.wait(1) - end) -end - --- for 문을 이용해서 출력합니다 -for _,child in ipairs(Store.GetObjects("Child")) do - print(child) -end -``` - -### objectList - -`#!ts Store.GetObjects()` 의 반환 `#!ts objectList` 의 메소드들은 다음과 같습니다. - -{!include/objectList.md!} - ---- - -## 고급 ID 사용하기 - -id 기능을 조금더 고급적인 방법으로 사용할 수도 있습니다. - -=== "용법" - - ```lua - -- 두 아이디를 가진 프레임을 생성합니다 - Frame "a,b" {} - -- a 를 가진것과, a 와 b 를 가진것을 가져옵니다 - Store.GetObjects("a,a&b"):Each(function(item) - print(item) - end) - ``` - -=== "예제" - - ```lua title="좀더 직관적인 확인을 위해서 작동시켜보세요." - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Class = Quad.Mount - local Mount = Quad.Store - local Store = Quad.Class - - local Frame = Class "Frame" - - --다음과 같이 a 와 b 모두 가진 프레임을 생성할 수도 있습니다. - Frame "a,b" { - Name = "main"; - Frame "a" { - Name = "Child1"; - }; - Frame "b" { - Name = "Child2"; - }; - } - - -- 다음과 같이 a 와 b 둘다 선택할 수 있습니다 - Store.GetObjects("a,b"):Each(function(item, index) - print(item.Name) - end) - print("----") - - -- 다음과 같이 a 와 b 를 동시에 가진 것을 선택할 수 있습니다 - Store.GetObjects("a&b"):Each(function(item, index) - print(item.Name) - end) - print("----") - - -- 다음과 같이 a와b 를 동시에 가진것과, b 를 가진것을 선택 - -- 할 수 있습니다 - Store.GetObjects("a&b,b"):Each(function(item, index) - print(item.Name) - end) - ``` - -+ 또는(or) 연산 `#!ts ,` -+ 그리고(and) 연산 `#!ts &` - -`GetObjects` 에는 이 두 연산을 사용할 수 있고, 생성시에는 `#!ts ,` 으로 여러 아이디를 부여해줄 수 있습니다. *띄어쓰기는 무시됩니다* - -???+ Warning "주의" - - + `GetObject` 에는 이 방식을 사용할 수 없습니다. - + 고급 ID 사용시 `#!ts objectList:Remove` 메소드는 사용할 수 없습니다. - ---- - -## id 추가와 제거 - -경우에 따라 이미 생성한 오브젝트에 id 를 추가 혹은 제거해줄 수 있습니다 - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Store = Quad.Store - -local Frame = Class "Frame" - -Frame "testing" {} - --- 아이디를 추가합니다 -Store.AddObject( - "a,b", Store.GetObject("testing") -) - --- 아이디를 제거합니다 -Store.GetObjects("a"):Remove(Store.GetObject("testing")) -``` - -`#!ts Store.AddObject(ids:string, item:any)` 를 이용해 item 에 아이디를 추가하고 -`#!ts :Remove(item:any)` 를 이용해 item 에 아이디를 제거합니다 diff --git a/md/kr/tutorial/4_style.md b/md/kr/tutorial/4_style.md deleted file mode 100644 index 6aad132..0000000 --- a/md/kr/tutorial/4_style.md +++ /dev/null @@ -1,89 +0,0 @@ - -# Style - 속성 값 번들링 - -???+ info "읽기 전..." - 모듈 설정시 `#!ts .Init()` 처럼 QuadId 란을 비워두는 경우 `Style` 기능이 코드를 넘어 공유되지 않습니다 - 하지만 `#!ts .Init("Project1")` 처럼 아이디를 부여하는 경우 **다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `Style` 는 공유됩니다** - ---- - -## 반복되는 속성값을 줄이기 - -Quad 에서는 반복적인 속성들을 줄여 쓸 수 있도록 Style 을 제공합니다. - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Style = Quad.Style - -local Frame = Class "Frame" - --- 새로운 스타일을 하나 만듭니다 -local myStyle = Style { - Size = UDim2.fromOffset(20,20); - BackgroundColor3 = Color3.fromRGB(255,255,0); - BackgroundTransparency = 0.5; -} - -Frame "mainFrame" { - Size = UDim2.fromScale(1,1); - Frame "Child" { - myStyle; -- 스타일을 적용합니다! - }; - Frame "Child" { - Position = UDim2.fromOffset(30,0); - myStyle; - }; - Frame "Child" { - Position = UDim2.fromOffset(60,0); - myStyle; - }; - Frame "Child" { - Position = UDim2.fromOffset(90,0); - -- 스타일은 덮어써 질 수 있습니다. - BackgroundColor3 = Color3.fromRGB(255,0,0); - myStyle; - }; -} - -Mount(ScreenGUI,Store.GetObject("mainFrame")) -``` - -`#!ts Style`을 사용하면 많은 양의 속성을 하나에 변수로 집어넣을 수 있습니다. `#!ts Style`을 사용해서 많은 양의 코드를 줄여보세요 - ---- - -## ID 로 타겟을 지정하기 - -`#!ts Style`에는 `타겟 id`를 지정해줄 수 있습니다 - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Style = Quad.Style - -local Frame = Class "Frame" - --- 여기에는 & 나 , 가 적용되지는 않습니다! -Style "Child" { - Size = UDim2.fromOffset(20,20); - BackgroundColor3 = Color3.fromRGB(255,255,0); - BackgroundTransparency = 0.5; -} - --- 단, Style은 먼저 선언해야합니다, Frame을 먼저 만들고 --- Style을 선언하면 적용되지 않습니다. -Frame "mainFrame" { - Size = UDim2.fromScale(1,1); - Frame "Child" {}; - Frame "Child" { Position = UDim2.fromOffset(30,0) }; -} - -Mount(ScreenGUI,Store.GetObject("mainFrame")) -``` - -`#!ts Style(id:string){ any }`를 이용해 스타일을 선언해주면 나중에 해당 id를 가진 오브젝트 생성시 해당 스타일이 적용됩니다. diff --git a/md/kr/tutorial/5_event.md b/md/kr/tutorial/5_event.md deleted file mode 100644 index 7504077..0000000 --- a/md/kr/tutorial/5_event.md +++ /dev/null @@ -1,36 +0,0 @@ - -# Event - 이벤트 핸들링 - -## 이벤트 등록하기 - -`MouseButton1Click` 혹은 `GetPropertyChangedSignal` 같은 로블 기본 이벤트를 간단하게 등록하고 싶으신가요? Event 를 이용해보세요. - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local Event = Quad.Event -local Store = Quad.Store - -local TextButton = Class "TextButton" -local Count = 0 - -TextButton "mainButton" { - Size = UDim2.fromOffset(200,200); - Text = "0 번 클릭했습니다"; - [Event "MouseButton1Click"] = function(self,x,y) - Count = Count + 1 - self.Text = Count .. " 번 클릭했습니다" - end; -} -Mount(ScreenGUI, Store.GetObject("mainButton")) -``` - ---- - -## 이밴트 리스트 - -적용가능한 Event 들은 다음과 같습니다 - -{!include/events.md!} diff --git a/md/kr/tutorial/6_tween.md b/md/kr/tutorial/6_tween.md deleted file mode 100644 index 5df4b26..0000000 --- a/md/kr/tutorial/6_tween.md +++ /dev/null @@ -1,82 +0,0 @@ - -# Tween - 트윈효과 - -## 트위닝 - -Quad에는 트윈을 도와주는 모듈이 내장되어 있습니다. 이 트윈 모듈은 단순한 Instance들을 넘어서 table 형식도 트윈을 수행할 수 있습니다. 이는 나중에 커스텀 오브젝트를 트윈할 때 유용합니다. -Quad 에서는 실제로 직접적으로 Tween 을 사용할 일은 적으며 추후 설명되는 `#!ts register:Tween()`로 사용하는것이 권장됩니다. - -트윈은 일반적으로 다음과 같이 수행합니다. - -=== "용법" - - ```lua - Tween.RunTween(myFrame,{ - -- 트윈 옵션 - Easing = Tween.Easing.Expo; - Direction = Tween.Directions.Out; - Time = 1; - ... - },{ - -- 프로퍼티 목록 - }) - ``` - -=== "예제 - 움직이는 버튼" - - ```lua title="클릭시 움직이는 버튼을 구현합니다." - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Class = Quad.Class - local Mount = Quad.Mount - local Tween = Quad.Tween - - local Frame = Class "Frame" - local TextButton = Class "TextButton" - local on = false - - Frame "mainFrame" { - Size = UDim2.fromOffset(300,300); - BackgroundColor3 = Color3.fromRGB(255,255,255); - TextButton "Child" { - Text = "Click Me!"; - BackgroundColor3 = Color3.fromRGB(255,100,255); - Position = UDim2.fromOffset(80,100); - Size = UDim2.fromOffset(20,20); - [Event "MouseButton1Click"] = function(self,x,y) - on = not on - Tween.RunTween(self,{ - -- 트윈 옵션입니다. 아래에서 설명됩니다 - Easing = Tween.Easing.Expo; - Direction = Tween.Directions.Out; - Time = 1; - },{ - -- 트윈할 목표 프로퍼티입니다 - Position = on - and UDim2.fromOffset(200,100) - or UDim2.fromOffset(80,100); - }) - end; - }; - } - - Mount(ScreenGUI, Store.GetObejct("mainFrame")) - ``` - ---- - -## 트윈 옵션 - -트윈에는 트윈 옵션이 들어가며, 여기에는 트윈의 방향, 가감속, 시간 등을 설정해줄 수 있습니다. -넣을 수 있는 트윈 옵션은 다음과 같습니다. - -{!include/tweenOptions.md!} - ---- - -## 트윈 함수 - -Quad 의 트윈에는 트윈을 멈추거나 트윈중인지 확인하는 등의 작업을 할 수 있는 여러 함수들이 제공됩니다. -Tween 안의 모든 함수와 값들은 다음과 같습니다. - -{!include/tween.md!} diff --git a/md/kr/tutorial/7_quadProperty.md b/md/kr/tutorial/7_quadProperty.md deleted file mode 100644 index 613eb0a..0000000 --- a/md/kr/tutorial/7_quadProperty.md +++ /dev/null @@ -1,43 +0,0 @@ - -# QuadProperty - 특수 프로퍼티 - -???+ Failure "주의사항" - 특수 프로퍼티는 `Tween` 이 지원되지 않습니다. 그러나 `register`의 `#!ts :Tween()`의 경우 호환되므로, 특수 프로퍼티 값을 트윈하려면 향후 설명되는 `register` 와 함깨 사용해야합니다. - > `#!ts Tween.RunTween`, `#!ts Tween.RunTweens` 와는 같이 사용할 수 없습니다. - ---- - -## 특수한 프로퍼티 - -Quad 에서는 편리성을 위해 일부 특수 프로퍼티를 사용할 수 있습니다. -*이 모든 특수 프로퍼티는 향후 소개되는 `register`와 함깨 사용할 수 있습니다* - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local ImageFrame = Class "ImageFrame" -ImageFrame.BackgroundTransparency = 1 - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - PaddingAllOffset = 50; -- Padding 을 50 씩 모든 방향으로 줍니다 - BackgroundColor3 = Color3.fromRGB(40,40,40); - ImageFrame { - ImageColor3 = Color3.fromRGB(60,60,60); - RoundSize = 16; -- 이미지로 라운드 프레임을 만듭니다 - Size = UDim2.fromScale(1,1); - ImageFrame { - BackgroundColor3 = Color3.fromRGB(80,80,80); - }; - }; -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) -``` - -사용할 수 있는 프로퍼티는 다음과 같습니다. - -{!include/quadProperty.md!} diff --git a/md/kr/tutorial/8_register.md b/md/kr/tutorial/8_register.md deleted file mode 100644 index dc2da0a..0000000 --- a/md/kr/tutorial/8_register.md +++ /dev/null @@ -1,101 +0,0 @@ - -# Register - 값 변경 연동 - -???+ info "읽기 전..." - 모듈 설정시 `#!ts .Init()` 처럼 QuadId 란을 비워두는 경우 `#!ts Store.GetStore` 가 코드를 넘어 공유되지 않습니다 - 하지만 `#!ts .Init("Project1")` 처럼 아이디를 부여하는 경우 **다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `#!ts Store.GetStore` 는 공유됩니다** - ---- - -## 레지스터 - -레지스터는 한 값이 변경될 때, 그 값을 사용한 곳이 업데이트 될 수 있도록 만들어주는 ==Quad 의 주요 기술입니다.== 추후 설명될 `Class.Extend` 와도 같이 사용됩니다. - -레지스터는 이러한 시나리오에서 사용될 수 있습니다. - -> 1. UI 의 여러 오브젝트를 한번에 페이드 아웃 혹은 페이드 인 시키는 경우. -> 2. 가변 크기의 UI 를 업데이트 시키는 경우. -> 3. 여러 오브젝트들을 한꺼번에 트윈시키는 경우. -> 4. 다크테마/화이트테마 변경할 수 있게 만드는 경우. - -이외에도 레지스터의 활용 방법은 무궁무진합니다. 레지스터의 사용법은 다음과 같습니다. - -```lua -local myStore = Store.GetStore("myStore") -myStore.color = Color3.fromRGB(255,255,255) -Frame { BackgroundColor3 = myStore "color" } --- 연동된 프레임도 업데이트 됩니다 -myStore.color = Color3.fromRGB(0,0,0) -``` - -???+ Warning "주의" - - 구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다. - - ```lua - local myFrame = Frame{} - Frame.BackgroundColor3 = myStore "color" - ``` - 위처럼 사용할 수 없습니다. - - ```lua - local myFrame = Frame{} - Apply (myFrame) { - BackgroundColor3 = myStore "color"; - } - ``` - -> 1. 스토어를 생성함. -> 2. 기본 값을 설정함. -> 3. 스토어를 호출해 레지스터를 얻어 등록함. - -예시 코드로 정확하게 확인해 볼 수 있습니다 - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - --- 레지스터를 만들 수 있는 테이블을 만듭니다. --- 여기에 담아내는 값을 업데이트 하는 경우 레지스터로 연결된 --- 오브젝트들도 같이 업데이트됩니다. -local myStore = Store.GetStore("myStore") -local TextLabel = Class "TextLabel" - -myStore.Text = "0 초 지남" -myStore.Color = Color3.fromRGB(255,100,255) - -TextLabel "mainLabel" { - Size = UDim2.fromOffset(100,200); - -- myStore 의 Text 값이 변경됨을 추적하고, Text 값을 - -- 업데이트 시킵니다. - Text = myStore "Text"; - - -- 이것은 레지스터를 사용하는것이 아니라 단순히 값만 - -- 불러와 넣어주는 것입니다. 자동 업데이트가 가능하지 않습니다. - BackgroundColor3 = myStore.Color; -} - -Mount(ScreenGUI, Store.GetObject("mainLabel")) - --- 바꾸더라도 레지스터를 사용하지 않아 반영되지 않습니다 -myStore.Color = Color3.fromRGB(255,255,255) - -local Count = 1 -while task.wait(1) do - -- 값을 업데이트 합니다. 텍스트 라벨도 - -- 자동적으로 업데이트 됩니다. - myStore.Text = Count .. " 초 지남" - Count = Count + 1 -end -``` - ---- - -## 레지스터 메소드 - -레지스터에는 여러가지 메소드가 담겨있습니다. 이 메소드를 사용하면 레지스터를 보다 더 다양하게 활용할 수 있습니다. - -{!include/register.md!} diff --git a/md/kr/tutorial/9_lang.md b/md/kr/tutorial/9_lang.md deleted file mode 100644 index 96b1a9a..0000000 --- a/md/kr/tutorial/9_lang.md +++ /dev/null @@ -1,110 +0,0 @@ - -# Lang - 언어관리 - -???+ info "읽기 전..." - 모듈 설정시 `#!ts .Init()` 처럼 QuadId 란을 비워두는 경우 `Lang` 기능이 코드를 넘어 공유되지 않습니다 - 하지만 `#!ts .Init("Project1")` 처럼 아이디를 부여하는 경우 **다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `Lang` 은 공유됩니다** - ---- - -## 언어관리 - -Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되어 있습니다. 이 기능은 register 와 연동해 적은 줄의 코드로 변하는 텍스트도 언어에 맞게 출력되도록 만들 수 있습니다. - -번역 테이블은 `#!ts Lang.New(LangName:string,{ [Locale]: string|(options)->string })` 다음을 이용해 만들 수 있으며. -`#!ts Lang(LangName:string)(options)->register` 로 UI 에 적용시킬 수 있습니다. - -`#!ts Lang.Locales.Default` 는 일치하는 언어가 없을때 보여줄 언어입니다. 일반적으로 영어를 추천합니다. - -=== "용법" - - ```lua title="자세한 설명은 예제를 참고하세요" - Lang.New("Test",{ - [Lang.Locales.Korean] = "{won} 원"; - [Lang.Locales.Default] = "{won} Won"; - }) - TextLabel { - Lang "Test" { - won = 100; - }; - } - ``` - -=== "예제 - 다중언어 카운터" - - ```lua title="1초가 지날 때 마다 카운트를 증가합니다. 영어 사용자에겐 영어를, 한국어 사용자에겐 한국어를 보여줍니다." - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Mount = Quad.Mount - local Event = Quad.Event - local Lang = Quad.Lang - local Class = Quad.Class - - local TextButton = Class "TextButton" - - local myStore = Store.GetStore("myStore") - myStore.count = 0 - - Lang.New("TimePassed",{ - [Lang.Locales.Korean] = "{count}초 지났어요"; - [Lang.Locales.Default] = function (options) - -- 함수 또한 등록할 수 있습니다. - if options.count > 1 then - return ("%d seconds passed"):format(options.count) - else - return ("%d second passed"):format(options.count) - end - end; - }) - - TextButton "mainButton" { - Size = UDim2.fromOffset(100,100); - Text = Lang "TimePassed" { - -- count = 1 일반적인 값도 사용가능합니다 - count = myStore "count"; - }; - [Event "MouseButton1Click"] = function() - -- 클릭시 언어가 변경됩니다 - if Lang.CurrentLocale == Lang.Locales.Default then - Lang.CurrentLocale = Lang.Locales.Korean - else - Lang.CurrentLocale = Lang.Locales.Default - end - end - } - Mount(ScreenGUIk,Store.GetObject("mainButton")) - - while task.wait(1) do - myStore.count = myStore.count + 1 - end - ``` - -???+ Warning "주의" - - 구현의 복잡성의 이유로 Lang 은 레지스터와 같은 제약을 가집니다 (오브젝트 생성시에만 등록할 수 있습니다) - - ```lua - local myLabel = TextLabel{} - Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" }) - myLabel.Text = Lang "Test" { lang = 1 } - ``` - 위처럼 사용할 수 없습니다. - - 대신에 `#!ts :Register` 문법을 사용하여 등록할 수 있습니다. - - ```lua - local myLabel = TextLabel{} - Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" }) - Apply (myLabel) { - Text = Lang "Test" { lang = 1 }; - } - ``` - ---- - -## Locale 목록 - -로케일 값들은 `#!ts Lang.Locales`에서 가져올 수 있으며, 사용가능한 로케일 목록은 다음과 같습니다. - -> {!include/locales.md!} diff --git a/md/kr/tutorial/index.md b/md/kr/tutorial/index.md deleted file mode 100644 index 5657f53..0000000 --- a/md/kr/tutorial/index.md +++ /dev/null @@ -1,182 +0,0 @@ - -# Getting Started - -!!! example "실험적인 모듈" - 이 모듈은 업데이트가 빈번합니다! 항상 Github 를 확인해주세요! - ---- - -## 머리말 - -이 페이지는 Quad 모듈을 쉽게 시작할 수 있도록 튜토리얼을 제공하고 있습니다. 이 페이지를 정독해 Quad 모듈의 전반적인 사용법을 파악해보세요! - -[변경 사항은 여기](changelogs)에서 확인할 수 있습니다. - ---- - -## 설치 - -3가지 방법중 가장 편한 방법을 선택해 모듈을 설치해주세요. - -### 드레그 엔 드롭 / rbxmx 파일 - -드레그해 스튜디오에 넣을 수 있는 모듈 파일입니다. - -[RBXMX 다운로드](https://github.com/qwreey75/Quad/releases/latest/download/Quad.rbxmx){ .md-button .md-button--primary } - -다운로드해 스튜디오에 옮겨주세요. - -### git clone - -rojo 를 사용해 빌드하는 방법을 사용할 수 있다면 Quad 를 직접 빌드할 수 있습니다. - -```sh -git clone https://github.com/qwreey75/Quad Quad -cd Quad -make build -``` - -==윈도우의 경우 `make build` 대신 `rojo build default.project.json -o output.rbxmx` 를 입력해 주어야 합니다.== - -### git submodule - -프로젝트가 rojo 를 사용하고 git 을 사용하는 경우 submodule 로 추가할 수 있습니다. - -```sh -# 이미 submodule 을 사용하고 있는 경우 입력할 필요가 없습니다 -git submodule init -# 서브모듈의 루트는 직접 정해주세요 -git submodule add https://github.com/qwreey75/Quad Quad -``` - ---- - -## 모듈 불러오기/초기화 - -```lua -local Quad = require(path.to.module).Init() -``` - -모듈을 셋업하기 위해서는 `#!ts .Init(QuadId:string?)` 을 이용합니다. 일반적으로 `QuadId` 값은 필요하지 않지만, 나중에 소개할 Store 와 같은 일부 기능들이 `#!ts QuadId:string` 에 영향받기도 합니다. - -`#!ts .Init(QuadId:string)` 함수는 `QuadId` 가 같은 불러오기가 이미 있었던 경우, 초기화 하지 않고 불러왔던것을 반환합니다. -따라서 모듈들 끼리 `QuadId` 가 같은 경우 Store 같은것들이 공유됩니다. - -`QuadId` 가 비워진 경우 한번도 생성된 적 없는 새로운 Quad 가 생성됩니다 - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class -``` - -불러오기가 끝났다면 이제 Quad 의 자원들을 이용할 수 있습니다! -[다음 페이지로 넘어가 어서 활용해 봅시다](./1_import) - ---- - -## 추가적 환경 설정 - -### 타입 불러오기 - -기본적으로 Quad 는 로드시 타입 같이 반환하지만. 직접적으로 타입을 지정하고 싶은 경우 types.lua 를 불러올 수 있습니다 - -```lua -local types = require(path.to.module.types) -local Quad = (require(path.to.module)::types.module).Init() -``` - ---- - -## 테스트 환경 준비 - -테스트 환경은 rojo 와의 개발통합을 위해 Play 버튼을 누르지 않고 미리보기를 사용할 수 있도록 만들어줍니다 -이를 통해 다른 코드 방식의 UI 프레임 워크보다 빠른 개발속도를 달성할 수 있습니다 - -편의상을 위해 자동 리로드를 설정해 줄 수 있습니다. - -???+ Warning "주의" - - ==rojo 환경이 아니라면 자동 리로드는 랙을 동반할 수 있습니다== - > 일반적으로, 로컬 편집 환경에서 로블록스의 script editor 는 한글자 한글자 변경시 마다 .Source 를 업데이트합니다. 이는 한글자 한글자 타이핑 시 마다 UI 가 업데이트 될 수 있음을 의미합니다. Quad 의 tracker 모듈은 순간적으로 많은양의 리로드가 발생하지 않도록 적절한 쿨타임과 시간분배를 가지고 있지만, 이 경우에도 Ctrl+S 를 눌러 저장해야 적용되는 vscode 와 같은 타 편집기와는 차이가 날 수 있습니다. 코드가 커짐으로 인해 자동 리로드에서 퍼포먼스적 이슈를 겪는다면, rojo 를 활용해 코드를 외부로 옮긴 후, vscode 를 스튜디오 위에 놓고 미리보기와 코드를 동시에 보면서 편집하세요. - > 프로젝트가 매우 거대하지 않다면 크게 걱정하지 않아도 됩니다. - -다음과 같은 코드트리를 만들어주세요. - -``` - | Main (ModuleScript) - |-- Loader (LocalScript) - |-- Test (ModuleScript) -``` - -=== "Main" - - ```lua title="실제로 UI 들을 그리는 코드들이 담깁니다." - local Quad = require(path.to.module).Init() - local IsTestMode = script.Name:match("_TESTING") -- 테스트모드 여부 - local LocalPlayer = game.Players.LocalPlayer - local ScreenGUI = Instance.new("ScreenGui", - LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui) - ScreenGUI.Name = "MyGUI" - ScreenGUI.ResetOnSpawn = false - - -- 실제 그리는 코드들이 들어갑니다. - - return function() - -- 테스트가 끝나 만든걸 지워야 할 때 사용됩니다. - -- 추후 설명될 Unmount() 를 이용하세요. - ScreenGUI:Destroy() - end - ``` - -=== "Loader" - - ```lua title="게임을 플레이 할 때 코드가 로드될 수 있도록 만드는 로더입니다." - require(script.Parent) - ``` - -=== "Test" - - ```lua title="명령창에서 명령어 입력으로 테스트를 실행 할 수 있도록 만드는 코드들이 담깁니다." - -- 모듈 위치로 알맞게 변경해주세요 - local Quad = path.to.module - local tracker = require(Quad.tracker) - - local module = {} - local function reload() - if module.unload then pcall(module.unload) end - if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end - module.testingModule = script.Parent:Clone() - module.testingModule.Parent = script.Parent.Parent - module.testingModule.Archivable = false - module.testingModule.Name = module.testingModule.Name .. "_TESTING" - module.unload = require(module.testingModule) - end - - -- 자동 리로드를 켭니다. 이미 켜져있으면 다시 로드합니다 - function module.load() - reload() - if not module.autoreload then - module.autoreload = tracker.new(script.Parent) - module.autoreload:init(); wait() - module.autoreload:connect("updated",reload) - end - end - - -- 자동 리로드를 끄고 테스트로 생긴것을 지웁니다 - function module.unload() - if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end - if module.unload then pcall(module.unload) end - if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end - module.autoreload = nil - module.unload = nil - module.testingModule = nil - end - - return module - ``` - -이제 명령어 창에서 자동 리로드를 켜거나 끌 수 있습니다. rojo 나 편집기로 인해 코드가 변경되면 자동으로 업데이트됩니다! - -```lua -require(path.to.your.module).load() -``` diff --git a/mkdocs_en.yml b/mkdocs_en.yml deleted file mode 100644 index c493fcd..0000000 --- a/mkdocs_en.yml +++ /dev/null @@ -1,153 +0,0 @@ -# 사이트 기본 설정 -site_name: Quad Docments -site_url: https://quad.qwreey.kr/en/ -site_author: Qwreey and more -site_description: Description for Quad. (Korean) -copyright: Copyright © 2020 - 2023 Qwreey - -# 사이드바 -nav: - - Home: 'index.md' - -# 다중 언어 설정 -extra: - # 다중 언어 설정 - alternate: - - name: 한국어 - link: /kr/ - lang: ko - - name: English - link: /en/ - lang: en - # 소셜 링크 - social: - - icon: fontawesome/brands/github - link: https://github.com/qwreey75 - - icon: fontawesome/brands/mastodon - link: https://stella.place/@qwreey - - -# 리포 설정 -repo_url: https://github.com/qwreey75/Quad -repo_name: Quad -remote_branch: master - -# 사이트dir 설정, 저장소 하나로 관리하기 위해서 이렇게 씀 -docs_dir: md/en -site_dir: docs/en - -# 검색엔진 설정 -lang: multi # 한글이 없어서 어쩔 수 없이 묶음으로 사용 -min_search_length: 2 # 최소 검색 단위 - -# 테스팅 사이트 설정(로컬 서버) -dev_addr: '127.0.0.1:8080' - -# 추가 Css -extra_css: - - assets/extra.css - -# 다른 설정 -#extra: -# disqus: luakrdoc # 디스커스 설정 - -# 테마링 -theme: - # 기본 설정 - name: material - # mkdocs 덮어쓰기 폴더(일반적으로 없어도 됨) - # custom_dir: overrides - - # 테마 - # 테마 - palette: - - scheme: darker - toggle: - icon: material/brightness-3 - name: Switch to light theme - # - scheme: dark - # toggle: - # icon: material/brightness-4 - # name: Switch to light theme - - scheme: default - toggle: - icon: material/brightness-7 - name: Switch to dark theme - - # 세부기능 Flag - features: - - navigation.indexes - - navigation.footer # 바닥에 다음글 표시 - - navigation.tabs # 최상위 nav 인덱스를 탭으로 이동 - - navigation.top # 맨 위로 올라가기 표시 - - toc.integrate # 목차를 네비게이션에 합치기 - - content.code.copy # 코드 복사버튼 - - # 결과 없음 페이지 - static_templates: - - 404.html - - # 언어/폰트 - language: en - font: false - - # 아이콘 - favicon: assets/Quad_MiniLogo.png - logo: assets/Quad_MiniLogoWhite.svg - - # 일부 설정 - include_search_page: false - search_index_only: true - -plugins: - - search - -# Markdown 플러그인 -markdown_extensions: - # 컴포넌트 - - pymdownx.tabbed: # 탭 - alternate_style: true - - admonition # 노트라인 - - pymdownx.details # 더보기(확장 가능한 라벨) - - pymdownx.progressbar # 프로그래스 바 - - attr_list # ID 붙이기 - - def_list # 기본 리스트 - - # 기초 설정 - - footnotes # 바닥글 - - pymdownx.superfences # 스페이스 관련, 펜스 중첩허용 - - pymdownx.keys # 단축키(검색) - - pymdownx.magiclink # 링크 확장기 - - pymdownx.inlinehilite # 인라인 코드 하이라이팅 - - pymdownx.mark # 마킹(형광마커 효과) - - md_in_html # div 같은거 안에 마크다운 작성 - - pymdownx.highlight: # 코드 구문강조 - linenums: true # 코드라인 넘버 - - pymdownx.emoji: # 이모지 불러오기 - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - - pymdownx.tasklist: # 체크박스 불러오기 - custom_checkbox: true - - pymdownx.betterem: # 더 나은 글자 서식 알고리즘 - smart_enable: all - - pymdownx.smartsymbols: # 특수문자 쉬운입력 - fractions: false - - markdown_include.include: # 다른 md 파일 가져와서 보여주기 - base_path: md/kr - - # 기타 세부 설정 - - codehilite: # 코드 언어 추측 끄기 - guess_lang: false - - toc: # 부분 링크 허용 - permalink: true - - meta # 메타데이터 관련 - - # 사용되지 않는 플러그인 - #- pymdownx.snippets # 외부 md 로더 - #- pymdownx.tilde #아래첨자 단순화 - #- pymdownx.arithmatex # 수학적 표현 표시 - #- pymdownx.caret # ^ 기호로 글자 서식 추가 - #- pymdownx.critic # 내용추가,제거,비평 하이라이터 - #- pymdownx.b64 # base64 로 이미지를 html에 임베드 - #- pymdownx.escapeall # 모든 이스캐이프 허용 - #- abbr # 줄임말 표현 세부정보 붇이기 diff --git a/mkdocs_kr.yml b/mkdocs_kr.yml deleted file mode 100644 index dc7c055..0000000 --- a/mkdocs_kr.yml +++ /dev/null @@ -1,187 +0,0 @@ -# 사이트 기본 설정 -site_name: Quad 한국어 문서 -site_url: https://quad.qwreey.kr/kr/ -site_author: Qwreey and more -site_description: Description for Quad. (Korean) -copyright: Copyright © 2020 - 2023 Qwreey - -# 사이드바 -nav: - - 홈: - - 'index.md' - - 갤러리: 'gallery.md' - - 변경사항: 'changelogs.md' - - 라이선스: 'license.md' - - 로드맵: 'todo.md' - - 튜토리얼: - - tutorial/index.md - - Import: 'tutorial/1_import.md' - - Mount: 'tutorial/2_mount.md' - - GetObject: 'tutorial/3_getObject.md' - - Style: 'tutorial/4_style.md' - - Event: 'tutorial/5_event.md' - - Tween: 'tutorial/6_tween.md' - - QuadProperty: 'tutorial/7_quadProperty.md' - - Register: 'tutorial/8_register.md' - - Lang: 'tutorial/9_lang.md' - - Signal: 'tutorial/10_signal.md' - - Extend: 'tutorial/11_extend.md' - - 레퍼런스: - - 'reference/index.md' - - Signal: - - 'reference/signal/index.md' - - Bindable: 'reference/signal/bindable.md' - - Disconnecter: 'reference/signal/disconnecter.md' - - Store: - - 'reference/store/index.md' - - ObjectList: 'reference/store/objectList.md' - - Tween: - - 'reference/tween/index.md' - - TweenOptions: 'reference/tween/tweenOptions.md' - - Easings: 'reference/tween/easings.md' - - Directions: 'reference/tween/directions.md' - - Event: 'reference/event.md' - - Extend: 'reference/extend.md' - - Lang: 'reference/lang.md' - - Mounts: 'reference/mounts.md' - - QuadProperty: 'reference/quadProperty.md' - -extra: - # 다중 언어 설정 - alternate: - - name: 한국어 - link: /kr/ - lang: ko - - name: English - link: /en/ - lang: en - # 소셜 링크 - social: - - icon: fontawesome/brands/github - link: https://github.com/qwreey75 - - icon: fontawesome/brands/mastodon - link: https://stella.place/@qwreey - -# 리포 설정 -repo_url: https://github.com/qwreey75/Quad -repo_name: Quad -remote_branch: master - -# 사이트dir 설정, 저장소 하나로 관리하기 위해서 이렇게 씀 -docs_dir: md/kr -site_dir: docs/kr - -# 검색엔진 설정 -lang: multi # 한글이 없어서 어쩔 수 없이 묶음으로 사용 -min_search_length: 2 # 최소 검색 단위 - -# 테스팅 사이트 설정(로컬 서버) -dev_addr: '127.0.0.1:8080' - -# 추가 Css -extra_css: - - assets/extra.css - -# 다른 설정 -#extra: -# disqus: luakrdoc # 디스커스 설정 - -# 테마링 -theme: - # 기본 설정 - name: material - # mkdocs 덮어쓰기 폴더(일반적으로 없어도 됨) - # custom_dir: overrides - - # 테마 - palette: - - scheme: darker - toggle: - icon: material/brightness-3 - name: 밝은 테마로 변경 - # - scheme: dark - # toggle: - # icon: material/brightness-4 - # name: Switch to light theme - - scheme: default - toggle: - icon: material/brightness-7 - name: 어두운 테마로 변경 - - # 세부기능 Flag - features: - - navigation.indexes - - navigation.footer # 바닥에 다음글 표시 - - navigation.tabs # 최상위 nav 인덱스를 탭으로 이동 - - navigation.top # 맨 위로 올라가기 표시 - - toc.integrate # 목차를 네비게이션에 합치기 - - content.code.copy # 코드 복사버튼 - - # 결과 없음 페이지 - static_templates: - - 404.html - - # 언어/폰트 - language: ko - font: false - - # 아이콘 - favicon: assets/Quad_MiniLogo.png - logo: assets/Quad_MiniLogoWhite.svg - - # 일부 설정 - include_search_page: false - search_index_only: true - -plugins: - - search - -# Markdown 플러그인 -markdown_extensions: - # 컴포넌트 - - pymdownx.tabbed: # 탭 - alternate_style: true - - admonition # 노트라인 - - pymdownx.details # 더보기(확장 가능한 라벨) - - pymdownx.progressbar # 프로그래스 바 - - attr_list # ID 붙이기 - - def_list # 기본 리스트 - - # 기초 설정 - - footnotes # 바닥글 - - pymdownx.superfences # 스페이스 관련, 펜스 중첩허용 - - pymdownx.keys # 단축키(검색) - - pymdownx.magiclink # 링크 확장기 - - pymdownx.inlinehilite # 인라인 코드 하이라이팅 - - pymdownx.mark # 마킹(형광마커 효과) - - md_in_html # div 같은거 안에 마크다운 작성 - - pymdownx.highlight: # 코드 구문강조 - linenums: true # 코드라인 넘버 - - pymdownx.emoji: # 이모지 불러오기 - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - - pymdownx.tasklist: # 체크박스 불러오기 - custom_checkbox: true - - pymdownx.betterem: # 더 나은 글자 서식 알고리즘 - smart_enable: all - - pymdownx.smartsymbols: # 특수문자 쉬운입력 - fractions: false - - markdown_include.include: # 다른 md 파일 가져와서 보여주기 - base_path: md/kr - - # 기타 세부 설정 - - codehilite: # 코드 언어 추측 끄기 - guess_lang: false - - toc: # 부분 링크 허용 - permalink: true - - meta # 메타데이터 관련 - - # 사용되지 않는 플러그인 - #- pymdownx.snippets # 외부 md 로더 - #- pymdownx.tilde #아래첨자 단순화 - #- pymdownx.arithmatex # 수학적 표현 표시 - #- pymdownx.caret # ^ 기호로 글자 서식 추가 - #- pymdownx.critic # 내용추가,제거,비평 하이라이터 - #- pymdownx.b64 # base64 로 이미지를 html에 임베드 - #- pymdownx.escapeall # 모든 이스캐이프 허용 - #- abbr # 줄임말 표현 세부정보 붇이기 diff --git a/mock/Slot.txt b/mock/Slot.txt deleted file mode 100644 index dfc28d7..0000000 --- a/mock/Slot.txt +++ /dev/null @@ -1,22 +0,0 @@ - -Window { - Class.Slot "Content" { - Text { - Text = "wow"; - }; - Text { - Text = "wow"; - }; - Text { - Text = "wow"; - }; - Text { - Text = "wow"; - }; - } - TopbarButton { - [Class.Slot] = "Topbar"; - }; -} -다수가 있을경우 -이런식으로 묶을 수 있다고 하자 diff --git a/requirement.txt b/requirement.txt deleted file mode 100644 index c042c67..0000000 --- a/requirement.txt +++ /dev/null @@ -1,2 +0,0 @@ -markdown_include -mkdocs-material diff --git a/src/class.lua b/src/class.lua deleted file mode 100644 index 1069632..0000000 --- a/src/class.lua +++ /dev/null @@ -1,653 +0,0 @@ -local module = {} -local pack = table.pack -local match = string.match -local insert = table.insert -local gsub = string.gsub - ----@param shared quad_export ----@return quad_module_class -function module.init(shared) - local warn = shared.warn - ---@class quad_module_class - local new = {__type = "quad_module_class"} - local InstanceNew = Instance.new - local event = shared.Event ---@type quad_module_event - local bind = event.Bind - local store = shared.Store ---@type quad_module_store - local initStoreRegisterBinding = store.__initStoreRegisterBinding - local addObject = store.AddObject - local storeNew = store.New - local mount = shared.Mount ---@type quad_module_mount - local getHolder = mount.GetHolder - local mountfunc = mount.MountOne - local style = shared.Style ---@type quad_module_style - local styleList = style.Styles - local parseStyles = style.ParseStyles - local advancedTween = shared.Tween ---@type quad_module_tween - local round = shared.Round ---@type quad_module_round - local signal = shared.Signal ---@type quad_module_signal - local bindable = signal.Bindable - local PcallGetProperty = store.PcallGetProperty - - local function InstanceNewWithName(classname,parent,name) - local item = InstanceNew(classname,parent) - item.Name = name - return item - end - - local function GetProperty(item,index,ClassName) - if type(item) == "table" then return item[index] end - ClassName = ClassName or item.ClassName - local isImage = (ClassName == "ImageLabel" or ClassName == "ImageButton") - if (index == "RoundSize") and isImage then - if not round then - error("module 'round' needs to be loaded for get image round size but it is not found on 'src.libs'. you should adding that to src.libs directory") - end - return round.GetRound(item) - elseif index == "Corner" then - local target = (ClassName == "UICorner" and item) or item:FindFirstChildOfClass("UICorner") - return (target and target.CornerRadius.Offset) or 0 - elseif index == "PaddingAll" then - local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") - return (target and target.PaddingLeft) or UDim.new(0,0) - elseif index == "PaddingAllOffset" then - local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") - return (target and target.PaddingLeft.Offset) or 0 - elseif index == "Scale" then - local target = (ClassName == "UIScale" and item) or item:FindFirstChildOfClass("UIScale") - return (target and target.Scale) or 1 - end - return item[index] - end - new.GetProperty = GetProperty - - local function SetProperty(item,index,value,ClassName) - -- if it is not a roblox instance, just call __index - if type(item) == "table" then - item[index] = value - return - end - - -- check class name - ClassName = ClassName or item.ClassName - -- check is ImageLabel or ImageButton - local isImage = (ClassName == "ImageLabel" or ClassName == "ImageButton") - - -- Round Image - if index == "RoundSize" and isImage then - if not round then - error("[QUAD] module 'round' needs to be loaded for set image round size but it is not found on 'src.libs'. you should adding that to src.libs directory") - end - round.SetRound(item,value) - -- UIRound - elseif index == "Corner" then - local uiCorner = (ClassName == "UICorner" and item) or item:FindFirstChildOfClass("UICorner") or InstanceNewWithName("UICorner",item,"_quad_round") - uiCorner.CornerRadius = UDim.new(0,value) - -- PaddingAll - elseif index == "PaddingAll" then - local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding") - target.PaddingLeft = value - target.PaddingRight = value - target.PaddingTop = value - target.PaddingBottom = value - -- PaddingAll with Offset - elseif index == "PaddingAllOffset" then - local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding") - local padding = UDim.new(0,value) - target.PaddingLeft = padding - target.PaddingRight = padding - target.PaddingTop = padding - target.PaddingBottom = padding - -- Scale - elseif index == "Scale" then - local target = (ClassName == "UIScale" and item) or item:FindFirstChildOfClass("UIScale") or InstanceNewWithName("UIScale",item,"_quad_scale") - target.Scale = value - else - -- other, just set property - item[index] = value - end - end - new.SetProperty = SetProperty - - local function Link(linker,item,index,indexType) - -- error("Not implemented") - - local target = linker.lvalue - local name = linker.key - - -- local target = linker.target - -- local name = linker.name - if indexType == "number" then - -- set - -- if rawget(target,name) ~= nil then - -- warn(("%s is exist already. Overwrite it")) - -- end - rawset(target,name,item) - -- target[name] = item - elseif indexType == "string" then - local targetSignal = target:GetPropertyChangedSignal(name) - local fire = PcallGetProperty(targetSignal,"Fire") - local ok = fire and bind(item,index,function(...) - fire(targetSignal,...) - end,"function") - if not ok then - warn("Failed to bind linker event") - end - end - end - - local function ProcessQuadProperty(processedProperty,iprop,holder,item,className,index,value) - if processedProperty[index] then - return - end - - local valueType = typeof(value) - local indexType = typeof(index) - local quadType = valueType == "table" and PcallGetProperty(value,"__type") - - if indexType == "number" and quadType == "quad_register" then - -- linking - Link(value,item,index,indexType) - elseif indexType == "string" and quadType == "quad_register" then - -- register (bind to store event) - - processedProperty[index] = true -- ignore next - - -- store reading - do - local setValue = value:CalcWithDefault(item) - if setValue == nil then - warn "[Quad] register return value must not be nil, but got nil. did you inited values before?" - end - SetProperty(item,index,setValue,className) - end - - -- adding handle function (binding) - local function regFn(_,newValue,key) - local setValue,tween = value:CalcWithNewValue(item,newValue,key) - if tween then - if not advancedTween then - warn "[QUAD] Failed to execute register handler function. (Real Instance was not updated)" - return warn "[QUAD] module 'AdvancedTween' needs to be loaded for tween properties but it is not found on 'src.libs'. you should adding that to src.libs directory.\nPossible reason : Cloned repository without recursive option. => 'git submodule init ; git submodule update' to get submodules" - end - -- local ended, onStepped - -- if tween.Ended then - -- ended = function (...) - -- tween.Ended(item,...) - -- end - -- end - -- if tween.OnStepped then - -- onStepped = function (...) - -- tween.OnStepped(item,...) - -- end - -- end - advancedTween.RunTween(item,tween,{[index] = setValue},nil,nil,SetProperty,GetProperty) - else - SetProperty(item,index,setValue,className) - end - end - value:Register(regFn) - - -- this is using hacky of roblox instance - -- this is will keep reference from week table until - -- inscance got GCed - item:GetPropertyChangedSignal("ClassName"):Connect(regFn) - elseif (valueType == "function" or valueType == "table") and indexType == "string" and bind(item,index,value,valueType) then -- connect event - -- event binding - elseif indexType == "string" then - processedProperty[index] = true -- ignore next - -- prop set - SetProperty(item,index,value,className) - elseif indexType == "number" and valueType == "table" and quadType == "quad_style" then -- style - -- style parsing - for _,thisStyle in ipairs(parseStyles(value)) do - if not processedProperty[thisStyle] then - processedProperty[thisStyle] = true - for styleIndex,styleValue in pairs(thisStyle) do - if PcallGetProperty(styleValue,"__type") ~= "quad_style" then - ProcessQuadProperty(processedProperty,iprop,holder,item,className,styleIndex,styleValue) - end - end - end - end - elseif indexType == "number" and valueType ~= "boolean" then -- object - -- child object - if iprop ~= 1 then - value = value:Clone() - end - mountfunc(item,value,holder,true) - end - end - - -- make object that from instance, class and more - function new.Make(ClassName,...) -- render object - -- make object from ClassName - local item - local classOfClassName = type(ClassName) - if classOfClassName == "string" then -- if classname is a string value, cdall instance.new for making new roblox instance - item = InstanceNew(ClassName) - elseif classOfClassName == "function" then -- if classname is a function value, call it for making new object (OOP object) - item = ClassName() - elseif classOfClassName == "table" then -- if classname is a calss what is included new function, call it for making new object (object) - local func = ClassName.new or ClassName.New or ClassName.__new - if ClassName.__noSetup then -- if is support initing props - local childs,props,parsed,binds,links,processed,styles = {},pack(...),{},{},{},{},{} - for iprop = props.n,1,-1 do - local prop = props[iprop] - if prop then - for i,v in pairs(prop) do - local quadType = PcallGetProperty(v,"__type") - if bind(i) then - binds[i] = v - elseif quadType == "quad_linker" then - links[i] = v - elseif quadType == "quad_style" then - insert(styles,v) - elseif type(i) == "number" then - insert(childs,(iprop == 1) and v or v:Clone()) - else - processed[i] = true - parsed[i] = v - end - end - end - end - for _,v in ipairs(styles) do - for _,thisStyle in ipairs(parseStyles(v)) do - for styleIndex,styleValue in pairs(thisStyle) do - if not processed[styleIndex] then - processed[styleIndex] = true - parsed[styleIndex] = styleValue - end - end - end - end - item = func(parsed) - local holder = getHolder(item) - for _,v in ipairs(childs) do - mountfunc(item,v,holder) - end - for i,v in pairs(links) do - Link(v,item,i,type(i)) - end - for i,v in pairs(binds) do - bind(item,i,v) - end - return item - end - item = func() - end - if not item then -- if cannot make new object, ignore this call - local str = tostring(ClassName) - warn(("[Quad] fail to make item '%s', did you forget to checking the class '%s' is exist?"):format(str,str)) - end - - -- set property and adding child and binding functions - local holder = getHolder(item) -- to __holder or holder or it self (for tabled) - -- for iprop,prop in ipairs({...}) do - local propsListArray = pack(...) - local processedProperty = {} - for iprop = 1,propsListArray.n do - local prop = propsListArray[iprop] - if prop then - local binding = {} - -- set property - for index,value in pairs(prop) do - if bind(index) then - binding[index] = value - elseif type(index) ~= "number" then - ProcessQuadProperty(processedProperty,iprop,holder,item,ClassName,index,value) - end - end - -- childs - for index,value in ipairs(prop) do - ProcessQuadProperty(processedProperty,iprop,holder,item,ClassName,index,value) - end - -- bindings - for index,value in pairs(binding) do - bind(item,index,value) - end - end - end - return item - end - local make = new.Make - - -- import quad object - function new.Import(ClassName,defaultProperties) -- make new quad class object - if type(ClassName) == "userdata" and ClassName.ClassName == "ModuleScript" then - ClassName = require(ClassName) - end - local this = defaultProperties or {} - setmetatable(this,{ - __type = "quad_imported_class", - __call = function (self,prop,...) - local propType = type(prop) - if propType == "string" then - local lastName = prop - return function (nprop,...) - nprop = nprop or {} - if not nprop.Name then - nprop.Name = gsub(gsub(match(lastName,"[^,]+")," +$",""),"^ +","") - end - for styleName,styleObj in pairs(styleList) do - if match(prop,styleName) then - insert(nprop,styleObj) - end - end - local item = make(ClassName,nprop,...,this) - addObject(lastName,item) - return item - end - elseif propType == "nil" then - return make(ClassName,this) - end - return make(ClassName,prop,...,this) - end - }) - return this - end - - -- set module calling function - setmetatable(new,{ - __call = function (self,...) - return new.Import(...) - end - }) - - -- local function Linker(target,name) - -- return { - -- __type = "quad_linker"; - -- target = target; - -- name = name; - -- } - -- end - - -- make class - function new.Extend() - local this = {__type = "quad_extend"} - - --- make new object - function this.New(prop) - -- make metatable - prop = storeNew(prop,nil) - local parent = prop and (prop.Parent or prop.parent) - local self = { - __prop = prop; - __parent = parent; - ChildAdded = signal.Bindable.New(); - } - local init = this.Init - if init then - init(self,prop) - end - setmetatable(self,this) - initStoreRegisterBinding(prop,self,self) - - -- render that - local object = self:Render(prop) - rawset(self,"__object",object) - rawset(self,"__holder",object) - if parent then - rawset(self,"__parent",parent) - mountfunc(self,parent) - end - -- prevent gc - ((type(object) == "table" and object.__object) or object) - :GetPropertyChangedSignal "ClassName":Connect(function() - return self - end) - - --after render - local afterRender = this.AfterRender - if afterRender then - afterRender(self,object,prop) - end - return self - end - - -- default function from props - function this:Default(key,value) - if self == this then - error("prop handler not found (this method cannot be used on class)") - end - self.__prop:Default(key,value) - end - - function this:GetPropertyChangedSignal(propertyName) - local propertySignalList = rawget(self,"__propertyChangedSignals") - if not propertySignalList then - propertySignalList = {} - rawset(self,"__propertyChangedSignals",propertySignalList) - end - - local thisSignal = propertySignalList[propertyName] - if thisSignal then - return thisSignal - end - thisSignal = bindable.New() - propertySignalList[propertyName] = thisSignal - return thisSignal - end - - function this:EmitPropertyChangedSignal(propertyName,value) - local propertySignalList = rawget(self,"__propertyChangedSignals") - if not propertySignalList then - return - end - - local thisSignal = propertySignalList[propertyName] - if not thisSignal then - return - end - if not value then - value = self[propertyName] - end - thisSignal:Fire(value) - end - - function this:GetChildren(slotName) - if slotName then - local slot = rawget(slotName,"__slot") - if not slot then return {} end - local newSlot = {} - for _,v in pairs(slot) do - insert(newSlot,v) - end - return slot - end - local children = rawget(self,"__child") - if not children then return {} end - local newChildren = {} - for _,v in pairs(children) do - insert(newChildren,v) - end - return newChildren - end - - --- re-render object (if some props chaged, call this to render again) - function this:Update() -- swap object - local object = rawget(self,"__object") -- get last instance - local parent = object and object.Parent -- date parent - if not object then - parent = rawget(self,"__parent") - end - local lastObject = object - if lastObject then - lastObject.Parent = nil - end - - object = self:Render(self.__prop) -- new instance - rawset(self,"__holder",object) - rawset(self,"__object",object) - object.Parent = getHolder(parent) -- update parent - - -- restore childs - local child = rawget(self,"__child") - if child then - for _,v in pairs(child) do - if v then - v.Parent = object - end - end - end - - -- prevnet gc - ((type(object) == "table" and object.__object) or object):GetPropertyChangedSignal "ClassName":Connect(function() - return self - end) - if lastObject then -- remove old instance - self:Destroy(lastObject) - end - - --after render - local afterRender = this.AfterRender - if afterRender then - afterRender(self,object) - end - end - - -- define destroy method - function this:Destroy(object) - local unload = this.Unload - object = object or rawget(self,"__object") - if object then - if unload then - unload(self,object) - else - local destroy = (object.Destroy or object.destroy) - if destroy then - pcall(destroy,object) - end - end - end - end - - --- link to new - function this.__call(self,...) - if self == this then - return (self.new or self.New or self.__new)(...) - end - - local name = select(1,...) - if type(name) ~= "string" then - error(("Name must be string, but got %s"):format(type(name))) - end - -- return Linker(self,name) - local register = self.__props(name) - register:Link(self) - return register - end - - -- indexer (getter) - function this:__index(k) - local getter = this.Getter[k] - if getter then - return getter(self,rawget(self,"__object")) - end - - -- from this (have more priority) - local fromThis = this[k] - if fromThis then - return fromThis - end - - -- from prop, not start with '_' (private value) - if k:sub(1,1) ~= "_" then - return self.__prop[k] - end - end - - --- new indexer (setter) - function this:__newindex(k,v) - -- from setter - local setter = this.Setter[k] - if setter then - return setter(self,v,rawget(self,"__object")) - end - - -- is private (self value) - if k:sub(1,1) == "_" then - return rawset(self,k,v) - end - - -- prop update - local lastValue = self[k] - self.__prop[k] = v - if this.UpdateTriggers[k] then - self:Update() - end - - -- call PropertyChangedSignal - if lastValue ~= v then - self:EmitPropertyChangedSignal(k,v) - end - end - - this.Getter = { - Parent = function(self) - return rawget(self,"__parent") - end - } - this.Setter = { - Parent = function(self,parent,object) - rawset(self,"__parent",parent) - if object then - object.Parent = getHolder(parent) - end - end - } - this.UpdateTriggers = {} - this.__noSetup = true - return this - end - - local function ApplyNewProps(Item,NewProps) - local quadType = PcallGetProperty(Item, "__type") - if quadType == "quad_extend" then - local prop = Item.__prop - local propKeep = prop.__keep - local propTweens = prop.__tweens - local propValues = prop.__self - for index,value in pairs(NewProps) do - -- if new value is register - if PcallGetProperty(value,"__type") == "quad_register" then - -- remove old register - for keepIndex,keepValue in pairs(propKeep) do - if type(keepValue) == "table" and PcallGetProperty(keepValue,"key") == index then - keepValue.register:Unregister(keepValue.func) - propKeep[keepIndex] = nil - end - end - - -- calc value - do - local setValue,tween = value:CalcWithDefault(Item) - propValues[index] = setValue - propTweens[index] = tween - end - - -- make event connection - local function regFn(_,newValue,eventKey) - -- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY - local setValue = value:CalcWithNewValue(Item,newValue,eventKey) - prop[index] = setValue - end - value:Register(regFn) - insert(propKeep,{func=regFn,register=value,key=index}) - end - - end - end - end - local function Apply(Item) - return function (Props) - ApplyNewProps(Item,Props) - end - end - new.Apply = Apply - - return new -end - -return module diff --git a/src/event.lua b/src/event.lua deleted file mode 100644 index 8fb2da6..0000000 --- a/src/event.lua +++ /dev/null @@ -1,105 +0,0 @@ -local module = {} -local unpack = table.unpack -local wrap = coroutine.wrap -local sub = string.sub -local match = string.match - ----@param shared quad_export ----@return quad_module_event -function module.init(shared) - local warn = shared.warn - ---@class quad_module_event - local new = {__type = "quad_module_event"} - - local prefix = "Event::" - local special = { - ["Property::(.+)"] = function (this,func,property) - this:GetPropertyChangedSignal(property):Connect(function() - func(this,this[property]) - end) - end; - ["CreatedSync::"] = function (this,func) - func(this) - end; - ["CreatedAsync::"] = function (this,func) - wrap(func)(this) - end; - } - - local prefixLen = #prefix - setmetatable(new,{ - __call = function(self,eventName) - return prefix .. eventName - end; - __index = function(self,key) - if key == "createdSync" then - warn "[Quad] event.createdSync is deprecated. Use event.created instead" - return self.created - end - end; - }) - - -- try binding, if key dose match with anything, ignore call - function new.Bind(this,key,func,typefunc) - if not key then - key = this - this = nil - end - - -- if is advanced binding (self setted) - typefunc = typefunc or type(func) - local self - if typefunc == "table" then - local t = func - self = t.self - func = t.func - if not self then self = t[1] end - if not func then func = t[2] end - end - -- check prefix - if sub(key,1,prefixLen) ~= prefix then - return - end - key = sub(key,prefixLen + 1,-1) - - -- find special bindings - for specKey,specFunc in pairs(special) do - local find = {match(key,specKey)} - if #find ~= 0 then - if func then - specFunc(this,func,unpack(find)) - end - return true - end - end - - -- binding normal events - if this then - local event = this[key] - if event then - if func then - event:Connect(function(...) - func(self or this,...) - end) - end - return true - end - end - - return true - end - - -- property changed binding - local prefixProperty = prefix .. "Property::" - function new.Prop(name) - return prefixProperty .. name - end - - -- when created binding - new.CreatedAsync = prefix .. "CreatedAsync::" - new.Created = prefix .. "CreatedSync::" - - return new -end - -return module \ No newline at end of file diff --git a/src/exports.lua b/src/exports.lua deleted file mode 100644 index f74e65c..0000000 --- a/src/exports.lua +++ /dev/null @@ -1,76 +0,0 @@ ----@class quad -local module = {} - --- TODO: outside ui building --- if not Instance then --- print("Instance is not exist, Using custom Instance and print result as string . . .") --- end - -local require = require(script.Parent.libs.require) -local style = require "style" -local event = require "event" -local store = require "store" -local class = require "class" -local mount = require "mount" -local signal = require "signal" -local lang = require "lang" - --- submodule -local advancedTween = require "libs.AdvancedTween" -local round = require "libs.round" -local customWarn = require "libs.customWarn" - -local IS_TEST = false -local VER = "2.25" .. (IS_TEST and "B" or "") -if IS_TEST then - warn("You are using BETA version of quad now. Many features may change in the future and unstable. AS USING BETA VERSION OF QUAD, YOU SHOULD KNOW IT WILL BUGGY SOMETIME. still on development - you can ignore this message if have no issue. if you have issue on using quad, please report issue on github. VERSION: "..VER) -end -module.VER = VER - -local idSpace = {} - ----@return quad_export this ----@return quad_module_round round ----@return quad_module_tween tween -function module.Init(id) - -- return old items - if id then - local this = idSpace[id] - if this then - return this,this.round,this.class,this.mount,this.store,this.event,this.tween - end - end - - ---@class quad_export - local this = {__type = "quad_module_init"} - - this.require = require - this.warn = customWarn or warn - this.Round = type(round) == "table" and round ---@type quad_module_round - this.Tween = type(advancedTween) == "table" and advancedTween ---@type quad_module_tween - this.Signal = signal.init(this) ---@type quad_module_signal - this.Style = style.init(this) ---@type quad_module_style - this.Event = event.init(this) ---@type quad_module_event - this.Store = store.init(this) ---@type quad_module_store - this.Mount = mount.init(this) ---@type quad_module_mount - this.Class = class.init(this) ---@type quad_module_class - this.Lang = lang.init(this) ---@type quad_module_lang - - -- save - if id then - idSpace[id] = this - end - - return this -end - -local function cleanup(space) - -- TODO : Destroy objects -end - -function module.Uninit(id) - pcall(cleanup,idSpace[id]) - idSpace[id] = nil -end - -return module diff --git a/src/init.lua b/src/init.lua deleted file mode 100644 index 22ff303..0000000 --- a/src/init.lua +++ /dev/null @@ -1,345 +0,0 @@ - -------------------- --- module_class -------------------- -export type extend = { - Getter: {[string]: ()->(any?)?}; - Setter: {[string]: (value:any)->()?}; - New: (prop:DOM_constructor)->DOM|any; - Init: (self:extend,props:valueStore)->(); - Render: (self:extend,props:valueStore)->(DOM|any); - AfterRender: (self:extend,item:DOM|any,props:valueStore)->(); - GetPropertyChangedSignal: (self:extend,propertyName:string)->signal; - EmitPropertyChangedSignal: (self:extend,propertyName:string,...any)->(); - Update: (self:extend)->(); - Destroy: (self:extend)->(); - UpdateTriggers: {[string]:boolean?}; - Unload: (self:extend,object:DOM|any)->(); - GetChildren: (self:extend)->({DOM|any}); - ChildAdded: signal; -} -export type DOM = { - [string]: any; - Destroy: (self:DOM)->(); - GetPropertyChangedSignal: (self:DOM,propertyName:string)->(RBXScriptSignal|signal); - Update: (self:DOM)->(); -}|extend; -export type DOM_constructor = { - [event]: - (DOM,...any)->() - &{self: any,func: (...any)->(...any)}; -} & { [number]: DOM|style; } -& { [string]: any|register; } -export type DOM_creator = (DOM_constructor,...DOM_constructor)->DOM -export type imported = - {[string]:any} - &(ids:ObjectIdList)->DOM_creator - &DOM_creator -export type import = (ClassName:string|ModuleScript|extend|()->()|{any},defaultProperties:DOM_constructor?)->imported -export type module_class = { - Extend: ()->extend; - Import: import; - GetProperty: (item:extend|any,index:string,ClassName:string?)->any; - SetProperty: (item:extend|any,index:string,value:any,ClassName:string?)->(); - Make: (ClassName:string|(...any)->any|extend,...{any})->any; -} & import - -------------------- --- module_event -------------------- -export type event = string -export type module_event = { - Prop: (propName:string)->event; - CreatedAsync: event; - Created: event; - Bind: (this:DOM|any,key:event|string,func:(...any)->(),typefunc:string?)->(); -} & (eventName:string)->event; - -------------------- --- module_signal -------------------- -export type connection = { - Disconnect: (self:connection)->(); - Destroy: (self:connection)->(); - New: (signal,(...any)->())->(); -} -export type signal = { - Fire: (self:signal,...any)->(); - Wait: (self:signal)->(); - CheckConnected: (self:signal,(...any)->())->boolean; - Connect: (self:signal,(...any)->())->connection; - Once: (self:signal,(...any)->())->connection; - Destroy: (self:signal)->(); - New: (id:string?)->signal; -} -export type disconnecter = { - Add: (self:disconnecter,connection:RBXScriptConnection)->(); - Destroy: (self:disconnecter)->(); - Disconnect: (self:disconnecter)->(); - New: (id:string?)->disconnecter; -} -export type module_signal = { - Disconnecter: disconnecter; - Bindable: signal; -} - -------------------- --- module_register -------------------- -export type register = { - Register: (self:register,()->())->(); - With: (self:R®ister,handler:{any}|(store:valueStore,value:any,key:any,item:DOM)->any)->R®ister; - Default: (self:R®ister,value:any)->R®ister; - Add: (self:R®ister,value:any)->R®ister; - Tween: (self:R®ister,tween:TweenOptions)->R®ister; -} -export type valueStore = {[any]:any,Default:(key:string,value:any)->()}&(key:string)->register -export type objectList = { - Each: (self:objectList,(item:DOM|any,index:number)->())->(); - EachSync: (self:objectList,(item:DOM|any,index:number)->())->(); - Remove: (self:objectList,index:number|DOM)->(DOM?,number?); - IsEmpty: (self:objectList)->boolean; -} -export type ObjectIdList = string -export type module_store = { - GetObjects: (ids:ObjectIdList)->objectList; - GetObject: (id:string)->DOM?; - AddObject: (ids:ObjectIdList,item:Dom|any)->(); - GetStore: (id:string?)->valueStore; -} & (id:string?)->valueStore - -------------------- --- module_style -------------------- -export type style = {} -export type module_style = { - New: (props:{[string]:any})->style; -} & (props:{[string]:any})->style - -------------------- --- module_mount -------------------- -export type mount = { - Unmount: (self:mount)->(); -} -export type mounts = mount & { - Add: (self:mount,...DOM|any)->(); -} -export type module_mount = { - MountOne: (to:DOM|any,object:DOM|any,holder:DOM|any?,noReturn:boolean?)->mount; - GetHolder: (item:DOM|any)->any?; -} & (to:DOM|any,object:DOM|any,holder:DOM|any?)->mounts - -------------------- --- module_tween -------------------- -export type TweenOnStepped = (Item:DOM|any,Alpha:number,AbsolutePercent:number)->() -export type TweenEnded = (Item:DOM|any)->() -export type TweenSetter = (Item:DOM|any,Property:string,Value:Lerpable)->() -export type TweenGetter = (Item:DOM|any,Property:string)->any -export type TweenOptions = { - Easing: "Linear" - |"Quint" - |"Quart" - |"Cubic" - |"Quad" - |"Sin" - |"Circle" - |"Expo" - |"Elastic" - |"Bounce" - |"Back" - |"Exp2" - |"Exp4" - |EasingFunction?; - Direction: "Out"|"InOut"|"In"|EasingDirection?; - CallBack: {[number|"*"|string]:(Item:DOM|any,Alpha:number,AbsolutePercent:number)->()}?; - OnStepped: TweenOnStepped?; -- Same as CallBack{["*"]:()->()} But faster then CallBack due to table loop - Ended: TweenEnded?; - Getter: TweenGetter?; - Setter: TweenSetter?; - Time: number?; -} -export type EasingFunction = {run:(number)->number,[any]:any} -export type EasingFunctions = { - Linear: EasingFunction; ---직선, Linear. i=x, x=0 to 1 - Quint: EasingFunction; ---5제곱, Quint. (^5) i=1-(1-x)^5, x=0 to 1 - Quart: EasingFunction; ---4제곱, Quart. (^4) i=1-(1-x)^4, x=0 to 1 - Cubic: EasingFunction; ---3제곱, Cubic. (^3) i=1-(1-x)^3, x=0 to 1 - Quad: EasingFunction; ---2제곱, Quad. (^2) i=1-(1-x)^2, x=0 to 1 - Sin: EasingFunction; ---사인파, Sin. i=sin(x*pi/2), x=0 to 1 - Circle: EasingFunction; ---사분원, Circle. i=sqrt(1-(1-x)^2), x=0 to 1 - Expo: EasingFunction; ---지수함수, Expo. i=1-2^(-10*x), x=0 to 1 - Elastic: EasingFunction; ---탄성, Elastic. - Bounce: EasingFunction; ---튀어오름, Bounce - Back: EasingFunction; ---뒤로 움직임, Back - - -- Old things - Exp2: EasingFunction; ---덜 가파른 지수. i=exp(x)/max, x=-4 to 2 - Exp4: EasingFunction; ---더 가파른 지수. i=exp(x)/max, x=-4 to 4 -} -export type EasingDirection = string -export type EasingDirections = { - Out: EasingDirection&"Out"; - In: EasingDirection&"In"; - InOut: EasingDirection&"InOut"; -} -export type Lerpable = Color3|UDim|UDim2|number|Vector2|Vector3|CFrame -export type TweenHandler = ()->(); -export type module_tween = { - EasingFunctions:EasingFunctions; - Easings:EasingFunctions; - EasingDirections:EasingDirections; - Directions:EasingDirections; - LerpProperties: (item:item&(DOM|any),old:{[string]:Lerpable},new:{[string]:Lerpable},alpha:number,setter:(item:item&(DOM|any),property:string,value:Lerpable)->()?)->(); - RunTween: (Item:DOM|any,Option:TweenOptions,Properties:{[string]:Lerpable},Ended:TweenEnded?,OnStepped:TweenOnStepped?,Setter:TweenSetter?,Getter:TweenGetter?)->TweenHandler; - RunTweens: (Items:{[number]:DOM|any},Option:TweenOptions,Properties:{[string]:Lerpable},Ended:TweenEnded?,OnStepped:TweenOnStepped?,Setter:TweenSetter?,Getter:TweenGetter?)->(); - StopTween: (ItemOrStep:TweenHandler|DOM|any)->(); - StopPropertyTween: (Item:DOM|any,PropertyName:string)->(); - IsTweening: (ItemOrStep:TweenHandler|DOM|any)->boolean; - IsPropertyTweening: (Item:DOM|any,PropertyName:string)->boolean; -} - -------------------- --- module_round -------------------- -export type module_round = { - SetRound: (ImageFrame:ImageLabel|ImageButton,RoundSize:number)->(ImageLabel|ImageButton); - SetOutline: (ImageFrame:ImageLabel|ImageButton,RoundSize:number)->(ImageLabel|ImageButton); - GetRound: (ImageFrame:ImageLabel|ImageButton)->number; - GetOutline: (ImageFrame:ImageLabel|ImageButton)->number; -} - -------------------- --- module_signal -------------------- -export type langOptions = { - [string]: register|string|number|any; -} -export type langHandler = { - [string]: string|(langOptions:langOptions)->string; -} -export type Locale = string -export type module_lang = { - New: (id:string,handlers:{ - ["default"]: langHandler; - ["en-us"]: langHandler; - ["es-es"]: langHandler; - ["fr-fr"]: langHandler; - ["id-id"]: langHandler; - ["it-it"]: langHandler; - ["ja-jp"]: langHandler; - ["ko-kr"]: langHandler; - ["ru-ru"]: langHandler; - ["th-th"]: langHandler; - ["tr-tr"]: langHandler; - ["vi-vn"]: langHandler; - ["pt-br"]: langHandler; - ["de-de"]: langHandler; - ["zh-cn"]: langHandler; - ["zh-tw"]: langHandler; - ["bg-bg"]: langHandler; - ["bn-bd"]: langHandler; - ["cs-cz"]: langHandler; - ["da-dk"]: langHandler; - ["el-gr"]: langHandler; - ["et-ee"]: langHandler; - ["fi-fi"]: langHandler; - ["hi-in"]: langHandler; - ["hr-hr"]: langHandler; - ["hu-hu"]: langHandler; - ["ka-ge"]: langHandler; - ["kk-kz"]: langHandler; - ["km-kh"]: langHandler; - ["lt-lt"]: langHandler; - ["lv-lv"]: langHandler; - ["ms-my"]: langHandler; - ["my-mm"]: langHandler; - ["nb-no"]: langHandler; - ["nl-nl"]: langHandler; - ["fil-ph"]: langHandler; - ["pl-pl"]: langHandler; - ["ro-ro"]: langHandler; - ["uk-ua"]: langHandler; - ["si-lk"]: langHandler; - ["sk-sk"]: langHandler; - ["sl-sl"]: langHandler; - ["sq-al"]: langHandler; - ["bs-ba"]: langHandler; - ["sr-rs"]: langHandler; - ["sv-se"]: langHandler; - ["ar-001"]: langHandler; - })->(); - Locales: { - Default: "default"; - English: Locale & "en-us"; - Spanish: Locale & "es-es"; - French: Locale & "fr-fr"; - Indonesian: Locale & "id-id"; - Italian: Locale & "it-it"; - Japanese: Locale & "ja-jp"; - Korean: Locale & "ko-kr"; - Russian: Locale & "ru-ru"; - Thai: Locale & "th-th"; - Turkish: Locale & "tr-tr"; - Vietnamese: Locale & "vi-vn"; - Portuguese: Locale & "pt-br"; - German: Locale & "de-de"; - ChineseSimplified: Locale & "zh-cn"; - ChineseTraditional: Locale & "zh-tw"; - Bulgarian: Locale & "bg-bg"; - Bengali: Locale & "bn-bd"; - Czech: Locale & "cs-cz"; - Danish: Locale & "da-dk"; - Greek: Locale & "el-gr"; - Estonian: Locale & "et-ee"; - Finnish: Locale & "fi-fi"; - Hindi: Locale & "hi-in"; - Croatian: Locale & "hr-hr"; - Hungarian: Locale & "hu-hu"; - Georgian: Locale & "ka-ge"; - Kazakh: Locale & "kk-kz"; - Khmer: Locale & "km-kh"; - Lithuanian: Locale & "lt-lt"; - Latvian: Locale & "lv-lv"; - Malay: Locale & "ms-my"; - Burmese: Locale & "my-mm"; - Bokmal: Locale & "nb-no"; - Dutch: Locale & "nl-nl"; - Filipino: Locale & "fil-ph"; - Polish: Locale & "pl-pl"; - Romanian: Locale & "ro-ro"; - Ukrainian: Locale & "uk-ua"; - Sinhala: Locale & "si-lk"; - Slovak: Locale & "sk-sk"; - Slovenian: Locale & "sl-sl"; - Albanian: Locale & "sq-al"; - Bosnian: Locale & "bs-ba"; - Serbian: Locale & "sr-rs"; - Swedish: Locale & "sv-se"; - Arabic: Locale & "ar-001"; - }; - CurrentLocale: Locale; - FailedMessage: string; -} & (id:string)->(langOptions)->register; - -------------------- --- module -------------------- -export type module_exported = { - Signal: module_signal; - Round: module_round; - Tween: module_tween; - Style: module_style; - Event: module_event; - Store: module_store; - Mount: module_mount; - Class: module_class; - Lang: module_lang; -} -export type module = { - Uninit: (QuadId:string)->(); - Init: (QuadId:string?)->module_exported; -} - -return require(script.exports)::module diff --git a/src/lang.lua b/src/lang.lua deleted file mode 100644 index 1243213..0000000 --- a/src/lang.lua +++ /dev/null @@ -1,249 +0,0 @@ -local module = {} - -local insert = table.insert -local gsub = string.gsub - -function module.init(shared) - ---@class quad_module_lang - local new = {} - local warn = shared.warn - local store = shared.Store - local PcallGetProperty = store.PcallGetProperty - - new.Locales = { - ["Default"] = "default"; - ["English"] = "en-us"; - ["Spanish"] = "es-es"; - ["French"] = "fr-fr"; - ["Indonesian"] = "id-id"; - ["Italian"] = "it-it"; - ["Japanese"] = "ja-jp"; - ["Korean"] = "ko-kr"; - ["Russian"] = "ru-ru"; - ["Thai"] = "th-th"; - ["Turkish"] = "tr-tr"; - ["Vietnamese"] = "vi-vn"; - ["Portuguese"] = "pt-br"; - ["German"] = "de-de"; - ["ChineseSimplified"] = "zh-cn"; - ["ChineseTraditional"] = "zh-tw"; - ["Bulgarian"] = "bg-bg"; - ["Bengali"] = "bn-bd"; - ["Czech"] = "cs-cz"; - ["Danish"] = "da-dk"; - ["Greek"] = "el-gr"; - ["Estonian"] = "et-ee"; - ["Finnish"] = "fi-fi"; - ["Hindi"] = "hi-in"; - ["Croatian"] = "hr-hr"; - ["Hungarian"] = "hu-hu"; - ["Georgian"] = "ka-ge"; - ["Kazakh"] = "kk-kz"; - ["Khmer"] = "km-kh"; - ["Lithuanian"] = "lt-lt"; - ["Latvian"] = "lv-lv"; - ["Malay"] = "ms-my"; - ["Burmese"] = "my-mm"; - ["Bokmal"] = "nb-no"; - ["Dutch"] = "nl-nl"; - ["Filipino"] = "fil-ph"; - ["Polish"] = "pl-pl"; - ["Romanian"] = "ro-ro"; - ["Ukrainian"] = "uk-ua"; - ["Sinhala"] = "si-lk"; - ["Slovak"] = "sk-sk"; - ["Slovenian"] = "sl-sl"; - ["Albanian"] = "sq-al"; - ["Bosnian"] = "bs-ba"; - ["Serbian"] = "sr-rs"; - ["Swedish"] = "sv-se"; - ["Arabic"] = "ar-001"; - } - - local function GetLocale() - return game:GetService("LocalizationService").RobloxLocaleId - end - local function PcallGetLocale() - local passed,result = pcall(GetLocale) - if passed then return result end - return false - end - - local CurrentLocale = PcallGetLocale() or "en_us" - local FailedMessage = "" - - local weak = {__mode = "v"} - local lang = {} - local langList = {} - lang.__index = lang - function lang.New(id,handlers) - local this = { - handlers=handlers; - id=id; - store=store.New(); - index=1; - registers = setmetatable({},weak); - } - langList[id] = this - if not handlers[new.Locales.Default] then - warn(("Localization %s have no Default value, Did you missed '[Lang.Locales.Default] = ...' ? It may make Localization fail on other languages")) - end - setmetatable(this,lang) - end - - -- read options, and make string and save into store for updating - function lang.Update(valueStore,handler,index,options) - if not index then - error(("Index must be a number, but got %s"):format(type(index))) - end - index = tostring(index) - - -- parsing options - local parsedOptions = {} - for optionName,option in pairs(options) do - local quadType = PcallGetProperty(option,"__type") - local optionType = type(option) - local formatted - if quadType == "quad_register" then - formatted = option:CalcWithDefault(nil) - elseif optionType == "number" then - if option%1 == 0 then - -- int - formatted = ("%d"):format(option) - else - -- float - formatted = tostring(option) - end - else - formatted = tostring(option) - end - parsedOptions[optionName] = formatted - end - - -- set store value - local handlerType = type(handler) - if handlerType == "function" then - valueStore[index] = handler(parsedOptions) - elseif handlerType == "string" then - valueStore[index] = gsub(handler,"{(.-)}",parsedOptions) - end - end - local Update = lang.Update - - function lang:UpdateAll() - -- find handler - local handler = self.handlers[CurrentLocale] - if not handler then - handler = self.handlers[new.Locales.Default] - end - - for index,register in pairs(self.registers) do - if handler then - Update(self.store,handler,index,register.options) - else - self.store[tostring(index)] = FailedMessage - end - end - end - - function lang:Format(options) - -- find handler - local handler = self.handlers[CurrentLocale] - if not handler then - handler = self.handlers[new.Locales.Default] - end - if not handler then - warn(("Langauge handle Lang.Locales.Default is not found on Localization %s"):format(self.id)) - end - local index = self.index - self.index = index + 1 - - -- setup updater - local registerKeep = {} - -- this table will destroyed when parent register was destroyed - for _,option in pairs(options) do - local quadType = PcallGetProperty(option,"__type") - -- if it is register, setup updater - if quadType == "quad_register" then - local function regFn() - -- update handler - handler = self.handlers[CurrentLocale] - if not handler then - handler = self.handlers[new.Locales.Default] - end - if not handler then - self.store[tostring(index)] = FailedMessage - else - Update(self.store,handler,index,options) - end - -- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY - end - option:Register(regFn) - insert(registerKeep,regFn) - end - end - - -- update once - if handler then - Update(self.store,handler,index,options) - else - self.store[tostring(index)] = FailedMessage - end - - -- return resiter - local register = self.store(tostring(index)) - register.registerKeep = registerKeep - register.__rtype = "LangUpdater" - register.index = index - register.options = options - self.registers[index] = register - return register - end - - function new.New(id,handlers) - return lang.New(id,handlers) - end - - function new.Update() - for _,this in pairs(langList) do - this:UpdateAll() - end - end - - setmetatable(new,{ - __call = function(_,id) - return function (options) - local data = langList[id] - if not data then - error(("Localization %s is not definded"):format(id)) - end - return data:Format(options) - end - end; - __index = function (self,key) - if key == "CurrentLocale" then - return CurrentLocale - end - if key == "FailedMessage" then - return FailedMessage - end - end; - __newindex = function (self,key,value) - if key == "CurrentLocale" then - CurrentLocale = value - new.Update() - return - end - if key == "FailedMessage" then - FailedMessage = value - new.Update() - return - end - rawset(self,key,value) - end - }) - - return new -end - -return module diff --git a/src/libs/AdvancedTween/EasingFunctions.lua b/src/libs/AdvancedTween/EasingFunctions.lua deleted file mode 100644 index 6f13380..0000000 --- a/src/libs/AdvancedTween/EasingFunctions.lua +++ /dev/null @@ -1,166 +0,0 @@ -local EasingFunctions = {} - -local Exp2 = {} do - local MinIndex = -4 - local MaxIndex = 2 - local GetIndex = function(Index) - return Index * (MaxIndex - MinIndex) + MinIndex - end - - local exp = math.exp - local Min = exp(MinIndex) - local Max = exp(MaxIndex) - Min - - Exp2.Reverse = true - Exp2.Run = function(Index) - -- Index ; max = 1 min = 0 - return (exp(GetIndex(Index)) - Min) / Max - end -end -EasingFunctions["Exp2"] = Exp2 - -local Exp4 = {} do - local MinIndex = -4 - local MaxIndex = 4 - local GetIndex = function(Index) - return Index * (MaxIndex - MinIndex) + MinIndex - end - - local exp = math.exp - local Min = exp(MinIndex) - local Max = exp(MaxIndex) - Min - - Exp4.Reverse = true - Exp4.Run = function(Index) - -- Index ; max = 1 min = 0 - return (exp(GetIndex(Index)) - Min) / Max - end -end -EasingFunctions["Exp4"] = Exp4 - -local Linear = {} do - Linear.Reverse = false - Linear.Run = function(Index) - return Index - end -end -EasingFunctions["Linear"] = Linear - -local Expo = {} do - Expo.Reverse = false - Expo.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 - 2^(-10 * Index) - end -end -EasingFunctions["Expo"] = Expo - -local Quint = {} do - Quint.Reverse = false - Quint.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 - ((1 - Index)^5) - end -end -EasingFunctions["Quint"] = Quint - -local Quart = {} do - Quart.Reverse = false - Quart.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 - ((1 - Index)^4) - end -end -EasingFunctions["Quart"] = Quart - -local Cubic = {} do - Cubic.Reverse = false - Cubic.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 - ((1 - Index)^3) - end -end -EasingFunctions["Cubic"] = Cubic - -local Quad = {} do - Quad.Reverse = false - Quad.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 - ((1 - Index)^2) - end -end -EasingFunctions["Quad"] = Quad - -local Sin = {} do - local pi2 = math.pi/2 - local sin = math.sin - Sin.Reverse = false - Sin.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return sin(Index * pi2); - end -end -EasingFunctions["Sin"] = Sin - -local Circle = {} do - local sqrt = math.sqrt - Circle.Reverse = false - Circle.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return sqrt(1-(1-Index)^2) - end -end -EasingFunctions["Circle"] = Circle - -local Back = {} do - local c1 = 1.70158 - local c3 = 2.70158 - Back.Reverse = false - Back.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return 1 + c3 * (Index-1)^3 + c1 * (Index-1)^2 - end -end -EasingFunctions["Back"] = Back - -local Elastic = {} do - local sin = math.sin - local pi = math.pi - Elastic.Reverse = false - Elastic.Run = function(Index) - if Index == 1 then return 1 end - if Index == 0 then return 0 end - return (2^(-10*Index))*(sin((Index*10-0.75)*(2*pi/3)))+1 - end -end -EasingFunctions["Elastic"] = Elastic - -local Bounce = {} do - local n1 = 7.5625 - local d1 = 2.75 - Bounce.Reverse = false - Bounce.Run = function(Index) - if Index > 0.995 then return 1 end - if Index < 0.005 then return 0 end - if Index < 1 / d1 then - return n1 * Index^2 - elseif Index < 2 / d1 then - return n1 * (Index - 1.5/d1)^2 + 0.75 - elseif Index < 2.5 / d1 then - return n1 * (Index - 2.25/d1)^2 + 0.9375 - else - return n1 * (Index - 2.625/d1)^2 + 0.984375 - end - end -end -EasingFunctions["Bounce"] = Bounce - -return EasingFunctions diff --git a/src/libs/AdvancedTween/Stepped.lua b/src/libs/AdvancedTween/Stepped.lua deleted file mode 100644 index 7eacd11..0000000 --- a/src/libs/AdvancedTween/Stepped.lua +++ /dev/null @@ -1,35 +0,0 @@ -local IsRoblox = version and version() or nil - --- 로블록스 이외의 다른 lua 플렛폼을 위한 바인드 스탭, --- 여기에다 프레임 앞에 실행되는 이벤트를 핸들링해서 StepFunction 을 --- 연동해주면 됨, - --- 이 함수는 한 프레임마다 트윈들을 가져와서 실행시켜줌, (만약 트윈 효과가 하나도 없으면 그냥 건너뜀) - -local module = {} -function module.BindStep(StepFunction) - if IsRoblox then - if module.Connection then - error("Function was binded already") - end - local RunService = game:GetService("RunService") - if RunService:IsStudio() and (not RunService:IsRunning()) and RunService:IsEdit() then - module.Connection = RunService.Heartbeat:Connect(StepFunction) - else - -- RunService:BindToRenderStep("advancedTween",1,StepFunction) - module.Connection = RunService.RenderStepped:Connect(StepFunction) - end - else - -- do something here - end -end - -function module.UnbindAll() - if not module.Connection then - error("Function was not binded yet") - end - module.Connection:Disconnect() - module.Connection = nil -end - -return module diff --git a/src/libs/AdvancedTween/init.lua b/src/libs/AdvancedTween/init.lua deleted file mode 100644 index 6a31b2e..0000000 --- a/src/libs/AdvancedTween/init.lua +++ /dev/null @@ -1,466 +0,0 @@ ----@class quad_module_tween -local module = {} - ------------------------------------- --- 기본함수, 필요 모듈 가져오기 ------------------------------------- -local type = typeof or type -local clock = os.clock -local tonumber = tonumber -local remove = table.remove -local insert = table.insert -local find = table.find -local floor = math.floor - -if not find then - find = function (table,item) - for i,v in pairs(table) do - if v == item then return i end - end - return nil - end -end - -local script = script -local EasingFunctions = require(script and script.EasingFunctions or "EasingFunctions") -local Stepped = require(script and script.Stepped or "Stepped") - -local BindedFunctions = {} -- 애니메이션을 위해 프레임에 연결된 함수들 -local FunctionTargetItem = setmetatable({},{__mode="kv"}) -- 함수가 타겟으로 하는 아이템 - -module.PlayIndex = setmetatable({},{__mode = "k"}) -- 애니메이션 실행 스택 저장하기 --- PlayIndex[Item][Property] = 0 or nil <= 트윈중이지 않은 속성 --- PlayIndex[Item][Property] = 1... <= 트윈중인 속성 - ------------------------------------- --- Easing 스타일 ------------------------------------- -module.EasingFunctions = { - Linear = EasingFunctions.Linear; ---직선, Linear. i=x, x=0 ~ 1 - Quint = EasingFunctions.Quint; ---5제곱, Quint. (^5) i=1-(1-x)^5, x=0 ~ 1 - Quart = EasingFunctions.Quart; ---4제곱, Quart. (^4) i=1-(1-x)^4, x=0 ~ 1 - Cubic = EasingFunctions.Cubic; ---3제곱, Cubic. (^3) i=1-(1-x)^3, x=0 ~ 1 - Quad = EasingFunctions.Quad; ---2제곱, Quad. (^2) i=1-(1-x)^2, x=0 ~ 1 - Sin = EasingFunctions.Sin; ---사인파, Sin. i=sin(x*pi/2), x=0 ~ 1 - Circle = EasingFunctions.Circle; ---사분원, Circle. i=sqrt(1-(1-x)^2), x=0 ~ 1 - Expo = EasingFunctions.Expo; ---지수함수, Expo. i=1-2^(-10*x), x=0~1 - Elastic = EasingFunctions.Elastic; ---튀어오름, Elastic. - Bounce = EasingFunctions.Bounce; ---통통거림, Bounce - - -- Old things - Exp2 = EasingFunctions.Exp2; ---덜 가파른 지수. i=math.exp(x), x=-4 ~ 2 - Exp4 = EasingFunctions.Exp4; ---더 가파른 지수. i=math.exp(x), x=-4 ~ 4 - Exp2Max4 = EasingFunctions.Exp2; ---@deprecated -} -for i,v in pairs(EasingFunctions) do - module.EasingFunctions[i] = v -end - -module.EasingDirections = { - Out = "Out"; -- 반전된 방향 - In = "In" ; -- 기본방향 - InOut = "InOut"; -- 두 방향 모두 가감속 -} - -module.Directions = module.EasingDirections -module.Easings = module.EasingFunctions - ------------------------------------- --- Lerp 함수 ------------------------------------- --- 이중 선형, Alpha 를 받아서 값을 구해옴 -local function Lerp(start,goal,alpha) - if alpha == 1 then return goal end - if alpha == 0 then return start end - return start + ((goal - start) * alpha) -end - --- 기본적으로 로블록스가 Lerp 를 지원하는 Class -local DefaultLerpableItems = { - ["Vector2"] = true; - ["Vector3"] = true; - ["CFrame" ] = true; -} - --- 예전 값,목표 값,알파를 주고 각각 해당하는 속성에 입력해줌 --- 기본적으로 모든 속성값 적용은 여기에서 이루워짐 -local function LerpProperties(Item,Old,New,Alpha,Setter) - for Property,OldValue in pairs(Old) do - local NewValue = New[Property] - local Type = type(OldValue) - local Value - if Type ~= type(NewValue) then - error( - ("Unable to lerp property '%s' of '%s' due to type invalid. Old value type is '%s'. but New value type is '%s'") - :format( - tostring(Type), - tostring(type(NewValue)) - ) - ) - elseif DefaultLerpableItems[Type] then - Value = OldValue:Lerp(NewValue,Alpha) - elseif Type == "number" then - Value = Lerp(OldValue,NewValue,Alpha) - elseif Type == "UDim2" then - Value = UDim2.new( - Lerp(OldValue.X.Scale ,NewValue.X.Scale ,Alpha), - Lerp(OldValue.X.Offset,NewValue.X.Offset,Alpha), - Lerp(OldValue.Y.Scale ,NewValue.Y.Scale ,Alpha), - Lerp(OldValue.Y.Offset,NewValue.Y.Offset,Alpha) - ) - elseif Type == "UDim" then - Value = UDim.new( - Lerp(OldValue.Scale ,NewValue.Scale ,Alpha), - Lerp(OldValue.Offset,NewValue.Offset,Alpha) - ) - elseif Type == "Color3" then - Value = Color3.fromRGB( - Lerp(floor(OldValue.r*255),floor(NewValue.r*255) ,Alpha), - Lerp(floor(OldValue.g*255),floor(NewValue.g*255),Alpha), - Lerp(floor(OldValue.b*255),floor(NewValue.b*255) ,Alpha) - ) - else - error( - ("Unable to lerp property '%s' of '%s'. Old value type is '%s'. but tweenable types are UDim2, UDim, Color3, Vector2, Vector3, CFrame, number only") - :format( - tostring(Property), - tostring(Item), - tostring(Type) - ) - ) - end - if Setter then - Setter(Item,Property,Value) - else - Item[Property] = Value - end - end -end -module.LerpProperties = LerpProperties - --- Easing 값을 계산함 -local function CalcEasing(Easing,Direction,Reverse,Index) - if Index >= 1 then - return 1 - elseif Direction == "Out" then - if Reverse then - return 1 - Easing(1 - Index) - else - return Easing(Index) - end - elseif Direction == "In" then - if Reverse then - return Easing(Index) - else - return 1 - Easing(1 - Index) - end - elseif Direction == "InOut" then - if Index<0.5 then - -- In - if Reverse then - return Easing(Index*2)/2 - else - return 0.5 - Easing(1 - Index*2)/2 - end - else - -- Out - if Reverse then - return 1 - Easing(2-Index*2)/2 - else - return Easing(Index*2-1)/2+0.5 - end - end - end -end -function module.CalcEasing(Data_Easing,Direction,X) - local Reverse - local Easing do - Data_Easing = Easing or EasingFunctions.Exp2 - local Data_EasingType = type(Data_Easing) - if Data_EasingType == "string" then - Data_Easing = EasingFunctions[Data_Easing] - Data_EasingType = "table" - end - Easing = (Data_EasingType == "function" and Data_Easing) or (Data_EasingType == "table" and Data_Easing.Run) - if Data_EasingType == "table" and Data_Easing.Reverse then - Reverse = true - end - end - return CalcEasing(Easing,Direction,Reverse,X) -end - ------------------------------------- --- 모듈 함수 지정 ------------------------------------- --- 트윈 메서드 지정, 트윈을 만들게 됨 --- Item : 트윈할 인스턴트 --- Data : 트윈 정보들 (태이블) - --Data.Time (in seconds, you can use 0.5 .. etc) - --Data.Easing (function) - --Data.Direction ("Out" , "In") - --Data.CallBack 콜백 함수들(태이블), 예시 : - --Data.CallBack[0.5] = function() end 다음과 같이 쓰면 인덱스가 정확히 0.5 가 되는 순간(시간이 아니라 이징 함수에 의해 나온 값이 같아지는 순간) - --해당 함수가 실행됨 ---Properties : 트윈할 속성과 목표값 예시 : ---Data.Properties.Position = UDim2.new(1,0,1,0) 처럼 하면 Position 속성의 목표를 1,0,1,0 으로 지정 -function module.RunTween(Item,Data,Properties,Ended,OnStepped,Setter,Getter,_) - OnStepped = OnStepped or Data.OnStepped - Ended = Ended or Data.Ended - Setter = Setter or Data.Setter - Getter = Getter or Data.Getter - - -- remove self - if Item == module then warn "AdvancedTween:RunTween() is deprecated, Use AdvancedTween.RunTween() instead"; Item = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = Setter; Setter = Getter; Getter = _; end - - -- 시간 저장 - local Time = Data.Time or 1 - local EndTime = clock() + Time - - -- 플레이 인덱스 저장 - local ItemPlayIndex = module.PlayIndex[Item] - if ItemPlayIndex then - for _,stepFunc in ipairs(BindedFunctions) do - if FunctionTargetItem[stepFunc] == Item then - stepFunc() -- 해당 애니메이션을 미리 계산해서 지금 위치를 저장 - end - end - ItemPlayIndex = module.PlayIndex[Item] - end - if not ItemPlayIndex then - ItemPlayIndex = {} - module.PlayIndex[Item] = ItemPlayIndex - end - - -- 예전의 트윈을 덮어쓰고 현재 값을 저장함 !이전 트윈은 파기됨 - local ThisPlayIndex = {} - local LastProperties = {} - for PropertyName,_ in pairs(Properties) do - if Getter then - LastProperties[PropertyName] = Getter(Item,PropertyName) - else - LastProperties[PropertyName] = Item[PropertyName] - end - local PlayIndex = (ItemPlayIndex[PropertyName] or 0) + 1 - ItemPlayIndex[PropertyName] = PlayIndex - ThisPlayIndex[PropertyName] = PlayIndex - end - - -- 이징 효과 가져오기 - local Direction = Data.Direction or "Out" - local Reverse - local Easing do - local Data_Easing = Data.Easing or EasingFunctions.Exp2 - local Data_EasingType = type(Data_Easing) - if Data_EasingType == "string" then - Data_Easing = EasingFunctions[Data_Easing] - Data_EasingType = "table" - end - Easing = (Data_EasingType == "function" and Data_Easing) or (Data_EasingType == "table" and Data_Easing.Run) - if Data_EasingType == "table" and Data_Easing.Reverse then - Reverse = true - end - end - - -- 중간중간 실행되는 함수 확인 - local CallBack = Data.CallBack - if CallBack then - for FncIndex,Fnc in pairs(CallBack) do - if type(Fnc) ~= "function" or (type(tonumber(FncIndex)) ~= "number" and FncIndex ~= "*") then - warn( - ("Unprocessable callback function got, Ignored.\n - key: %s value: %s") - :format(tostring(Fnc),tostring(FncIndex)) - ) - CallBack[FncIndex] = nil - end - end - end - - -- 스탭핑 - local Step - Step = function() - -- 아에 멈추게 되는 경우 - if module.PlayIndex[Item] == nil then - remove(BindedFunctions,find(BindedFunctions,Step)) - return - end - - -- 다른 트윈이 속성을 바꾸고 있다면(이후 트윈이) 그 속성을 건들지 않도록 없엠 - local StopByOther = true - for PropertyName,PlayIndex in pairs(ThisPlayIndex) do - if PlayIndex ~= ItemPlayIndex[PropertyName] then - LastProperties[PropertyName] = nil - Properties[PropertyName] = nil - ThisPlayIndex[PropertyName] = nil - else - StopByOther = false - end - end - - local Now = clock() - local Index = 1 - (EndTime - Now) / Time - local Alpha - if Now >= EndTime then - Index = 1 - Alpha = 1 - else - Alpha = CalcEasing(Easing,Direction,Reverse,Index) - end - - -- 속성 Lerp 수행 - LerpProperties( - Item, - LastProperties, - Properties, - Alpha, - Setter - ) - - -- 만약 다른 트윈이 지금 트윈하고 있는 속성을 모두 먹은경우 현재 트윈을 삭제함 - if StopByOther then - remove(BindedFunctions,find(BindedFunctions,Step)) - return - end - - -- 끝남 - if Index == 1 then - for Property,_ in pairs(Properties) do - ItemPlayIndex[Property] = 0 - end - - if next(ItemPlayIndex) then - module.PlayIndex[Item] = nil - end - - remove(BindedFunctions,find(BindedFunctions,Step)) - Index = 1 - if Ended then - Ended(Item,1,1) - end - end - - -- 중간 중간 함수 배정된것 실행 - if CallBack then - for FncIndex,Fnc in pairs(CallBack) do - if FncIndex == "*" then - Fnc(Item,Index,Alpha) - else - local num = tonumber(FncIndex) - if num and num <= Alpha then - Fnc(Alpha,Index,Item) - CallBack[FncIndex] = nil - end - end - end - end - if OnStepped then OnStepped(Item,Index,Alpha) end - end - - -- 스캐줄에 등록 - insert(BindedFunctions,Step) - FunctionTargetItem[Step] = Item - - return Step -end - --- 여러개의 개체를 트윈시킴 -function module.RunTweens(Items,Data,Properties,Ended,OnStepped,Setter,Getter,_) - -- remove self - if Items == module then warn "AdvancedTween:RunTweens() is deprecated, Use AdvancedTween.RunTweens() instead"; Items = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = Setter; Setter = Getter; Getter = _; end - for _,Item in pairs(Items) do - module.RunTween(Item,Data,Properties,Ended,OnStepped,Setter,Getter) - end -end - --- 트윈 멈추기 -function module.StopTween(ItemOrStep,_) - if ItemOrStep == module then warn "AdvancedTween:StopTween() is deprecated, Use AdvancedTween.StopTween() instead"; ItemOrStep = _ end - if type(ItemOrStep) == "function" then - local pos = find(BindedFunctions,ItemOrStep) - if not pos then - warn(("tween %s was not found from AdvancedTween BindedFunctions. ignored call StopTween"):format(tostring(ItemOrStep))) - return - end - remove(BindedFunctions,pos) - return - end - module.PlayIndex[ItemOrStep] = nil -end - -function module.StopPropertyTween(Item,PropertyName,_) - if Item == module then warn "AdvancedTween:StopTween() is deprecated, Use AdvancedTween.StopTween() instead"; Item = _ end - local ItemPlayIndex = module.PlayIndex[Item] - if not ItemPlayIndex then return end - if type(PropertyName) == "table" then - for _,name in pairs(PropertyName) do - ItemPlayIndex[name] = (ItemPlayIndex[name] or 0) + 1 - end - else - ItemPlayIndex[PropertyName] = (ItemPlayIndex[PropertyName] or 0) + 1 - end -end - --- 해당 개체가 트윈중인지 반환 -function module.IsTweening(ItemOrStep,_) - if ItemOrStep == module then warn "AdvancedTween:IsTweening() is deprecated, Use AdvancedTween.IsTweening() instead"; ItemOrStep = _ end - - if type(ItemOrStep) == "function" then - local pos = find(BindedFunctions,ItemOrStep) - if pos then - return true - else - return false - end - end - - if module.PlayIndex[ItemOrStep] == nil then - return false - end - - for Property,Index in pairs(module.PlayIndex[ItemOrStep]) do - if Index ~= 0 then - return true - end - end - return false -end - --- 해당 개체의 해당 프로퍼티가 트윈중인지 반환 -function module.IsPropertyTweening(Item,PropertyName,_) - if Item == module then warn "AdvancedTween:IsPropertyTweening() is deprecated, Use AdvancedTween.IsPropertyTweening() instead"; Item = _ end - - if module.PlayIndex[Item] == nil then - return false - end - - if module.PlayIndex[Item][PropertyName] == nil then - return false - end - - return module.PlayIndex[Item][PropertyName] ~= 0 -end - ------------------------------------- --- 프레임 연결 ------------------------------------- --- 1 프레임마다 실행되도록 해야되는 함수 --- ./Stepped.lua 에서 연결점 편집 가능 --- roblox 는 이미 연결되어 있음 -function module.Stepped() - for _,Function in ipairs(BindedFunctions) do - if not FunctionTargetItem[Function] then - remove(BindedFunctions,find(BindedFunctions,Function)) - else - Function() - end - end -end -Stepped.BindStep(module.Stepped) -script.Destroying:Connect(function() - Stepped.UnbindAll() -end) - -function module.Destroy() - Stepped.UnbindAll() -end - -return module diff --git a/src/libs/customWarn.lua b/src/libs/customWarn.lua deleted file mode 100644 index 8b0c7cd..0000000 --- a/src/libs/customWarn.lua +++ /dev/null @@ -1,4 +0,0 @@ -return function(err) - warn(tostring(err)) - print(debug.traceback()) -end diff --git a/src/libs/require.lua b/src/libs/require.lua deleted file mode 100644 index 6015878..0000000 --- a/src/libs/require.lua +++ /dev/null @@ -1,31 +0,0 @@ --- remove the roblox's require system, --- now, we can call modules with string path - -if (not workspace) and (not game) and (not script) then - return -end - -return function (query) - local typeQuery = type(query) - - if typeQuery == "string" then - local object = script.Parent.Parent - query = query:gsub("/",".") - -- local index = 0 - query:gsub("[^%.]+",function (this) - -- index = index + 1 - -- if index == 1 and this == "src" then - -- return - -- end - local lastObject = object - object = object[this] - if not object then - object = lastObject.libs - return false,("[Quad] (require) object %s was not found from this worktree, require failed"):format(query) - end - end) - return require(object) - elseif typeQuery == "userdata" then - return require(query) - end -end \ No newline at end of file diff --git a/src/libs/round.lua b/src/libs/round.lua deleted file mode 100644 index a03d7db..0000000 --- a/src/libs/round.lua +++ /dev/null @@ -1,37 +0,0 @@ ----@class quad_module_round -local round = {} - -local outlineImage = "http://www.roblox.com/asset/?id=4668565547" -local outlineScaleType = Enum.ScaleType.Slice -local outlineSliceCenter = Rect.new(Vector2.new(516,516),Vector2.new(516,516)) -local outlineSliceScale = 0.00208 - -local roundImage = "http://www.roblox.com/asset/?id=4668069300" -local roundScaleType = Enum.ScaleType.Slice -local roundSliceCenter = Rect.new(Vector2.new(516,516),Vector2.new(516,516)) -local roundSliceScale = 0.0019166666666667 - -game:GetService('ContentProvider'):PreloadAsync({roundImage,outlineImage}) - -function round.SetRound(ImageFrame,RoundSize) - ImageFrame.Image = roundImage - ImageFrame.ScaleType = roundScaleType - ImageFrame.SliceCenter = roundSliceCenter - ImageFrame.SliceScale = roundSliceScale * RoundSize - return ImageFrame -end -function round.SetOutline(ImageFrame,RoundSize) - ImageFrame.Image = outlineImage - ImageFrame.ScaleType = outlineScaleType - ImageFrame.SliceCenter = outlineSliceCenter - ImageFrame.SliceScale = outlineSliceScale * RoundSize - return ImageFrame -end -function round.GetRound(ImageFrame) - return ImageFrame.SliceScale / roundSliceScale -end -function round.GetOutline(ImageFrame) - return ImageFrame.SliceScale / outlineSliceScale -end - -return round diff --git a/src/mount.lua b/src/mount.lua deleted file mode 100644 index 1b7eb95..0000000 --- a/src/mount.lua +++ /dev/null @@ -1,127 +0,0 @@ -local module = {} -local insert = table.insert -local pack = table.pack - ----@param shared quad_export ----@return quad_module_mount -function module.init(shared) - local PcallGetProperty = shared.Store.PcallGetProperty - ---@class quad_module_mount - local new = {__type = "quad_module_mount"} - - -- get Holder object - local function getHolder(item) - return (type(item) == "table") and (item._holder or item.holder or item.__holder) or item - end - new.GetHolder = getHolder - - -- mount class - local mountClass = {__type = "quad_mount"} - mountClass.__index = mountClass - function mountClass:Unmount() - local this = self.this - local typeThis = type(this) - if typeThis == "userdata" then - this:Destroy() - elseif typeThis == "table" then - pcall(function() - this.Parent = nil - end) - local destroyThis = this.Destroy - if destroyThis then - pcall(destroyThis,this) - end - if type(self.to) == "table" then - local parentChild = rawget(self.to,"__child") - if parentChild then - for i,v in pairs(parentChild) do - if v == this then - parentChild[i] = nil - end - end - end - end - end - self.this = nil - end - - -- mount function - local function mount(to,this,holder,noReturn) - local thisObject = this - if type(this) == "table" then - thisObject = rawget(this,"__object") - local parent = rawget(this,"__parent") - if type(parent) == "table" then - local parentChild = rawget(parent,"__child") - if parentChild then - for i,v in pairs(parentChild) do - if v == this then - parentChild[i] = nil - end - end - end - end - rawset(this,"__parent",to) - end - if thisObject then - thisObject.Parent = holder or getHolder(to) - else - this.Parent = holder or getHolder(to) - end - if type(to) == "table" then - local child = rawget(to,"__child") - if not child then - child = {} - rawset(to,"__child",child) - end - insert(child,this) - - -- ChildAdded call - local childAdded = rawget(to,"ChildAdded") - if childAdded and PcallGetProperty(childAdded,"__type") == "quad_bindable" then - childAdded:Fire(this) - end - end - if noReturn then return end - return setmetatable({to = to,this = this},mountClass) - end - new.MountOne = mount - - -- mount(s) class - local mountsClass = {__type = "quad_mounts"} - mountsClass.__index = mountsClass - function mountsClass:Unmount() - for i,v in pairs(self) do -- DO NOT IPAIRS (REASON: gc...) - if type(i) == "number" then - v:Unmount() - self[i] = nil - end - end - end - - function mountsClass:Add(...) - for i = 1,select('#',...) do - insert(self,mount(self.to,select(i,...))) - end - end - - -- handle __call - setmetatable(new,{ - __call = function (self,to,...) - -- it not working for :Add() - -- if select("#",...) == 1 then - -- return mount(to,...) - -- end - local mounts = {to = to} - for i = 1,select('#',...) do - insert(mounts,mount(to,select(i,...))) - end - setmetatable(mounts,mountsClass) - return mounts - end - }) - - return new -end - -return module diff --git a/src/signal.lua b/src/signal.lua deleted file mode 100644 index bda479c..0000000 --- a/src/signal.lua +++ /dev/null @@ -1,177 +0,0 @@ - -local module = {} - -local running = coroutine.running -local resume = coroutine.resume -local yield = coroutine.yield -local insert = table.insert -local remove = table.remove - -function module.init(shared) - ---@class quad_module_signal - local new = {} - local warn = shared.warn - - -- roblox connections disconnecter - local disconnecters = {} - new.disconnecters = disconnecters - local disconnecterClass = {__type = "quad_disconnecter"} - disconnecterClass.__index = disconnecterClass - function disconnecterClass:Add(connection) - insert(self,connection) - end - function disconnecterClass:Disconnect() - for i,v in pairs(self) do - pcall(v.Disconnect,v) - self[i] = nil - end - end - function disconnecterClass:Destroy() - local id = self.id - if id then - disconnecters[id] = nil - end - for i,v in pairs(self) do - pcall(v.Disconnect,v) - self[i] = nil - end - setmetatable(self,nil) - end - function disconnecterClass.New(id) - if id then - local old = disconnecters[id]; - if old then - return old; - end - end - local this = setmetatable({id = id},disconnecterClass); - if id then - disconnecters[id] = this; - end - return this; - end - new.Disconnecter = disconnecterClass - - local connection = {__type = "quad_connection"} - connection.__index = connection - function connection.New(signal,func) - return setmetatable({signal = signal,func = func},connection) - end - function connection:Disconnect(slient) - local signal = self.signal - local onceConnection = signal.onceConnection - local connections = signal.connection - - for i,v in pairs(connections) do - if v.connection == self then - remove(connections,i) - return - end - end - for i,v in pairs(onceConnection) do - if v.connection == self then - remove(onceConnection,i) - return - end - end - - if not slient then - warn(("Connection %s is not found from signal %s, but tried :Disconnect(). Maybe disconnected aleady?"):format(tostring(self),tostring(signal))) - end - end - function connection:Destroy() - return self:Disconnect(true) - end - new.Connection = connection - - local signals = {} - local signal = {__type = "quad_bindable"} - signal.__index = signal - function signal:Fire(...) - local waitting = self.waitting - local onceConnection = self.onceConnection - self.waitting = {} - self.onceConnection = {} - - for _,v in pairs(waitting) do - task.spawn(resume,v,...) - end - - for _,v in pairs(self.connection) do - task.spawn(v.func,...) - end - - for _,v in pairs(onceConnection) do - task.spawn(v.func,...) - end - end - function signal:DisconnectAll() - local waitting = self.waitting - self.waitting = {} - self.onceConnection = {} - self.connection = {} - for _,v in pairs(waitting) do - task.spawn(resume,v,nil) - end - end - function signal:Wait() - insert(self.waitting,running()) - return yield() - end - function signal:CheckConnected(func) - local onceConnection = self.onceConnection - local connections = self.connection - for _,v in pairs(connections) do - if v.func == func then - return true - end - end - for _,v in pairs(onceConnection) do - if v.func == func then - return true - end - end - return false - end - function signal:Connect(func) - if self:CheckConnected(func) then - warn(("[Quad] Function %s Connected already on signal %s"):format(tostring(func),tostring(self))) - end - local thisConnection = connection.New(self,func) - insert(self.connection,{func=func,connection=thisConnection}) - return thisConnection - end - function signal:Once(func) - if self:CheckConnected(func) then - warn(("[Quad] Function %s Connected already on signal %s"):format(tostring(func),tostring(self))) - end - local thisConnection = connection.New(self,func) - insert(self.onceConnection,{func=func,connection=thisConnection}) - return thisConnection - end - function signal:Destroy() - local id = self.id - if id then - signals[id] = nil - end - self:DisconnectAll() - setmetatable(self,nil) - end - function signal.New(id) - if id and signals[id] then - return signals[id] - end - local this = {id=id,waitting={},onceConnection={},connection={}} - setmetatable(this,signal) - if id then - signals[id] = this - end - return this - end - new.Bindable = signal - - return new -end - -return module - diff --git a/src/store.lua b/src/store.lua deleted file mode 100644 index be9d58f..0000000 --- a/src/store.lua +++ /dev/null @@ -1,491 +0,0 @@ -local module = {} - ---[[ -this feature allows get object without making some created callback and local var -but, it can't allows mulit id and object -this feature should be upgraded -]] -local wrap = coroutine.wrap -local insert = table.insert -local remove = table.remove -local gmatch = string.gmatch -local gsub = string.gsub -local match = string.match -local find = table.find - -if not find then - find = function (table,item) - for i,v in pairs(table) do - if v == item then return i end - end - return nil - end -end - -local function catch(...) - local passed,err = pcall(...) - if not passed then - warn ("[QUAD] Error occured while operating async task\n" .. tostring(err)) - end -end - -local week = {__mode = "v"} - ----@param shared quad_export ----@return quad_module_store -function module.init(shared) - local warn = shared.warn - ---@class quad_module_store - local new = {__type = "quad_module_store"} - local items = {} - new.Items = items - - local function RawGetProperty(item,index) - return item[index] - end - local function PcallGetProperty(item,index) - local ok,err = pcall(RawGetProperty,item,index) - if ok then return err end - return nil - end - new.PcallGetProperty = PcallGetProperty - - -- id space (array of object) - local objectListClass = {__type = "quad_objectlist"} - function objectListClass:EachAsync(func) - local index = 1 - for i,v in pairs(self) do - wrap(catch)(func,v,index) - index = index + 1 - end - end - function objectListClass:Each(func) - local index = 1 - for _,v in pairs(self) do - local ret = func(v,index) - index = index + 1 - if ret then - break - end - end - end - function objectListClass:Remove(indexOrItem) - if self.__locked then - error("This objectList is locked, maybe used Store.GetObjects('a,b')? AdvancedObjectQuery does not support :Remove") - end - local thisType = type(indexOrItem) - if thisType == "number" then - return remove(self,indexOrItem),indexOrItem - else - for i,v in pairs(self) do - if v == indexOrItem then - return remove(self,i),i - end - end - end - end - function objectListClass:IsEmpty() - if next(self) then return true end - return false - end - function objectListClass.__new() - return setmetatable({},objectListClass) - end - function objectListClass:__newIndex(key,value) -- props setter - self:Each(function (this) - this[key] = value - end) - end - objectListClass.__mode = "v" -- week link for gc - objectListClass.__index = objectListClass - - -- get object array with id (objSpace) - function new.GetObjects(ids) - if match(ids,"[,&]") then - local list = objectListClass.__new() - objectListClass.__locked = true - local checked = {} - for query in gmatch(ids,"[^,]+") do -- split by , - if match(query,"&") then - -- multi ids (and) - - -- make list of combined ids - local queryIds = {} - for id in gmatch(query,"[^&]+") do - id = gsub(gsub(id,"^ +","")," +$","") - insert(queryIds,id) - end - - -- loop as first list - local targetList = queryIds[1] and items[remove(queryIds,1)] - if targetList then - for _,item in pairs(targetList) do - if not checked[item] then - -- check item has all of ids from queryIds - local ok = true - for _,id in ipairs(queryIds) do - local checkList = items[id] - if (not checkList) or (not find(checkList,item)) then - ok = false - break - end - end - - -- insert in return list - if ok then - insert(list,item) - -- prevent multi insert - checked[item] = true - end - end - end - end - else - query = gsub(gsub(query,"^ +","")," +$","") - local idItem = items[query] - if idItem then - for _,item in pairs(idItem) do - if not checked[item] then - insert(list,item) - checked[item] = true -- prevent multi insert - end - end - end - end - end - return list - else - local list = items[ids] - if list then return list end - list = objectListClass.__new() - items[ids] = list - return list - end - end - -- get first object with id (not array) - function new.GetObject(id) - local item = items[id] - return item and item[next(item)] - end - -- adding object with id - function new.AddObject(ids,object) - -- prevent gc - if type(object) == "userdata" then - object:GetPropertyChangedSignal("ClassName"):Connect(function() - return object - end) - end - for id in gmatch(ids,"[^,]+") do -- split by , - -- remove trailing, heading spaces - id = gsub(gsub(id,"^ +","")," +$","") - local array = items[id] - if not array then - array = objectListClass.__new() - items[id] = array - end - if not find(array,object) then - insert(array, object) - end - end - end - - -- resolve tween object - local function ResolveRegisterTween(s,tween) - if not tween then return end - if type(tween) == "table" and PcallGetProperty(tween,"__type") == "quad_register" then - tween = tween:CalcWithDefault(s) - end - local result = {} - for i,v in pairs(tween) do - if type(v) == "table" and PcallGetProperty(tween,"__type" == "quad_register") then - result[i] = tween:CalcWithDefault(v) - else - result[i] = v - end - end - return result - end - - local registerClass = { - __type = "quad_register"; - Unregister = function(s,efunc) - local self = s.store - local events = self.__evt - for key in gmatch(s.key,"[^,]+") do - key = gsub(gsub(key,"^ +","")," +$","") - local event = events[key] - if event then - for i,v in pairs(event) do - if efunc == v then - event[i] = nil - end - end - end - end - end; - Register = function (s,efunc) - local self = s.store - local events = self.__evt - for key in gmatch(s.key,"[^,]+") do - key = gsub(gsub(key,"^ +","")," +$","") - local event = events[key] - if not event then - event = setmetatable({},week) - events[key] = event - end - insert(event,efunc) - end - return efunc - end; - Observe = function(s,efunc) - local self = s.store - local events = self.__evt - local function update(_,newValue,key) - local value = s:CalcWithNewValue(self,newValue,key) - efunc(value) - end - insert(self.__keep,update) - for key in gmatch(s.key,"[^,]+") do - key = gsub(gsub(key,"^ +","")," +$","") - local event = events[key] - if not event then - event = setmetatable({},week) - events[key] = event - end - insert(event,update) - end - end; - With = function (s,wfunc) - -- s.wfunc = wfunc - -- return s - return setmetatable({wfunc = wfunc},{__index = s}) - end; - Default = function (s,dvalue) - -- s.dvalue = dvalue - -- return s - return setmetatable({dvalue = dvalue},{__index = s}) - end; - Tween = function (s,tvalue) - -- s.tvalue = tvalue - -- return s - if tvalue == true then tvalue = {} end - return setmetatable({tvalue = tvalue},{__index = s}) - end; - ---@deprecated - From = function (s,fvalue) - warn "[QUAD] register:from() is deprecated. Use register:add(t:table|function) instead" - -- s.fvalue = fvalue - -- return s - return setmetatable({fvalue = fvalue},{__index = s}) - end; - Add = function (s,avalue) - -- s.avalue = avalue - -- return s - return setmetatable({avalue = avalue},{__index = s}) - end; - Link = function(s,lvalue) - return setmetatable({avalue = lvalue},{__index = s}) - end; - -- return init data - CalcWithDefault = function (s,withItem) - local with = s.wfunc - local tstore = s.store - local rawKey = s.key - local tween = ResolveRegisterTween(s,s.tvalue or tstore.__tweens[rawKey]) - local from = s.fvalue - local add = s.avalue - local set = tstore[rawKey] - if set ~= nil or (match(rawKey,",") and with) then - if add then - set = set + add - end - if from then - set = from[set] - end - if with then - local typeWith = type(with) - if typeWith == "table" then - set = with[set] - elseif typeWith == "function" then - set = with(tstore,set,rawKey,withItem) - else - error(("Unsupported type :With(). got %s"):format(typeWith)) - end - end - return set,tween - else - local dset = s.dvalue - if dset ~= nil then - return dset,tween - end - warn "[Quad] no default value found." - end - end; - CalcWithNewValue = function(s,withItem,updatedValue,updatedKey) - local with = s.wfunc - local tstore = s.store - local rawKey = s.key - local tween = ResolveRegisterTween(s,s.tvalue or tstore.__tweens[rawKey]) - local from = s.fvalue - local add = s.avalue - if add then - updatedValue = updatedValue + add - end - if from then - updatedValue = from[updatedValue] - end - if with then - updatedValue = with(tstore,updatedValue,updatedKey,withItem) - end - return updatedValue,tween - end - } - registerClass.__index = registerClass - - -- bindable store object - local store = {__type = "quad_store"} - local storeIdSpace = {} - function store:__index(key) - local this = self.__self[key] - if this ~= nil then - return this - end - return store[key] - end - function store:__newindex(key,value) - -- if got register, just copy data to self and connect - if PcallGetProperty(value,"__type") == "quad_register" then - error "[Quad] adding register value on store is only allowed when init store. set value request was ignored" - -- local selfValues = self.__self - -- local selfTweens = self.__tweens - - -- -- fetch data from origin - -- do - -- local tstore = value.store - -- for tkey in gmatch(value.key,"^[,]") do - -- if not selfValues[tkey] then - -- selfValues[tkey] = tstore[tkey] - -- end - -- end - -- end - - -- -- calc value - -- do - -- local setValue,tween = value:CalcWithDefault(self) - -- selfValues[key] = setValue - -- selfTweens[key] = tween - -- end - - -- -- make event connection - -- value:Register(function (_,newValue,eventKey) - -- -- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY - -- local setValue = value:CalcWithNewValue(self,newValue,eventKey) - -- self[key] = setValue - -- end) - - -- return - end - self.__self[key] = value - local event = self.__evt[key] - if event then - for _,v in pairs(event) do -- NO ipairs here - wrap(catch)(v,store,value,key) - end - end - end - -- init bindings (reflect all changes into class or other store, just wrapping it) - function new.__initStoreRegisterBinding(self,withItem,extend) - local selfTweens = self.__tweens - local selfValues = self.__self - local selfKeep = self.__keep - for key,item in pairs(selfValues) do - if PcallGetProperty(item,"__type") == "quad_register" then - -- fetch data from origin - -- do - -- local tstore = item.store - -- for tkey in item.key:gmatch("^[,]") do - -- if not selfValues[tkey] then - -- selfValues[tkey] = tstore[tkey] - -- end - -- end - -- end - - -- calc value - do - local setValue,tween = item:CalcWithDefault(withItem) - selfValues[key] = setValue - selfTweens[key] = tween - end - - -- make event connection - local function regFn(_,newValue,eventKey) - -- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY - local setValue = item:CalcWithNewValue(withItem,newValue,eventKey) - if extend then - extend[key] = setValue - else - self[key] = setValue - end - end - item:Register(regFn) - insert(selfKeep,{func=regFn,register=item,key=key}) - end - end - end - -- create register - function store:__call(key,func) - local last = self.__self[key] - if last and type(last) == "table" and getmetatable(last) == registerClass then - return last - end - local register = self.__reg[key] - if not register then - register = setmetatable({ - key = key; - store = self; - },registerClass) - self.__reg[key] = register - end - - if func then - register:Register(func) - end - return register - end - function store:Default(key,value) - if self[key] == nil then - self[key] = value - return - end - end - function new.New(self,id) - local this = setmetatable( - { - __self = self or {}, -- real value storage - __evt = {}, -- changed event handler functions (dict of array) - __reg = setmetatable({},week), -- save registers - __tweens = {}, -- tweens (if inited with register, save tween and use as default tween data) - __keep = {} -- store data which should not be destoryed - },store - ) - if id then -- save in id space - storeIdSpace[id] = this - end - return this - end - local storeNew = new.New - function new.GetStore(id) - return storeIdSpace[id] or storeNew({},id) - end - local getStore = new.GetStore - - setmetatable(new,{ - __call = function (self,...) - return getStore(...) - end; - }) - - return new -end - -return module diff --git a/src/style.lua b/src/style.lua deleted file mode 100644 index e633e63..0000000 --- a/src/style.lua +++ /dev/null @@ -1,74 +0,0 @@ -local module = {} -local insert = table.insert - ----@param shared quad_export ----@return quad_module_style -function module.init(shared) - local warn = shared.warn - ---@class quad_module_style - local new = {__type = "quad_module_style"} - - local styles = {} - new.Styles = styles - - ---@class quad_style - local styleClass = {__type = "quad_style"} - styleClass.__index = styleClass - - function new.New(props) - return setmetatable(props,styleClass) - end - local newStyle = new.New - - setmetatable(new,{ - ---@return quad_style - __call = function (_,styleTable) - if type(styleTable) == "string" then - return function (nstyleTable) - local this = newStyle(nstyleTable) - styles[styleTable] = this - return this - end - end - return newStyle(styleTable) - end - }) - - local function recursionStyleParse(style,parseTable) - for _,value in ipairs(parseTable) do - if value == style then - warn("[Quad] infinity recursion detected on parsing style. ignored recursion") - return - end - end - insert(parseTable,style) - for key,value in pairs(style) do - if type(key) == "number" and type(value) == "table" and value.__type == "quad_style" then - recursionStyleParse(value,parseTable) - end - end - end - - local parsed = {} - function new.ParseStyles(style) - do -- check cache - local cached = parsed[style] - if cached then return cached end - end - - -- type check - if type(style) ~= "table" or style.__type ~= "quad_style" then - error(("Unknown type type '%s:%s' got"):format(tostring(style),tostring(type(style)))) - end - - local this = {} - recursionStyleParse(style,this) - - parsed[style] = this - return this - end - - return new -end - -return module diff --git a/src/tracker.lua b/src/tracker.lua deleted file mode 100644 index 9149733..0000000 --- a/src/tracker.lua +++ /dev/null @@ -1,110 +0,0 @@ --- module name : handling rojo tree changes - -if false then if not task then _G.task = {} end end ----@class tracker_rojo -local module = {} -module.__index = module - -module.scheduleDelay = 1 - -function module:__emit(eventName,...) - for _,func in ipairs(self.events[eventName]) do - func(...) - end -end - -function module:__update() - -- do updates - self:__emit("updated") -end - -function module:__scheduleUpdate() - -- already timer setted - if self.__onTimer then return end - - self.__onTimer = true - task.delay(self.scheduleDelay,function () - self.__onTimer = false - self:__update() - end) -end - -function module:__track(ins) - self.connections[ins] = ins.Changed:Connect(function () - self:__scheduleUpdate() - end) -end - -function module:__drop(ins) - local signal = self.connections[ins] - if type(signal) == "table" then - for _,v in pairs(signal) do - v:Disconnect() - end - self.connections[ins] = nil - elseif signal then - signal:Disconnect() - self.connections[ins] = nil - end -end - -function module:init() - local mainConnections = {} - self.connections[self.main] = mainConnections - - mainConnections[1] = self.main.DescendantAdded:Connect(function (ins) - self:__track(ins) - self:__scheduleUpdate() - end) - - for _,ins in pairs(self.main:GetDescendants()) do - self:__track(ins) - end - - mainConnections[2] = self.main.DescendantRemoving:Connect(function (ins) - self:__drop(ins) - self:__scheduleUpdate() - end) - - self:__track(self.main) - mainConnections[3] = self.main.Destroying:Connect(function () - self:__drop(self.main) - end) - - return self -end - -function module:connect(eventName,func) - table.insert(self.events[eventName],func) -end - -function module:deinit() - for i,signal in pairs(self.connections) do - if type(signal) == "table" then - for _,v in pairs(signal) do - signal:Disconnect() - end - self.connections[i] = nil - elseif signal then - signal:Disconnect() - self.connections[i] = nil - end - end -end - ----@return tracker_rojo -function module.new(ins) - local this = { - main = ins, - connections = {}, - events = { - updated = {}, - }, - __onTimer = false, - } - - setmetatable(this,module) - return this -end - -return module diff --git a/test.project.json b/test.project.json deleted file mode 100644 index 7739097..0000000 --- a/test.project.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "quadTesting", - "tree": { - "$className": "DataModel", - "ReplicatedFirst": { - "$className": "ReplicatedFirst", - "QuadTest": { - "$path": "./testing", - "Quad": { - "$path": "./" - } - } - } - } -} \ No newline at end of file diff --git a/testing/Loader.client.lua b/testing/Loader.client.lua deleted file mode 100644 index 92c9afe..0000000 --- a/testing/Loader.client.lua +++ /dev/null @@ -1 +0,0 @@ -require(script.Parent) diff --git a/testing/Test.lua b/testing/Test.lua deleted file mode 100644 index 69a696d..0000000 --- a/testing/Test.lua +++ /dev/null @@ -1,36 +0,0 @@ --- 모듈 위치로 알맞게 변경해주세요 -local Quad = script.Parent.Quad -local tracker = require(Quad.tracker) - -local module = {} -local function reload() - if module.unload then pcall(module.unload) end - if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end - module.testingModule = script.Parent:Clone() - module.testingModule.Parent = script.Parent.Parent - module.testingModule.Archivable = false - module.testingModule.Name = module.testingModule.Name .. "_TESTING" - module.unload = require(module.testingModule) -end - --- 자동 리로드를 켭니다. 이미 켜져있으면 다시 로드합니다 -function module.load() - reload() - if not module.autoreload then - module.autoreload = tracker.new(script.Parent) - module.autoreload:init(); wait() - module.autoreload:connect("updated",reload) - end -end - --- 자동 리로드를 끄고 테스트로 생긴것을 지웁니다 -function module.unload() - if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end - if module.unload then pcall(module.unload) end - if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end - module.autoreload = nil - module.unload = nil - module.testingModule = nil -end - -return module diff --git a/testing/init.lua b/testing/init.lua deleted file mode 100644 index c7368a0..0000000 --- a/testing/init.lua +++ /dev/null @@ -1,80 +0,0 @@ - -local module = {} - -local IsTestMode = script.Name:match("_TESTING") - -local Quad = require(script.Quad).Init() -local LocalPlayer = game.Players.LocalPlayer -local ScreenGUI = Instance.new("ScreenGui", - LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui) -ScreenGUI.Name = "MyGUI" -ScreenGUI.ResetOnSpawn = false - -local function SetTheme(global) - local isDark - local hasPermissionToGetSettings = pcall(function() - isDark = tostring(settings().Studio.Theme) == "Dark" - end) - if isDark == nil then isDark = true end - - -- topbar - global.topbarColor = isDark - and Color3.fromRGB(142, 21, 255) - or Color3.fromRGB(163, 65, 255) - global.topbarTextColor = isDark - and Color3.fromRGB(255, 255, 255) - or Color3.fromRGB(0, 0, 0) - - -- background - global.backgroundColor = isDark - and Color3.fromRGB(32, 32, 32) - or Color3.fromRGB(255, 255, 255) - - -- texts - global.textColor = isDark - and Color3.fromRGB(255, 255, 255) - or Color3.fromRGB(0, 0, 0) - global.editableTextColor = isDark - and Color3.fromRGB(240, 240, 240) - or Color3.fromRGB(25, 25, 25) - global.placeholderTextColor = isDark - and Color3.fromRGB(170, 170, 170) - or Color3.fromRGB(124, 124, 124) - - -- init theme chnaged handler - if hasPermissionToGetSettings and (not global.themeConnection) then - global.themeConnection = settings().Studio.ThemeChanged:Connect(function() - module.setTheme(global) - end) - end -end - ----@module src.types -local types = require(script.Quad.types) -local quad = (require(script.Quad) :: types.module).Init("ui") -local Round,Class,Mount,Store,Event,Tween,Style,Signal -= quad.Round,quad.Class,quad.Mount,quad.Store,quad.Event,quad.Tween,quad.Style,quad.Signal - -local Frame = Class "Frame" -local Gui = Class "ScreenGui" - -local Global = Store.GetStore "global" -local TweenTest = Class(script.tween) --- local LangTest = Class(script.lang) - -SetTheme(Global) - -local mainMount = Mount(ScreenGUI,Frame "Main" { - Size = UDim2.fromOffset(400,640); - Position = UDim2.fromScale(0.5,0.5); - AnchorPoint = Vector2.new(0.5,0.5); - TweenTest{}; - -- LangTest{}; -}) - -return function() - -- 테스트가 끝나 만든걸 지워야 할 때 사용됩니다. - -- 추후 설명될 Unmount() 를 이용하세요. - mainMount:Unmount() - ScreenGUI:Destroy() -end diff --git a/testing/signal.lua b/testing/signal.lua deleted file mode 100644 index f3ed743..0000000 --- a/testing/signal.lua +++ /dev/null @@ -1,36 +0,0 @@ - -local mySignal = Signal.Bindable.New() - -local connection = mySignal:Connect(function(v) - print(v) -end) -mySignal:Fire("우왕") -connection:Disconnect() -mySignal:Fire("이거뜨면안된다") - -task.spawn(function() - task.wait(5) - mySignal:Fire("우와왕") -end) -print(mySignal:Wait()) - -mySignal:Once(function(v) - print(v) -end) -mySignal:Fire("우와와왕") -mySignal:Fire("이것도 뜨면안된다") - -mySignal:Once(function(v) - print(v) -end):Disconnect() -mySignal:Fire("이것도 뜨면안된다*2") - -local myClass = Class.Extend() -function myClass:Render(props) - return Class "TextBox" { - [Event.Prop "Text"] = function(this,value) - self:EmitPropertyChangedSignal("Text",value) - end; - Size = UDim2.new() - } -end diff --git a/testing/tween.lua b/testing/tween.lua deleted file mode 100644 index c24cd1b..0000000 --- a/testing/tween.lua +++ /dev/null @@ -1,133 +0,0 @@ - -local module = {} - ----@module Quad.src.types -local types = require(script.Parent.Quad.types) -local quad = (require(script.Parent.Quad) :: types.module).Init("ui") -local Class,Mount,Store,Event,Tween,Style,Lang -= quad.Class,quad.Mount,quad.Store,quad.Event,quad.Tween,quad.Style,quad.Lang - -local Global = Store.GetStore "global" - --- Import classes -local Frame = Class "Frame" -Frame.BorderSizePixel = 0 -Frame.BackgroundColor3 = Global "backgroundColor" -local TextLabel = Class "TextLabel" -TextLabel.BackgroundTransparency = 1 -TextLabel.BorderSizePixel = 0 -TextLabel.Font = Enum.Font.Gotham; -TextLabel.TextColor3 = Global "textColor" -TextLabel.TextSize = 16; - -Style "tweenTestFrame" { - BackgroundTransparency = 0; - Size = UDim2.fromOffset(60,30); - BackgroundColor3 = Color3.fromRGB(0, 0, 0); -} - -Lang.New("tweenCount",{ - [Lang.Locales.Korean] = "{count}번 실행했어요"; - [Lang.Locales.Default] = "Ran {count} times"; -}) - --- Create Extend Class -local tweenTest = Class.Extend() - -function tweenTest:Init(Prop) - Prop:Default("Count",0) - Prop:Default("Position",UDim2.fromOffset(50,0)) -end - -function tweenTest:AfterRender() - local on = false - task.spawn(function() - while task.wait(2) do - on = not on - self.Count = self.Count + 1 - self.Position = on and UDim2.new(1,-50-60,0,0) or UDim2.fromOffset(50,0) - end - end) -end - -function tweenTest:Render(Prop) - return Frame { - TextLabel { - Position = UDim2.fromOffset(0,20); - Size = UDim2.new(1,0,0,30); - Text = Lang "tweenCount" { - count = Prop "Count"; - }; - }; - Size = UDim2.fromScale(1,1); - TextLabel "tweenTestFrame" { - Text = "Linear"; - Position = Prop "Position":Add(UDim2.fromOffset(0,80)):Tween{Direction = "Out",Time = 2,Easing = "Linear"}; - }; - TextLabel "tweenTestFrame" { - Text = "Expo"; - Position = Prop "Position":Add(UDim2.fromOffset(0,120)):Tween{Direction = "Out",Time = 2,Easing = "Expo"}; - }; - TextLabel "tweenTestFrame" { - Text = "Quint"; - Position = Prop "Position":Add(UDim2.fromOffset(0,160)):Tween{Direction = "Out",Time = 2,Easing = "Quint"}; - }; - TextLabel "tweenTestFrame" { - Text = "Quart"; - Position = Prop "Position":Add(UDim2.fromOffset(0,200)):Tween{Direction = "Out",Time = 2,Easing = "Quart"}; - }; - TextLabel "tweenTestFrame" { - Text = "Cubic"; - Position = Prop "Position":Add(UDim2.fromOffset(0,240)):Tween{Direction = "Out",Time = 2,Easing = "Cubic"}; - }; - TextLabel "tweenTestFrame" { - Text = "Quad"; - Position = Prop "Position":Add(UDim2.fromOffset(0,280)):Tween{Direction = "Out",Time = 2,Easing = "Quad"}; - }; - TextLabel "tweenTestFrame" { - Text = "Sin"; - Position = Prop "Position":Add(UDim2.fromOffset(0,320)):Tween{Direction = "Out",Time = 2,Easing = "Sin"}; - }; - TextLabel "tweenTestFrame" { - Text = "Circle"; - Position = Prop "Position":Add(UDim2.fromOffset(0,360)):Tween{Direction = "Out",Time = 2,Easing = "Circle"}; - }; - TextLabel "tweenTestFrame" { - Text = "Exp2"; - Position = Prop "Position":Add(UDim2.fromOffset(0,400)):Tween{Direction = "Out",Time = 2,Easing = "Exp2"}; - }; - TextLabel "tweenTestFrame" { - Text = "Exp4"; - Position = Prop "Position":Add(UDim2.fromOffset(0,440)):Tween{Direction = "Out",Time = 2,Easing = "Exp4"}; - }; - TextLabel "tweenTestFrame" { - Text = "Elastic"; - Position = Prop "Position":Add(UDim2.fromOffset(0,480)):Tween{Direction = "Out",Time = 2,Easing = "Elastic"}; - }; - TextLabel "tweenTestFrame" { - Text = "Bounce"; - Position = Prop "Position":Add(UDim2.fromOffset(0,520)):Tween{Direction = "Out",Time = 2,Easing = "Bounce"}; - }; - TextLabel "tweenTestFrame" { - Text = "Back"; - Position = Prop "Position":Add(UDim2.fromOffset(0,560)):Tween{Direction = "Out",Time = 2,Easing = "Back"}; - }; - -- Frame { - -- Size = UDim2.new(100,100); - -- [Event.Created] = function(self) - -- for j = 1,25 do - -- local i = j*4 - -- Mount(self,Frame{ - -- Size = UDim2.fromOffset(3,3); - -- AnchorPoint = Vector2.new(0.5,0.5); - -- Position = UDim2.fromOffset(100-i,Tween.CalcEasing(Tween.EasingFunctions.Circle,Tween.EasingDirections.Out,i/100)*100); - -- BackgroundColor3 = Color3.fromRGB(110, 110, 255); - -- }) - -- end - -- end; - -- BackgroundColor3 = Color3.fromRGB(0,0,0); - -- }; - } -end - -return tweenTest