12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="generator" content="Asciidoctor 1.5.4">
- <title>Scripting in JME3 with Groovy. All about it!</title>
- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
- <style>
- /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
- /* Remove comment around @import statement below when using as a custom stylesheet */
- /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
- article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
- audio,canvas,video{display:inline-block}
- audio:not([controls]){display:none;height:0}
- [hidden],template{display:none}
- script{display:none!important}
- html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
- body{margin:0}
- a{background:transparent}
- a:focus{outline:thin dotted}
- a:active,a:hover{outline:0}
- h1{font-size:2em;margin:.67em 0}
- abbr[title]{border-bottom:1px dotted}
- b,strong{font-weight:bold}
- dfn{font-style:italic}
- hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
- mark{background:#ff0;color:#000}
- code,kbd,pre,samp{font-family:monospace;font-size:1em}
- pre{white-space:pre-wrap}
- q{quotes:"\201C" "\201D" "\2018" "\2019"}
- small{font-size:80%}
- sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
- sup{top:-.5em}
- sub{bottom:-.25em}
- img{border:0}
- svg:not(:root){overflow:hidden}
- figure{margin:0}
- fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
- legend{border:0;padding:0}
- button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
- button,input{line-height:normal}
- button,select{text-transform:none}
- button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
- button[disabled],html input[disabled]{cursor:default}
- input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
- input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
- input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
- button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
- textarea{overflow:auto;vertical-align:top}
- table{border-collapse:collapse;border-spacing:0}
- *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
- html,body{font-size:100%}
- body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
- a:hover{cursor:pointer}
- img,object,embed{max-width:100%;height:auto}
- object,embed{height:100%}
- img{-ms-interpolation-mode:bicubic}
- .left{float:left!important}
- .right{float:right!important}
- .text-left{text-align:left!important}
- .text-right{text-align:right!important}
- .text-center{text-align:center!important}
- .text-justify{text-align:justify!important}
- .hide{display:none}
- body{-webkit-font-smoothing:antialiased}
- img,object,svg{display:inline-block;vertical-align:middle}
- textarea{height:auto;min-height:50px}
- select{width:100%}
- .center{margin-left:auto;margin-right:auto}
- .spread{width:100%}
- p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
- .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
- div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
- a{color:#2156a5;text-decoration:underline;line-height:inherit}
- a:hover,a:focus{color:#1d4b8f}
- a img{border:none}
- p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
- p aside{font-size:.875em;line-height:1.35;font-style:italic}
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
- h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
- h1{font-size:2.125em}
- h2{font-size:1.6875em}
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
- h4,h5{font-size:1.125em}
- h6{font-size:1em}
- hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
- em,i{font-style:italic;line-height:inherit}
- strong,b{font-weight:bold;line-height:inherit}
- small{font-size:60%;line-height:inherit}
- code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
- ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
- ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
- ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
- ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
- ul.square{list-style-type:square}
- ul.circle{list-style-type:circle}
- ul.disc{list-style-type:disc}
- ul.no-bullet{list-style:none}
- ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
- dl dt{margin-bottom:.3125em;font-weight:bold}
- dl dd{margin-bottom:1.25em}
- abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
- abbr{text-transform:none}
- blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
- blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
- blockquote cite:before{content:"\2014 \0020"}
- blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
- blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
- @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
- h1{font-size:2.75em}
- h2{font-size:2.3125em}
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
- h4{font-size:1.4375em}}
- table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
- table thead,table tfoot{background:#f7f8f7;font-weight:bold}
- table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
- table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
- table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
- table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
- body{tab-size:4}
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
- h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
- .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
- .clearfix:after,.float-group:after{clear:both}
- *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
- pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
- .keyseq{color:rgba(51,51,51,.8)}
- kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
- .keyseq kbd:first-child{margin-left:0}
- .keyseq kbd:last-child{margin-right:0}
- .menuseq,.menu{color:rgba(0,0,0,.8)}
- b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
- b.button:before{content:"[";padding:0 3px 0 2px}
- b.button:after{content:"]";padding:0 2px 0 3px}
- p a>code:hover{color:rgba(0,0,0,.9)}
- #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
- #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
- #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
- #content{margin-top:1.25em}
- #content:before{content:none}
- #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
- #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
- #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
- #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
- #header .details span:first-child{margin-left:-.125em}
- #header .details span.email a{color:rgba(0,0,0,.85)}
- #header .details br{display:none}
- #header .details br+span:before{content:"\00a0\2013\00a0"}
- #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
- #header .details br+span#revremark:before{content:"\00a0|\00a0"}
- #header #revnumber{text-transform:capitalize}
- #header #revnumber:after{content:"\00a0"}
- #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
- #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
- #toc>ul{margin-left:.125em}
- #toc ul.sectlevel0>li>a{font-style:italic}
- #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
- #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
- #toc li{line-height:1.3334;margin-top:.3334em}
- #toc a{text-decoration:none}
- #toc a:active{text-decoration:underline}
- #toctitle{color:#7a2518;font-size:1.2em}
- @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
- body.toc2{padding-left:15em;padding-right:0}
- #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
- #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
- #toc.toc2>ul{font-size:.9em;margin-bottom:0}
- #toc.toc2 ul ul{margin-left:0;padding-left:1em}
- #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
- body.toc2.toc-right{padding-left:0;padding-right:15em}
- body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
- @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
- #toc.toc2{width:20em}
- #toc.toc2 #toctitle{font-size:1.375em}
- #toc.toc2>ul{font-size:.95em}
- #toc.toc2 ul ul{padding-left:1.25em}
- body.toc2.toc-right{padding-left:0;padding-right:20em}}
- #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
- #content #toc>:first-child{margin-top:0}
- #content #toc>:last-child{margin-bottom:0}
- #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
- #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
- .sect1{padding-bottom:.625em}
- @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
- .sect1+.sect1{border-top:1px solid #efefed}
- #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
- #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
- #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
- #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
- #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
- .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
- .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
- table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
- .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
- table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
- .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
- .admonitionblock>table td.icon{text-align:center;width:80px}
- .admonitionblock>table td.icon img{max-width:none}
- .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
- .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
- .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
- .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
- .exampleblock>.content>:first-child{margin-top:0}
- .exampleblock>.content>:last-child{margin-bottom:0}
- .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
- .sidebarblock>:first-child{margin-top:0}
- .sidebarblock>:last-child{margin-bottom:0}
- .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
- .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
- .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
- .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
- .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
- .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
- @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
- @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
- .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
- .listingblock pre.highlightjs{padding:0}
- .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
- .listingblock pre.prettyprint{border-width:0}
- .listingblock>.content{position:relative}
- .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
- .listingblock:hover code[data-lang]:before{display:block}
- .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
- .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
- table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
- table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
- table.pyhltable td.code{padding-left:.75em;padding-right:0}
- pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
- pre.pygments .lineno{display:inline-block;margin-right:.25em}
- table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
- .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
- .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
- .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
- .quoteblock blockquote{margin:0;padding:0;border:0}
- .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
- .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
- .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
- .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
- .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
- .quoteblock .quoteblock blockquote:before{display:none}
- .verseblock{margin:0 1em 1.25em 1em}
- .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
- .verseblock pre strong{font-weight:400}
- .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
- .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
- .quoteblock .attribution br,.verseblock .attribution br{display:none}
- .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
- .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
- .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
- .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
- table.tableblock{max-width:100%;border-collapse:separate}
- table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
- table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
- table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
- table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
- table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
- table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
- table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
- table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
- table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
- table.frame-all{border-width:1px}
- table.frame-sides{border-width:0 1px}
- table.frame-topbot{border-width:1px 0}
- th.halign-left,td.halign-left{text-align:left}
- th.halign-right,td.halign-right{text-align:right}
- th.halign-center,td.halign-center{text-align:center}
- th.valign-top,td.valign-top{vertical-align:top}
- th.valign-bottom,td.valign-bottom{vertical-align:bottom}
- th.valign-middle,td.valign-middle{vertical-align:middle}
- table thead th,table tfoot th{font-weight:bold}
- tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
- tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
- p.tableblock>code:only-child{background:none;padding:0}
- p.tableblock{font-size:1em}
- td>div.verse{white-space:pre}
- ol{margin-left:1.75em}
- ul li ol{margin-left:1.5em}
- dl dd{margin-left:1.125em}
- dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
- ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
- ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
- ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
- ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
- ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
- ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
- ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
- ul.inline>li>*{display:block}
- .unstyled dl dt{font-weight:400;font-style:normal}
- ol.arabic{list-style-type:decimal}
- ol.decimal{list-style-type:decimal-leading-zero}
- ol.loweralpha{list-style-type:lower-alpha}
- ol.upperalpha{list-style-type:upper-alpha}
- ol.lowerroman{list-style-type:lower-roman}
- ol.upperroman{list-style-type:upper-roman}
- ol.lowergreek{list-style-type:lower-greek}
- .hdlist>table,.colist>table{border:0;background:none}
- .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
- td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
- td.hdlist1{font-weight:bold;padding-bottom:1.25em}
- .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
- .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
- .colist>table tr>td:last-of-type{padding:.25em 0}
- .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
- .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
- .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
- .imageblock>.title{margin-bottom:0}
- .imageblock.thumb,.imageblock.th{border-width:6px}
- .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
- .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
- .image.left{margin-right:.625em}
- .image.right{margin-left:.625em}
- a.image{text-decoration:none;display:inline-block}
- a.image object{pointer-events:none}
- sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
- sup.footnote a,sup.footnoteref a{text-decoration:none}
- sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
- #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
- #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
- #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
- #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
- #footnotes .footnote:last-of-type{margin-bottom:0}
- #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
- .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
- .gist .file-data>table td.line-data{width:99%}
- div.unbreakable{page-break-inside:avoid}
- .big{font-size:larger}
- .small{font-size:smaller}
- .underline{text-decoration:underline}
- .overline{text-decoration:overline}
- .line-through{text-decoration:line-through}
- .aqua{color:#00bfbf}
- .aqua-background{background-color:#00fafa}
- .black{color:#000}
- .black-background{background-color:#000}
- .blue{color:#0000bf}
- .blue-background{background-color:#0000fa}
- .fuchsia{color:#bf00bf}
- .fuchsia-background{background-color:#fa00fa}
- .gray{color:#606060}
- .gray-background{background-color:#7d7d7d}
- .green{color:#006000}
- .green-background{background-color:#007d00}
- .lime{color:#00bf00}
- .lime-background{background-color:#00fa00}
- .maroon{color:#600000}
- .maroon-background{background-color:#7d0000}
- .navy{color:#000060}
- .navy-background{background-color:#00007d}
- .olive{color:#606000}
- .olive-background{background-color:#7d7d00}
- .purple{color:#600060}
- .purple-background{background-color:#7d007d}
- .red{color:#bf0000}
- .red-background{background-color:#fa0000}
- .silver{color:#909090}
- .silver-background{background-color:#bcbcbc}
- .teal{color:#006060}
- .teal-background{background-color:#007d7d}
- .white{color:#bfbfbf}
- .white-background{background-color:#fafafa}
- .yellow{color:#bfbf00}
- .yellow-background{background-color:#fafa00}
- span.icon>.fa{cursor:default}
- .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
- .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
- .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
- .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
- .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
- .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
- .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
- .conum[data-value] *{color:#fff!important}
- .conum[data-value]+b{display:none}
- .conum[data-value]:after{content:attr(data-value)}
- pre .conum[data-value]{position:relative;top:-.125em}
- b.conum *{color:inherit!important}
- .conum:not([data-value]):empty{display:none}
- dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
- h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
- p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
- p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
- p{margin-bottom:1.25rem}
- .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
- .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
- .print-only{display:none!important}
- @media print{@page{margin:1.25cm .75cm}
- *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
- a{color:inherit!important;text-decoration:underline!important}
- a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
- a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
- abbr[title]:after{content:" (" attr(title) ")"}
- pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
- thead{display:table-header-group}
- svg{max-width:100%}
- p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
- h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
- #toc,.sidebarblock,.exampleblock>.content{background:none!important}
- #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
- .sect1{padding-bottom:0!important}
- .sect1+.sect1{border:0!important}
- #header>h1:first-child{margin-top:1.25rem}
- body.book #header{text-align:center}
- body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
- body.book #header .details{border:0!important;display:block;padding:0!important}
- body.book #header .details span:first-child{margin-left:0!important}
- body.book #header .details br{display:block}
- body.book #header .details br+span:before{content:none!important}
- body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
- body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
- .listingblock code[data-lang]:before{display:block}
- #footer{background:none!important;padding:0 .9375em}
- #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
- .hide-on-print{display:none!important}
- .print-only{display:block!important}
- .hide-for-print{display:none!important}
- .show-for-print{display:inherit!important}}
- </style>
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
- <style>
- /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
- /*pre.CodeRay {background-color:#f7f7f8;}*/
- .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
- .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
- .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
- table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
- table.CodeRay td{vertical-align: top;line-height:1.45}
- table.CodeRay td.line-numbers{text-align:right}
- table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
- table.CodeRay td.code{padding:0 0 0 .5em}
- table.CodeRay td.code>pre{padding:0}
- .CodeRay .debug{color:#fff !important;background:#000080 !important}
- .CodeRay .annotation{color:#007}
- .CodeRay .attribute-name{color:#000080}
- .CodeRay .attribute-value{color:#700}
- .CodeRay .binary{color:#509}
- .CodeRay .comment{color:#998;font-style:italic}
- .CodeRay .char{color:#04d}
- .CodeRay .char .content{color:#04d}
- .CodeRay .char .delimiter{color:#039}
- .CodeRay .class{color:#458;font-weight:bold}
- .CodeRay .complex{color:#a08}
- .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
- .CodeRay .color{color:#099}
- .CodeRay .class-variable{color:#369}
- .CodeRay .decorator{color:#b0b}
- .CodeRay .definition{color:#099}
- .CodeRay .delimiter{color:#000}
- .CodeRay .doc{color:#970}
- .CodeRay .doctype{color:#34b}
- .CodeRay .doc-string{color:#d42}
- .CodeRay .escape{color:#666}
- .CodeRay .entity{color:#800}
- .CodeRay .error{color:#808}
- .CodeRay .exception{color:inherit}
- .CodeRay .filename{color:#099}
- .CodeRay .function{color:#900;font-weight:bold}
- .CodeRay .global-variable{color:#008080}
- .CodeRay .hex{color:#058}
- .CodeRay .integer,.CodeRay .float{color:#099}
- .CodeRay .include{color:#555}
- .CodeRay .inline{color:#000}
- .CodeRay .inline .inline{background:#ccc}
- .CodeRay .inline .inline .inline{background:#bbb}
- .CodeRay .inline .inline-delimiter{color:#d14}
- .CodeRay .inline-delimiter{color:#d14}
- .CodeRay .important{color:#555;font-weight:bold}
- .CodeRay .interpreted{color:#b2b}
- .CodeRay .instance-variable{color:#008080}
- .CodeRay .label{color:#970}
- .CodeRay .local-variable{color:#963}
- .CodeRay .octal{color:#40e}
- .CodeRay .predefined{color:#369}
- .CodeRay .preprocessor{color:#579}
- .CodeRay .pseudo-class{color:#555}
- .CodeRay .directive{font-weight:bold}
- .CodeRay .type{font-weight:bold}
- .CodeRay .predefined-type{color:inherit}
- .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
- .CodeRay .key{color:#808}
- .CodeRay .key .delimiter{color:#606}
- .CodeRay .key .char{color:#80f}
- .CodeRay .value{color:#088}
- .CodeRay .regexp .delimiter{color:#808}
- .CodeRay .regexp .content{color:#808}
- .CodeRay .regexp .modifier{color:#808}
- .CodeRay .regexp .char{color:#d14}
- .CodeRay .regexp .function{color:#404;font-weight:bold}
- .CodeRay .string{color:#d20}
- .CodeRay .string .string .string{background:#ffd0d0}
- .CodeRay .string .content{color:#d14}
- .CodeRay .string .char{color:#d14}
- .CodeRay .string .delimiter{color:#d14}
- .CodeRay .shell{color:#d14}
- .CodeRay .shell .delimiter{color:#d14}
- .CodeRay .symbol{color:#990073}
- .CodeRay .symbol .content{color:#a60}
- .CodeRay .symbol .delimiter{color:#630}
- .CodeRay .tag{color:#008080}
- .CodeRay .tag-special{color:#d70}
- .CodeRay .variable{color:#036}
- .CodeRay .insert{background:#afa}
- .CodeRay .delete{background:#faa}
- .CodeRay .change{color:#aaf;background:#007}
- .CodeRay .head{color:#f8f;background:#505}
- .CodeRay .insert .insert{color:#080}
- .CodeRay .delete .delete{color:#800}
- .CodeRay .change .change{color:#66f}
- .CodeRay .head .head{color:#f4f}
- </style>
- </head>
- <body class="article toc2 toc-left">
- <div id="header">
- <h1>Scripting in JME3 with Groovy. All about it!</h1>
- <div id="toc" class="toc2">
- <div id="toctitle">Table of Contents</div>
- <ul class="sectlevel1">
- <li><a href="#introduction">Introduction:</a></li>
- <li><a href="#content">Content:</a></li>
- <li><a href="#get-started">GET STARTED</a>
- <ul class="sectlevel2">
- <li><a href="#what-is-groovy">WHAT IS GROOVY?</a></li>
- <li><a href="#highlight">Highlight</a></li>
- <li><a href="#setup-groovy">SETUP GROOVY?</a></li>
- <li><a href="#what-can-be-script">WHAT CAN BE SCRIPT</a></li>
- <li><a href="#when-to-use-scripting">WHEN TO USE SCRIPTING:</a></li>
- <li><a href="#note">NOTE:</a></li>
- </ul>
- </li>
- <li><a href="#learn-groovy">LEARN GROOVY</a>
- <ul class="sectlevel2">
- <li><a href="#groovy-for-smarty">Groovy – for smarty</a></li>
- <li><a href="#official-examples-misc">Official examples & Misc</a></li>
- <li><a href="#gpars">GPars</a></li>
- </ul>
- </li>
- <li><a href="#embed-groovy">EMBED GROOVY</a>
- <ul class="sectlevel2">
- <li><a href="#overview">OVERVIEW</a></li>
- <li><a href="#groovy-in-jme3">Groovy in JME3</a></li>
- <li><a href="#groovy-in-jmp">Groovy in JMP</a></li>
- <li><a href="#groovy-everywhere-snipets">Groovy everywhere (snipets)</a></li>
- </ul>
- </li>
- <li><a href="#into-the-game">INTO THE GAME</a>
- <ul class="sectlevel2">
- <li><a href="#basic-scripts">Basic Scripts</a></li>
- <li><a href="#event-trigger-manager">Event – Trigger - Manager</a></li>
- <li><a href="#configurations-with-groovy">Configurations with Groovy</a></li>
- <li><a href="#ai-tricks-with-groovy">AI Tricks with Groovy</a></li>
- <li><a href="#build-script-with-groovy">Build Script with Groovy</a></li>
- </ul>
- </li>
- <li><a href="#design-patterns-in-groovy-game-wip">DESIGN PATTERNS IN GROOVY GAME (WIP)</a></li>
- <li><a href="#advanced-tricks">ADVANCED TRICKS</a>
- <ul class="sectlevel2">
- <li><a href="#hack-the-jvm-with-groovy">Hack the JVM with Groovy</a></li>
- <li><a href="#codegen">Codegen</a></li>
- <li><a href="#groovy-almighty-god">Groovy – Almighty God!</a></li>
- </ul>
- </li>
- <li><a href="#conclusion">CONCLUSION</a></li>
- </ul>
- </div>
- </div>
- <div id="content">
- <div id="preamble">
- <div class="sectionbody">
- <div class="paragraph">
- <p><strong>Monkeys</strong>,+</p>
- </div>
- <div class="paragraph">
- <p>+</p>
- </div>
- <div class="paragraph">
- <p>For anyone who still ask for something like <strong>“Scripting” with JME3</strong>, here is it, about it at once!</p>
- </div>
- <div class="paragraph">
- <p>We nearly reach 3.0, i’m so excited about it and want to write something for it. In this post you will have a good run from Zero to Hero with Groovy and Monkey :p
- Not kidding!</p>
- </div>
- <div class="imageblock" style="text-align: right">
- <div class="content">
- <img src="images/wiki/stll_monkey_typing.jpg" alt="100" height="">
- </div>
- </div>
- <div class="paragraph">
- <p>emoji:
- *Quick question*emoji:confused+</p>
- </div>
- <div class="paragraph">
- <p>*Answer*emoji:confused</p>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="introduction">Introduction:</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>We will go from basic setup of Groovy in JMP and then example by example every aspect of game you can develop with Groovy.
- More advanced topic come at the end, eg: the way to get the speed of Java, meta-programing, a lot of programming patterns (PP), even AI and Constraint Programming…
- Sounds insanse? Nah ah…</p>
- </div>
- <div class="paragraph">
- <p>Let’s start!</p>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="content">Content:</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>+</p>
- </div>
- <div class="paragraph">
- <p>+</p>
- </div>
- <div class="paragraph">
- <p>+</p>
- </div>
- <div class="olist arabic">
- <ol class="arabic">
- <li>
- <p>GET STARTED</p>
- </li>
- <li>
- <p>LEARN GROOVY</p>
- <div class="olist loweralpha">
- <ol class="loweralpha" type="a">
- <li>
- <p>Syntax and Gotchas</p>
- </li>
- <li>
- <p>Meta-programming</p>
- </li>
- <li>
- <p>Groovy Builder – SwingBuilder</p>
- </li>
- <li>
- <p>Groovy – for smarty</p>
- </li>
- <li>
- <p>GPars</p>
- </li>
- </ol>
- </div>
- </li>
- <li>
- <p>EMBED GROOVY</p>
- <div class="olist loweralpha">
- <ol class="loweralpha" type="a">
- <li>
- <p>Groovy in JME3</p>
- </li>
- <li>
- <p>Groovy in JMP</p>
- </li>
- <li>
- <p>Groovy everywhere (snipets)</p>
- </li>
- </ol>
- </div>
- </li>
- <li>
- <p>INTO THE GAME</p>
- <div class="olist loweralpha">
- <ol class="loweralpha" type="a">
- <li>
- <p>Basic Scripts</p>
- </li>
- <li>
- <p>Event – Trigger Manager</p>
- </li>
- <li>
- <p>Configurations with Groovy</p>
- </li>
- <li>
- <p>AI Tricks with Groovy</p>
- </li>
- <li>
- <p>Build Script with Groovy</p>
- </li>
- </ol>
- </div>
- </li>
- <li>
- <p>DESIGN PATTERNS IN GROOVY GAME (WIP)</p>
- </li>
- <li>
- <p>ADVANCED TRICKS</p>
- <div class="olist loweralpha">
- <ol class="loweralpha" type="a">
- <li>
- <p>Hack the JVM with Groovy</p>
- </li>
- <li>
- <p>Codegen</p>
- </li>
- <li>
- <p>Groovy – Almighty God!</p>
- </li>
- </ol>
- </div>
- </li>
- </ol>
- </div>
- <hr>
- </div>
- </div>
- <div class="sect1">
- <h2 id="get-started">GET STARTED</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p><a href="jme3/scripting.html#into_the_game">scripting</a></p>
- </div>
- <div class="sect2">
- <h3 id="what-is-groovy">WHAT IS GROOVY?</h3>
- <div class="paragraph">
- <p><strong>Groovy</strong>…</p>
- </div>
- <div class="imageblock" style="text-align: right">
- <div class="content">
- <img src="images/wiki/groovy-logo.png" alt="200" height="">
- </div>
- </div>
- <div class="paragraph">
- <p>is an agile and dynamic language for the Java Virtual Machine
- builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk</p>
- </div>
- <div class="paragraph">
- <p><a href="http://groovy.codehaus.org/">http://groovy.codehaus.org/</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="highlight">Highlight</h3>
- <div class="paragraph">
- <p>The shortest highlight of the language can be found here:+</p>
- </div>
- <div class="paragraph">
- <p><a href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29">http://en.wikipedia.org/wiki/Groovy_%28programming_language%29</a></p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Most valid Java files are also valid Groovy files. Although the two languages are similar, Groovy code can be more compact, because it does not require all the elements that Java requires. This makes it possible for Java programmers to gradually learn Groovy by starting with familiar Java syntax before acquiring more Groovy idioms.</p>
- </li>
- <li>
- <p>Groovy features not available in Java include both static and dynamic typing (with the def keyword), closures, operator overloading, native syntax for lists and associative arrays (maps), native support for regular expressions, polymorphic iteration, expressions embedded inside strings, additional helper methods, and the safe navigation operator “?. to automatically check for nulls (for example, “variable?.method(), or “variable?.field).</p>
- </li>
- <li>
- <p>Since version 2 Groovy also supports modularity, being able to ship only the needed jars according to the project needs, thus reducing the size of groovy’s lib, type checking, static compilation, Project Coin syntax enhancements, multicatch blocks and ongoing performance enhancements using JDK7’s invoke dynamic instruction.</p>
- </li>
- <li>
- <p>Groovy provides native support for various markup languages such as XML and <abbr title="HyperText Markup Language">HTML</abbr>, accomplished via an inline DOM syntax. This feature enables the definition and manipulation of many types of heterogeneous data assets with a uniform and concise syntax and programming methodology.[citation needed]</p>
- </li>
- <li>
- <p>Unlike Java, a Groovy source code file can be executed as an (uncompiled) script if it contains code outside any class definition, is a class with a main method, or is a Runnable or GroovyTestCase. A Groovy script is fully parsed, compiled, and generated before execution (similar to Perl and Ruby). (This occurs under the hood, and the compiled version is not saved as an artifact of the process.)</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect2">
- <h3 id="setup-groovy">SETUP GROOVY?</h3>
- <div class="paragraph">
- <p>If you used JMP to code your game (I don’t know about Eclipse users, sorry). Go to Update Center to install Groovy plugin, then download the lastest Groovy (ver2.1) and wrap it as a Library. You are ready for the adventure!</p>
- </div>
- <div class="paragraph">
- <p><a href="http://groovy.codehaus.org/Download?nc">http://groovy.codehaus.org/Download?nc</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="what-can-be-script">WHAT CAN BE SCRIPT</h3>
- <div class="paragraph">
- <p><em>*or “TO SCRIPT OR NOT TO SCRIPT, is the PROBLEM”?*</em></p>
- </div>
- <div class="paragraph">
- <p><strong>Everything</strong>.
- You can do almost every thing with Groovy just like with Java.</p>
- </div>
- <div class="paragraph">
- <p>In this post i will show example by example every aspect of game you can develop with Groovy.</p>
- </div>
- <div class="paragraph">
- <p><u>*Pros:*</u></p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Scripting is very common and intuitive way to do game programing. It’s common because it’s shorter, cleaner, easy to read, maintain and re-use.</p>
- </li>
- <li>
- <p>Groovy is young but developed by very talent people, a lot of devoted contributors.</p>
- </li>
- <li>
- <p>Web and Enterprise in your hand. Ever heard of Grails <a href="http://grails.org/">http://grails.org/</a>?</p>
- </li>
- <li>
- <p>Multi-additions to fullfil Java. God-like in Swing, ORM, XML…</p>
- </li>
- <li>
- <p>Performance improved recently: If you worry about the performance, , in the next release, it can even get to the speed of Java, and soon to be a very competitive opponent to Scala! Read this? <a href="http://java.dzone.com/articles/groovy-20-performance-compared">http://java.dzone.com/articles/groovy-20-performance-compared</a></p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p><u>*Cons:*</u>
- It’s good, but what about the down-side?</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Can not run in Android, yet!</p>
- </li>
- <li>
- <p>Some things can be wrong without noticed, appeared in run-time like every scripting language</p>
- </li>
- <li>
- <p>Still a performance problem.</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect2">
- <h3 id="when-to-use-scripting">WHEN TO USE SCRIPTING:</h3>
- <div class="paragraph">
- <p>Some obvious but always existing problems of Scripting.</p>
- </div>
- <div class="paragraph">
- <p>First every scripting language got the same type-safe dilemma. If you invest too much into Scripting, you fall immediately into the mess that hidden errors which are always very hard to find, only show up in run-time. The balance between benefit and hell of Scripting is thin.
- Duck-typing is not always a win-win.</p>
- </div>
- <div class="sect3">
- <h4 id="not-type-safe">Not type-safe</h4>
- <div class="paragraph">
- <p>As Groovy support Duck-typing, is almost impossible to know the type, methods of the object you want to use. This can be improved if you are in Static mode but this mode simply not what we really want with Scripting purpose?</p>
- </div>
- <div class="paragraph">
- <p>So, as the question had been asked by a forum’s member:
- emoji:
- <strong>Answer:</strong></p>
- </div>
- <div class="paragraph">
- <p>From my experience, just ask you self, how “natural” your code are coded, in <strong>OOP</strong> sense:</p>
- </div>
- <div class="paragraph">
- <p><strong>Chicken.eat(rice)</strong>
- <em>You know what methods and their parameter’s type, and name.</em></p>
- </div>
- <div class="paragraph">
- <p><strong>Monkey.eat(banana)</strong>
- <em>You know what common in classes in a package. Without knowing the inheritance and interface they implemented.</em></p>
- </div>
- <div class="paragraph">
- <p><strong>Human.eat([chicken,rice,banana])</strong>
- <em>You can guess Human are derivated from Monkey and code are coded flexible, ex: methods are multi-type, optional param. etc…</em></p>
- </div>
- <div class="paragraph">
- <p>If it have that level of “natural” sense, you don’t have to learn by heart at all, so use scripting in the situation.</p>
- </div>
- <div class="paragraph">
- <p>In other hand, this very related to IDE support for such language. If you watch closely, Groovy going to have better support in Netbean:</p>
- </div>
- <div class="paragraph">
- <p><a href="https://blogs.oracle.com/netbeansgroovy/entry/groovy_refactoring_in_netbeans">https://blogs.oracle.com/netbeansgroovy/entry/groovy_refactoring_in_netbeans</a></p>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="note">NOTE:</h3>
- <div class="ulist">
- <ul>
- <li>
- <p>You <strong>CAN</strong> use GROOVY for Java as Lua for C++ (even much more better)</p>
- </li>
- <li>
- <p>You <strong>CAN</strong> get GROOVY run as FAST as Java</p>
- </li>
- <li>
- <p>You <strong>CAN</strong> let GROOVY seamlessy intergrated with Java and other JVM languages.</p>
- </li>
- <li>
- <p>Last but not least, Groovy <strong>kick</strong> asses! :p</p>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="learn-groovy">LEARN GROOVY</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p><a href="jme3/scripting.html#into_the_game">scripting</a>
- First, Groovy is much more shorter – cleaner than Java. It seamlessly get Java to the world of functional programming, like Python, Haskell, etc, but still make Java developer feel at home. You can read much more in the Groovy site and the internet, so I will not blow it up.</p>
- </div>
- <div class="paragraph">
- <p>Anyway, let’s learn some Groovy syntax, I bet you can master it in 3 hours!</p>
- </div>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/groovy_learn.html">groovy_learn</a></p>
- </div>
- <div class="sect2">
- <h3 id="groovy-for-smarty">Groovy – for smarty</h3>
- <div class="paragraph">
- <p>emoji:*So, what you can do with Groovy?*
- emoji: everything, even get laid! emoji:open_mouth</p>
- </div>
- <div class="paragraph">
- <p>I means use your imagination. I give you some examples:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Fasten the build process</p>
- </li>
- <li>
- <p>Replace almost the configuration</p>
- </li>
- <li>
- <p>Extract infos from XML and text, web…</p>
- </li>
- <li>
- <p>Convert RenderMonkey, FXComposer shaders</p>
- </li>
- <li>
- <p>Script the Dialoge, Cinematic,…</p>
- </li>
- <li>
- <p>Make In-game Editor, JMP’s plugins</p>
- </li>
- <li>
- <p>Make a whole freaking game</p>
- </li>
- <li>
- <p>Even feed my dogs …</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>What I want to say is <strong>Groovy</strong> is for smarty, master it and it save you <u>freaking big times</u> ! Java and Groovy are a sweetest combination of programing languages I ever tried beside of dozen of others.</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="official-examples-misc">Official examples & Misc</h3>
- <div class="paragraph">
- <p>Here are some website that you can find a lot of examples from simple to complicated tasks:</p>
- </div>
- <div class="paragraph">
- <p><a href="http://groovy.codehaus.org/Cookbook+Examples">http://groovy.codehaus.org/Cookbook+Examples</a></p>
- </div>
- <div class="paragraph">
- <p><a href="http://www.groovyexamples.org/">http://www.groovyexamples.org/</a></p>
- </div>
- <div class="paragraph">
- <p><a href="http://snipplr.com/all/language/groovy">http://snipplr.com/all/language/groovy</a></p>
- </div>
- <div class="paragraph">
- <p><a href="http://rosettacode.org/wiki/Rosetta_Code">http://rosettacode.org/wiki/Rosetta_Code</a> ⇐ learn Groovy and java if you come from other programming languages.</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="gpars">GPars</h3>
- <div class="paragraph">
- <p>If you already know Groovy, I recommend you to try <strong>GPars! Groovy Parallel Systems</strong>.
- Why? Because <strong>it’s #$kin awesome</strong>, that’s why?
- Every smart monkey and Java developer should know about it, to build apps and games!</p>
- </div>
- <div class="paragraph">
- <p><em>The GPars framework offers Java developers intuitive and safe ways to handle Java or Groovy tasks concurrently. Leveraging the enormous flexibility of the Groovy programing language and building on proven Java technologies, we aim to make concurrent programming for multi-core hardware intuitive, robust and enjoyable.</em></p>
- </div>
- <div class="paragraph">
- <p><a href="http://gpars.codehaus.org/">http://gpars.codehaus.org/</a></p>
- </div>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/gpars_usecases.html">gpars_usecases</a></p>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="embed-groovy">EMBED GROOVY</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p><a href="http://groovy.codehaus.org/Embedding+Groovy">http://groovy.codehaus.org/Embedding+Groovy</a></p>
- </div>
- <div class="paragraph">
- <p>Groovy is very suitable for embeding in Java application, even game. Our intention here is to get Groovy to work with JME in few ways. Some common problems, difficulties may arised cause of the differencies, uncompatiable between Java-Groovy-Native OpenGL.</p>
- </div>
- <div class="paragraph">
- <p>So technical problem and requirement will be dicussed first, then the Design of the integration is sketched, at last the full implementation. The full source code are in the AtomScript project!</p>
- </div>
- <div class="sect2">
- <h3 id="overview">OVERVIEW</h3>
- <div class="sect3">
- <h4 id="tech-probs">TECH PROBS</h4>
- </div>
- <div class="sect3">
- <h4 id="need-of-powerful-scripting-system">NEED OF POWERFUL SCRIPTING SYSTEM</h4>
- </div>
- <div class="sect3">
- <h4 id="design-architecture">DESIGN & ARCHITECTURE</h4>
- <div class="paragraph">
- <p>Slide</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="implementation">IMPLEMENTATION</h4>
- <div class="paragraph">
- <p>Slide</p>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="groovy-in-jme3">Groovy in JME3</h3>
- <div class="paragraph">
- <p>ScriptEngine</p>
- </div>
- <div class="paragraph">
- <p>ScriptBase</p>
- </div>
- <div class="paragraph">
- <p>Tools</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="groovy-in-jmp">Groovy in JMP</h3>
- <div class="sect3">
- <h4 id="scriptbasetopcomponent">ScriptBaseTopComponent</h4>
- </div>
- <div class="sect3">
- <h4 id="scriptenginemodule">ScriptEngineModule</h4>
- </div>
- <div class="sect3">
- <h4 id="advanced-tricks-to-get-jmp-scripted">Advanced Tricks to get JMP Scripted</h4>
- </div>
- </div>
- <div class="sect2">
- <h3 id="groovy-everywhere-snipets">Groovy everywhere (snipets)</h3>
- <div class="sect3">
- <h4 id="extract-infos-from-xml-and-text-web">Extract infos from XML and text, web…</h4>
- </div>
- <div class="sect3">
- <h4 id="convert-rendermonkey-fxcomposer-shaders">Convert RenderMonkey, FXComposer shaders</h4>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/snippets.html">snippets</a></p>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="into-the-game">INTO THE GAME</h2>
- <div class="sectionbody">
- <div class="sect2">
- <h3 id="basic-scripts">Basic Scripts</h3>
- <div class="sect3">
- <h4 id="rotate-the-wheel">Rotate the wheel</h4>
- </div>
- <div class="sect3">
- <h4 id="travel-a-tree">Travel a tree</h4>
- </div>
- <div class="sect3">
- <h4 id="queue-a-task">Queue a task</h4>
- </div>
- <div class="sect3">
- <h4 id="groovyappstate">GroovyAppState</h4>
- </div>
- <div class="sect3">
- <h4 id="closurecondition">ClosureCondition</h4>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/groovy_basicscripts.html">groovy_basicscripts</a></p>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="event-trigger-manager">Event – Trigger - Manager</h3>
- <div class="paragraph">
- <p>The first idea come to my mind when think of game programming is a game cycle-update or events.</p>
- </div>
- <div class="paragraph">
- <p>In fact, frequently update and sudden event is quite opposite paradigm, the point is to get the best of both world in one design. But can we? At least I can answer partly yes. And such sollution I’ve seen in big database system use the same hyrid concept.</p>
- </div>
- <div class="paragraph">
- <p>I also saw in the forum, guys had conversation about Entity System, which partly envolve such design… But this one it’s different. It’s not general, I means that the code below tent to be used in kind of RTS game like War-craft of Starcraft, and I precisely model it like those two games. And the codes are very short, extremely short, show the power of Groovy in the usecase.</p>
- </div>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/groovy_event.html">groovy_event</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="configurations-with-groovy">Configurations with Groovy</h3>
- <div class="paragraph">
- <p>Think about the way to config your game’s screen resolution, keyboard, database connection, without have to write and parse java property or XML files. Groovy script is text file but much more powerful, like it has variables, methods (def), loop (for), conditions (if-else)…etc to build complicated things (like a program), compared to just plain text.
- In short Groovy can replace almost every configuration task you can imagine. This topic about using Groovy scrips for that purpose.</p>
- </div>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/groovy_config.html">groovy_config</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="ai-tricks-with-groovy">AI Tricks with Groovy</h3>
- <div class="paragraph">
- <p>As in the introduction above I said this wiki will include everything about Scripting… So, it should also include AI (Artifacial Intelligent) … But I’m not going to tell you all about AI in this wiki, it should be more in another wiki of some AI professiors. I just want to show how a quick implementation of simple AI models can be coded in Groovy:</p>
- </div>
- <div class="paragraph">
- <p>GOTO <a href="jme3/scripting/groovy/ai.html">ai</a></p>
- </div>
- <div class="sect3">
- <h4 id="finite-state-machine">Finite State Machine</h4>
- <div class="paragraph">
- <p>What is the most simple but affective techique to make AI. It’s FSM</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="decision-tree">Decision Tree</h4>
- <div class="paragraph">
- <p>Builder</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="pattern-matching">Pattern Matching</h4>
- <div class="paragraph">
- <p>Regexp emoji:</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="simple-chatbot">Simple Chatbot</h4>
- <div class="paragraph">
- <p>Builder + Closure emoji:</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="simple-goalbase-agent">Simple Goalbase Agent</h4>
- <div class="paragraph">
- <p>emoji:</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="simple-path-finding">Simple Path finding</h4>
- <div class="paragraph">
- <p>Use Groovy extension
- emoji:</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="simple-steering-behavior">Simple Steering behavior</h4>
- <div class="paragraph">
- <p>emoji:</p>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="build-script-with-groovy">Build Script with Groovy</h3>
- <div class="paragraph">
- <p>Groovy can use Ant and Maven in a snapt. but wait… it also has its own build extension named Gradle.</p>
- </div>
- <div class="paragraph">
- <p><a href="http://www.gradle.org/">http://www.gradle.org/</a></p>
- </div>
- <div class="paragraph">
- <p>Check this out:
- For JME3 Desktop:
- emoji:</p>
- </div>
- <div class="paragraph">
- <p>For JME3 Android:
- <a href="http://tools.android.com/tech-docs/new-build-system/user-guide">http://tools.android.com/tech-docs/new-build-system/user-guide</a></p>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="design-patterns-in-groovy-game-wip">DESIGN PATTERNS IN GROOVY GAME (WIP)</h2>
- <div class="sectionbody">
- </div>
- </div>
- <div class="sect1">
- <h2 id="advanced-tricks">ADVANCED TRICKS</h2>
- <div class="sectionbody">
- <div class="sect2">
- <h3 id="hack-the-jvm-with-groovy">Hack the JVM with Groovy</h3>
- </div>
- <div class="sect2">
- <h3 id="codegen">Codegen</h3>
- <div class="paragraph">
- <p>This should be in another wiki but somehow is super fit for an example of advanced Groovy usage. The project CodeGen - Code generator is my first Groovy project. It’s tented to be a general code generator for Java, Groovy, GLSL and can also be a fun playground for non-developer. It inspirated by the concept of:</p>
- </div>
- <div class="paragraph">
- <p>Alice <a href="http://www.alice.org/index.php">http://www.alice.org/index.php</a></p>
- </div>
- <div class="paragraph">
- <p>GreenFoot <a href="http://www.greenfoot.org/door">http://www.greenfoot.org/door</a></p>
- </div>
- <div class="paragraph">
- <p>and an old plugin of PGI - a JME forum’s member : PgiLogic
- <a href="http://hub.jmonkeyengine.org/forum/topic/dead-combinable-logic-framework/">http://hub.jmonkeyengine.org/forum/topic/dead-combinable-logic-framework/</a></p>
- </div>
- <div class="paragraph">
- <p>It’s going to be in a suite for making Jme3 Games : Atom framework. Visit :
- GOTO <a href="jme3/advanced/atom_framework.html">atom_framework</a>
- GOTO <a href="jme3/advanced/atom_framework/codegen.html">codegen</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="groovy-almighty-god">Groovy – Almighty God!</h3>
- <div class="sect3">
- <h4 id="get-to-the-speed-of-java">Get to the speed of Java</h4>
- </div>
- <div class="sect3">
- <h4 id="extension-and-modulize">Extension and Modulize</h4>
- </div>
- <div class="sect3">
- <h4 id="database-and-orm">Database and ORM</h4>
- </div>
- <div class="sect3">
- <h4 id="dsl">DSL</h4>
- </div>
- <div class="sect3">
- <h4 id="visit-the-moon">Visit the Moon</h4>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="conclusion">CONCLUSION</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>After reading for a while, I guess you are in love with Groovy already. You’re welcome! emoji:sunglasses</p>
- </div>
- <div class="paragraph">
- <p><strong>CAN NOT</strong>…</p>
- </div>
- <div class="paragraph">
- <p>Beside of knowing the power and the weaknesses of the language and the way to use it in your everyday life. If you want to have the full snippets, download AtomScript project.</p>
- </div>
- <div class="paragraph">
- <p>Any correction are welcome!</p>
- </div>
- </div>
- </div>
- </div>
- <div id="footer">
- <div id="footer-text">
- Last updated 2016-05-21 23:44:18 UTC
- </div>
- </div>
- </body>
- </html>
|