<snapdata remixID="14420797"><project name="OOP with Graphics" app="Snap! 10.7.2, https://snap.berkeley.edu" version="2"><notes>THIS LIBRARY REQUIRES JS!&#xD;&#xD;See inside this project to see info about this.&#xD;&#xD;IS BEING UPDATED! CAN NOT BE USED!</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="OOP with Graphics"><notes>THIS LIBRARY REQUIRES JS!&#xD;&#xD;See inside this project to see info about this.&#xD;&#xD;IS BEING UPDATED! CAN NOT BE USED!</notes><palette><category name="Objects" color="0,116,143,1"/></palette><hidden></hidden><headers></headers><code></code><blocks><block-definition s="class $nl constructor: %&apos;this&apos; %&apos;args&apos; %&apos;code&apos; $nl render: %&apos;this2&apos; %&apos;code2&apos; $nl functions: %&apos;functions&apos; $nl casts: %&apos;casts&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%upvar" initial="1"></input><input type="%scriptVars" initial="1">put constructor block here</input><input type="%cs" initial="1">put constructor block here</input><input type="%upvar" initial="1">this</input><input type="%cs" initial="1"></input><input type="%mult%s"></input><input type="%mult%s" initial="1"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l><l>args</l></list><l>ring.inputs = args.asArray();&#xD;&#xD;return ring</l></block><list><block var="code"/><block s="reportCONS"><l>this</l><block var="args"/></block></list></block><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l></list><l>ring.inputs = ["this"];&#xD;&#xD;return ring</l></block><list><block var="code2"/></list></block><block var="functions"/><block var="casts"/></list></block></block></script></block-definition><block-definition s="new %&apos;class&apos; ( %&apos;args&apos; )" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%s" initial="1">class here</input><input type="%mult%s" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>this</l></list></block><block s="doSetVar"><l>this</l><block s="evaluate"><block s="reportJSFunction"><list><l>_class</l></list><l>let obj = new SpriteMorph();&#xD;&#xD;let render = _class.at(2);&#xD;let funcs = _class.at(3).asArray();&#xD;let casts = _class.at(4).asArray();&#xD;&#xD;obj._render = render;&#xD;obj.getImage = function() {&#xD;    return invoke(obj._render, new List([this])).contents;&#xD;};&#xD;obj._vars = {};&#xD;&#xD;obj._funcs = {};&#xD;for (let i = 0; i &lt; funcs.length; i++) {&#xD;    let func = funcs[i];&#xD;    let key  = func.at(1);&#xD;    let val  = func.at(2);&#xD;    obj._funcs[key] = val;&#xD;}&#xD;&#xD;obj._type = _class;&#xD;&#xD;obj._casts = {&#xD;    "from": {&#xD;        "snap": {},&#xD;        "custom": {}&#xD;    },&#xD;    "to": {&#xD;        "snap": {},&#xD;        "custom": {}&#xD;    }&#xD;}&#xD;for (let i = 0; i &lt; casts.length; i++) {&#xD;    let cast = casts[i].asArray();&#xD;    let type = cast[0];&#xD;    let code = cast[1];&#xD;    let toOrFrom = cast[2];&#xD;    let typeType = cast[3];&#xD;&#xD;    obj._casts[toOrFrom][typeType][type] = code;&#xD;}&#xD;&#xD;return obj;</l></block><list><block var="class"/></list></block></block><block s="fork"><block s="reportListItem"><l>1</l><block var="class"/></block><block s="reportCONS"><block var="this"/><block var="args"/></block></block><block s="doWait"><l>0.01</l><comment w="267" collapsed="false">We have to do this or else it will just.. not work? Like it&apos;ll freeze if we try to display it right after this block if we DONT have this. Probably something Snap! needs to do; but I don&apos;t know what so I just put this here. *sigh*</comment></block><block s="doReport"><block var="this"/></block></script><scripts><script x="452" y="74.66666666666663"><block s="doReport"><l></l></block></script></scripts></block-definition><block-definition s="get type of %&apos;object&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>object</l></list><l>return object._type;</l></block><list><block var="object"/></list></block></block></script></block-definition><block-definition s="%&apos;object&apos; . %&apos;var&apos; = %&apos;value&apos;" type="command" category="Objects" space="true"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input><input type="%txt" initial="1">foo</input><input type="%s" initial="1">bar</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>_obj</l><l>_var</l><l>_val</l></list><l>_obj._vars[_var] = _val;</l></block><list><block var="object"/><block var="var"/><block var="value"/></list></block></script></block-definition><block-definition s="%&apos;object&apos; . %&apos;var&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input><input type="%txt" initial="1">foo</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>_obj</l><l>_var</l></list><l>return _obj._vars[_var];</l></block><list><block var="object"/><block var="var"/></list></block></block></script><scripts><script x="125" y="176.83333333333331"><block s="doRun"><block s="reifyScript"><script></script><list></list></block><list></list></block></script></scripts></block-definition><block-definition s="function %&apos;name&apos; %&apos;this&apos; %&apos;args&apos; %&apos;code&apos;" type="reporter" category="Objects" space="true"><header></header><code></code><translations></translations><inputs><input type="%txt" initial="1"></input><input type="%upvar" initial="1"></input><input type="%scriptVars" initial="1"></input><input type="%cs" initial="1"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="name"/><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l><l>args</l></list><l>ring.inputs = args.asArray();&#xD;&#xD;return ring</l></block><list><block var="code"/><block s="reportCONS"><l>this</l><block var="args"/></block></list></block></list></block></block></script></block-definition><block-definition s="function %&apos;name&apos; %&apos;this&apos; %&apos;code&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%txt" initial="1"></input><input type="%upvar" initial="1"></input><input type="%cs" initial="1"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="name"/><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l></list><l>ring.inputs = ["this"];&#xD;&#xD;return ring</l></block><list><block var="code"/></list></block></list></block></block></script></block-definition><block-definition s="%&apos;object&apos; . %&apos;func&apos; ( %&apos;args&apos; )" type="command" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input><input type="%txt" initial="1"></input><input type="%mult%s" initial="1"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>_obj</l><l>_func</l><l>_args</l></list><l>invoke(_obj._funcs[_func], _args);</l></block><list><block var="object"/><block var="func"/><block s="reportCONS"><block var="object"/><block var="args"/></block></list></block></script></block-definition><block-definition s="%&apos;object&apos; . %&apos;func&apos; ( %&apos;args&apos; ) with result" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input><input type="%txt" initial="1"></input><input type="%mult%s" initial="1"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>_obj</l><l>_func</l><l>_args</l></list><l>console.log(_obj._funcs);&#xD;return invoke(_obj._funcs[_func], _args);</l></block><list><block var="object"/><block var="func"/><block s="reportCONS"><block var="object"/><block var="args"/></block></list></block></block></script></block-definition><block-definition s="cast to Snap! type %&apos;type&apos; : %&apos;this&apos; %&apos;code&apos;" type="reporter" category="Objects" space="true"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true" irreplaceable="true" initial="1"><options>§_typesMenu</options></input><input type="%upvar" initial="1"></input><input type="%cs" initial="1"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reportJoinWords"><list><block var="type"/></list></block><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l></list><l>ring.inputs = ["this"];&#xD;&#xD;return ring</l></block><list><block var="code"/></list></block><l>to</l><l>snap</l></list></block></block></script></block-definition><block-definition s="cast from Snap! type %&apos;type&apos; : %&apos;input&apos; %&apos;this type&apos; %&apos;code&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true" irreplaceable="true" initial="1"><options>§_typesMenu</options></input><input type="%upvar" initial="1"></input><input type="%upvar" initial="1"></input><input type="%cs" initial="1"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reportJoinWords"><list><block var="type"/></list></block><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l></list><l>ring.inputs = ["input", "this type"];&#xD;&#xD;return ring</l></block><list><block var="code"/></list></block><l>from</l><l>snap</l></list></block></block></script></block-definition><block-definition s="convert object %&apos;obj&apos; to snap type %&apos;type&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%obj" initial="1"></input><input type="%s" readonly="true" irreplaceable="true" initial="1"><options>§_typesMenu</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>obj</l><l>_type</l></list><l>let func = obj._casts.to.snap[_type];&#xD;&#xD;return invoke(func, new List([obj]));</l></block><list><block var="obj"/><block s="reportJoinWords"><list><block var="type"/></list></block></list></block></block></script></block-definition><block-definition s="convert snap value %&apos;value&apos; to class %&apos;class&apos;" type="reporter" category="Objects"><header></header><code></code><translations></translations><inputs><input type="%s" initial="1"></input><input type="%s" initial="1"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="evaluate"><block s="reportJSFunction"><list><l>_value</l><l>_class</l></list><l>_class = _class.asArray();&#xD;let casts = _class[3].asArray();&#xD;let _type = new Process().reportTypeOf(_value);&#xD;&#xD;try {&#xD;for (let i = 0; i &lt; casts.length; i++) {&#xD;    let cast = casts[i].asArray();&#xD;    let type = cast[0];&#xD;    let code = cast[1];&#xD;    let toOrFrom = cast[2];&#xD;    let typeType = cast[3];&#xD;&#xD;    if (toOrFrom == "from" &amp;&amp; typeType == "snap" &amp;&amp; type == _type) {&#xD;        return code;&#xD;    }&#xD;}&#xD;} catch (e) {&#xD;console.log(e);&#xD;throw e;&#xD;}&#xD;&#xD;throw new Error("no cast found");</l></block><list><block var="value"/><block var="class"/></list></block><list><block var="value"/><block var="class"/></list></block></block></script></block-definition></blocks><primitives><block-definition s="is %&apos;#1&apos; a %&apos;#2&apos; ?" type="predicate" category="operators" selector="reportIsA" primitive="reportIsA"><header></header><code></code><translations></translations><inputs><input type="%s">5</input><input type="%s" readonly="true" irreplaceable="true">$_number<options>§_typesMenu</options></input></inputs><script><block s="doPrimitive"><l><bool>true</bool></l><l>reportIsA</l></block></script></block-definition></primitives><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="311"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="312"></list></costumes><sounds><list struct="atomic" id="313"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Tutorial" idx="1" x="27.999999999999545" y="13.999999999999943" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="1" color="80,80,80,1" pen="tip" id="318"><costumes><list id="319"><item><ref mediaID="OOP with Graphics_Tutorial_cst_text"></ref></item></list></costumes><sounds><list struct="atomic" id="320"></list></sounds><blocks></blocks><variables></variables><scripts><comment x="20" y="20" w="793" collapsed="false">                                                                                                                         THIS LIBRARY REQUIRES JS!</comment><comment x="20" y="74" w="798" collapsed="false">Forum page related to this: https://forum.snap.berkeley.edu/t/objects-but-with-custom-graphics/19601/7</comment><script x="20" y="128"><block s="doSetVar"><l>Fraction</l><custom-block s="class %br constructor: %upvar %scriptVars %cs %br render: %upvar %cs %br functions: %mult%s %br casts: %mult%s"><l>this</l><list><l>numerator</l><l>denominator</l></list><script><custom-block s="%obj . %txt = %s"><block var="this"/><l>numerator</l><block var="numerator"/></custom-block><custom-block s="%obj . %txt = %s"><block var="this"/><l>denominator</l><block var="denominator"/></custom-block></script><l>this</l><script><block s="doReport"><custom-block s="costume from text %s size %n"><block s="reportJoinWords"><list><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><l>/</l><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></list></block><l>72</l></custom-block></block></script><list><custom-block s="function %txt %upvar %cs"><l>toNumber</l><l>this</l><script><block s="doReport"><block s="reportQuotient"><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></block></block></script></custom-block></list><list><custom-block s="cast to Snap! type %s : %upvar %cs"><l><option>number</option></l><l>this</l><script><block s="doReport"><block s="reportQuotient"><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></block></block></script></custom-block><custom-block s="cast from Snap! type %s : %upvar %upvar %cs"><l><option>number</option></l><l>input</l><l>this type</l><script><block s="doReport"><custom-block s="new %s ( %mult%s )"><block var="this type"/><list><block var="input"/><l>1</l></list></custom-block></block></script></custom-block></list></custom-block><comment w="309" collapsed="false">This is a example of using the class block - a fraction.&#xD;&#xD;In the constructor part, you put  the code that will run when you call new on this Fraction class. &quot;this&quot; is the class you will set values of. This is similar to Python&apos;s __init__ (if you know what that is.)&#xD;&#xD;The next part is the render function. This function will be called whenever the class has to be displayed (e.g. in a say bubble.) This will have to return a costume (in this case, using a text costume).&#xD;&#xD;The third part are the functions. You have two types - statement and reporter (reporters with report, statements with none). Note - you CAN call a statement with the reporter function call block and vice-versa. However, it wont work that well (for statements in reporter, it will report nothing, for reporters in statement it will run without the result, which actually might be useful.)&#xD;&#xD;The last part are the casts. For right now, there&apos;s only casts to and from Snap! types. I plan to implement it to other classes in the future.&#xD;You might notice in the cast from block here, theres a &quot;this type&quot;. I dont know if this actually fixes anything, but I&apos;m too lazy to remove it as right now.&#xD;&#xD;One thing that also exists in this library are variables. Self-explantory.</comment></block></script><script x="20" y="530.8333333333334"><block s="doSetVar"><l>half</l><custom-block s="new %s ( %mult%s )"><block var="Fraction"/><list><l>1</l><l>2</l></list></custom-block><comment w="532.0000000000002" collapsed="false">This is a example of creating a class. This creates a one half value, from the Fraction class. Note that the class block is just a reporter, you need to actually set a variable with the class.</comment></block></script><script x="20" y="599.8333333333334"><block s="bubble"><block s="reportJoinWords"><list><l>Numerator: </l><custom-block s="%obj . %txt"><block var="half"/><l>numerator</l></custom-block><l>, Denominator: </l><custom-block s="%obj . %txt"><block var="half"/><l>denominator</l></custom-block></list></block><comment w="355" collapsed="false">This is a example of getting properties from the object. Really simple - just pass the object and property name.</comment></block></script><script x="20" y="668.8333333333334"><block s="bubble"><block s="reportJoinWords"><list><l>Value:</l><custom-block s="%obj . %txt ( %mult%s ) with result"><block var="half"/><l>toNumber</l><list></list></custom-block></list></block><comment w="454.9999999999999" collapsed="false">Example of running a function.</comment></block></script><script x="20" y="725.8333333333334"><block var="half"><comment w="757" collapsed="false">Now, click on this. When you see the bubble, it will say 1/2! (if you actually created the class and object eariler) THATS THE MAIN FEATURE OF THIS!! YAY!!!!</comment></block></script><script x="20" y="782.8333333333334"><block s="bubble"><block var="half"/><comment w="722" collapsed="false">It also works on say.</comment></block></script><comment x="20" y="839.8333333333334" w="798" collapsed="false">                                    WARNING: YOU MIGHT EXPERIENCE FREEZES WHEN USING THIS LIBRARY! MAKE SURE TO SAVE. YOUR. PROJECTS.</comment><comment x="20" y="893.8333333333334" w="797" collapsed="false">Things I want to do&#xD;* Fix the bubble glitch where it gets cut off&#xD;* Add getters and setters&#xD;* Add casts to and from other classes (the starting stuff is there, I just need to implement the two cast blocks and the actuall casting)&#xD;* Static methods on classes (methods you can call without a class)</comment><comment x="20" y="995.8333333333335" w="796" collapsed="false">Changelog:&#xD; 1.0 - Initial release&#xD; 1.1 - More features!&#xD;  + Function block without arguments&#xD;  + Casts (only to and from Snap! types for now)&#xD;  + Include the type objects were created from</comment></scripts></sprite><watcher var="Fraction" style="normal" x="56" y="41" color="243,118,29" hidden="true"/><watcher var="half" style="normal" x="58.76494023904411" y="32.912352597609605" color="243,118,29"/></sprites></stage><variables><variable name="Fraction"><list id="457"><item><context id="458"><inputs><input>this</input><input>numerator</input><input>denominator</input></inputs><variables></variables><script><custom-block s="%obj . %txt = %s"><block var="this"/><l>numerator</l><block var="numerator"/></custom-block><custom-block s="%obj . %txt = %s"><block var="this"/><l>denominator</l><block var="denominator"/></custom-block></script><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin><context id="469"><inputs></inputs><variables><variable name="numerator"><l>0</l></variable><variable name="denominator"><l>0</l></variable><variable name="this"><l>this</l></variable><variable name="input"><l>input</l></variable><variable name="this type"><l>this type</l></variable></variables><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin></context></context></item><item><context id="471"><inputs><input>this</input></inputs><variables></variables><script><block s="doReport"><custom-block s="costume from text %s size %n"><block s="reportJoinWords"><list><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><l>/</l><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></list></block><l>72</l></custom-block></block></script><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin></context></item><item><list id="491"><item><list id="492"><item><l>toNumber</l></item><item><context id="493"><inputs><input>this</input></inputs><variables></variables><script><block s="doReport"><block s="reportQuotient"><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></block></block></script><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin></context></item></list></item></list></item><item><list id="507"><item><list id="508"><item><l>number</l></item><item><context id="509"><inputs><input>this</input></inputs><variables></variables><script><block s="doReport"><block s="reportQuotient"><custom-block s="%obj . %txt"><block var="this"/><l>numerator</l></custom-block><custom-block s="%obj . %txt"><block var="this"/><l>denominator</l></custom-block></block></block></script><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin></context></item><item><l>to</l></item><item><l>snap</l></item></list></item><item><list id="523"><item><l>number</l></item><item><context id="524"><inputs><input>input</input><input>this type</input></inputs><variables></variables><script><block s="doReport"><custom-block s="new %s ( %mult%s )"><block var="this type"/><list><block var="input"/><l>1</l></list></custom-block></block></script><receiver><ref id="318"></ref></receiver><origin><ref id="318"></ref></origin></context></item><item><l>from</l></item><item><l>snap</l></item></list></item></list></item></list></variable><variable name="half"><l>0</l></variable></variables></scene></scenes></project><media name="OOP with Graphics" app="Snap! 10.7.2, https://snap.berkeley.edu" version="2"><costume name="text" center-x="187" center-y="69" image="data:image/png;base64,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" mediaID="OOP with Graphics_Tutorial_cst_text"/></media></snapdata>