About Monkey 2 › Forums › Monkey 2 Programming Help › Apply shader to group or layer of objects
Tagged: shader mask group layer
This topic contains 11 replies, has 4 voices, and was last updated by
Anatol
1 year, 5 months ago.
-
AuthorPosts
-
October 24, 2017 at 2:25 pm #11306
Hi!
I’m still getting my head around everything Monkey2, so I guess I’m just asking for some hints here.
What I have in mind is to apply a custom shader to a group of objects, or more specifically I’d like to apply a mask as in this post to an entire Pyro2 layer. This is for a 2D project.
I can see how to apply a shader to an image from the excellent post above, but looking into the mojo Image module I fail to see how it is applied. Or is this somehow where the magic happens? https://github.com/blitz-research/monkey2/blob/e37b2442fc24eb7babbd8739c9767cd486cc06c1/modules/mojo/graphics/image.monkey2#L547
Also, it doesn’t have to be the Pyro2 Layer, if I can apply it to any group or somehow tell Monkey2 to start using shader now, and stop it after rendering a number of objects (images, shapes) that’d also work.
I’m not even sure if what I have in mind is possible or if I’m on the right track with my thinking, so any pointers in the right direction would be much appreciated.
October 24, 2017 at 9:09 pm #11309Hi,
There’s no easy way to do this currently as an image’s shader cannot be overridden.
An image’s shader is ‘applied’ via the DrawOp system in canvas. If you look at the code for DrawImage in canvas.monkey2, this line is where the ‘magic’ happens:
Monkey12AddDrawOp( image.Shader,image.Material,image.BlendMode,4,1 )It would not actually be hard to add something like a ‘ImageShader” property to Canvas which could be used to override this image.Shader shader if non-null. It could also override point, line,shape shaders too (so ImageShader may not be best name).
This already kind of happens with Canvas.BlendMode which actually overrides Image.BlendMode if non-null.
There would be no way to provide global shader params that would affect *all* drawn images, but if you can live with that I would be OK with adding some sort of ‘global’ shader override to Canvas.
October 25, 2017 at 1:16 am #11314Hi Mark, thanks for your reply and insight.
If this could be done relatively easily I’d appreciate a canvas shader override.
I still need to fully understand how this all works, but this is a really helpful reply. I think with the override it can get me there with some trial end error.
October 25, 2017 at 9:40 am #11316I would be OK with adding some sort of ‘global’ shader override to Canvas.
For me everything that allows us to play nicely with custom glsl shaders is good to take!
October 25, 2017 at 8:26 pm #11318Hi Mark,
Am I misunderstanding your above message that shaders cannot be overridden? Following code seems to work both ways. TIA.
Monkey1234567891011Local shader:Shader = New Shader( "someshader", LoadString("asset::data/someshader.glsl"), "" )Local flags:TextureFlags = TextureFlags.Dynamic | TextureFlags.WrapST | TextureFlags.FilterMipmapLocal format:PixelFormat = PixelFormat.RGBA8' create image with shaderLocal image1:Image = New Image(Width, Height, format, flags, shader)' create image, then override shaderLocal image2:Image = New Image(Width, Height, format, flags)image2.Shader = shaderOctober 25, 2017 at 9:39 pm #11319I *think* what Anatol is after is something like…
Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926<!doctype html><!--[if !IE]><html class="no-js non-ie" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <![endif]--><!--[if IE 7 ]><html class="no-js ie7" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <![endif]--><!--[if IE 8 ]><html class="no-js ie8" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <![endif]--><!--[if IE 9 ]><html class="no-js ie9" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <![endif]--><!--[if gt IE 9]><!--><html class="no-js" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <!--<![endif]--><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#d6d6d6"><link rel="profile" href="http://gmpg.org/xfn/11"><title>Monkey 2 – Create cross-platform apps and games in 2D+3D</title><script type='text/javascript'>function ctSetCookie(c_name, value, def_value){document.cookie = c_name + '=' + escape(value) + '; path=/';}ctSetCookie('ct_checkjs', '2003912746', '0');</script><link rel='dns-prefetch' href='//fonts.googleapis.com' /><link rel='dns-prefetch' href='//s.w.org' /><link rel="alternate" type="application/rss+xml" title="Monkey 2 » Feed" href="http://monkeycoder.co.nz/feed/" /><link rel="alternate" type="application/rss+xml" title="Monkey 2 » Comments Feed" href="http://monkeycoder.co.nz/comments/feed/" /><script type="text/javascript">window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/11.2.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/11.2.0\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/monkeycoder.co.nz\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.1.1"}};!function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55358,56760,9792,65039],[55358,56760,8203,9792,65039]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);</script><style type="text/css">img.wp-smiley,img.emoji {display: inline !important;border: none !important;box-shadow: none !important;height: 1em !important;width: 1em !important;margin: 0 .07em !important;vertical-align: -0.1em !important;background: none !important;padding: 0 !important;}</style><link rel='stylesheet' id='crayon-css' href='http://monkeycoder.co.nz/wp-content/plugins/crayon-syntax-highlighter/css/min/crayon.min.css?ver=_2.7.2_beta' type='text/css' media='all' /><link rel='stylesheet' id='crayon-theme-tomorrow-night-copy-css' href='http://monkeycoder.co.nz/wp-content/uploads/crayon-syntax-highlighter/themes/tomorrow-night-copy/tomorrow-night-copy.css?ver=_2.7.2_beta' type='text/css' media='all' /><link rel='stylesheet' id='crayon-font-sourcecodepro-css' href='http://monkeycoder.co.nz/wp-content/plugins/crayon-syntax-highlighter/fonts/sourcecodepro.css?ver=_2.7.2_beta' type='text/css' media='all' /><link rel='stylesheet' id='wp-block-library-css' href='http://monkeycoder.co.nz/wp-includes/css/dist/block-library/style.min.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='bbp-default-css' href='http://monkeycoder.co.nz/wp-content/plugins/bbpress/templates/default/css/bbpress.css?ver=2.5.14-6684' type='text/css' media='screen' /><link rel='stylesheet' id='fancybox-css' href='http://monkeycoder.co.nz/wp-content/plugins/fancybox-for-wordpress/assets/css/fancybox.css?ver=1.3.4' type='text/css' media='all' /><link rel='stylesheet' id='hm_bbpui-css' href='http://monkeycoder.co.nz/wp-content/plugins/image-upload-for-bbpress/css/bbp-image-upload.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='simple-banner-style-css' href='http://monkeycoder.co.nz/wp-content/plugins/simple-banner/simple-banner.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='theme-my-login-css' href='http://monkeycoder.co.nz/wp-content/plugins/theme-my-login/assets/styles/theme-my-login.min.css?ver=7.0.13' type='text/css' media='all' /><link rel='stylesheet' id='bb-tcs-editor-style-shared-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling/editor-style-shared.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='wp-ulike-css' href='http://monkeycoder.co.nz/wp-content/plugins/wp-ulike/assets/css/wp-ulike.min.css?ver=3.6.0' type='text/css' media='all' /><link rel='stylesheet' id='bsp-css' href='http://monkeycoder.co.nz/wp-content/plugins/bbp-style-pack/css/bspstyle.css?ver=4.1.10' type='text/css' media='screen' /><link rel='stylesheet' id='dashicons-css' href='http://monkeycoder.co.nz/wp-includes/css/dashicons.min.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='sparkling-bootstrap-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/css/bootstrap.min.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='sparkling-icons-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/css/fontawesome-all.min.css?ver=5.1.1.' type='text/css' media='all' /><link rel='stylesheet' id='sparkling-fonts-css' href='//fonts.googleapis.com/css?family=Open+Sans%3A400italic%2C400%2C600%2C700%7CRoboto+Slab%3A400%2C300%2C700&ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='flexslider-css-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/css/flexslider.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='parent-style-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling/style.css?ver=5.1.1' type='text/css' media='all' /><link rel='stylesheet' id='child-style-css' href='http://monkeycoder.co.nz/wp-content/themes/sparkling-monkey2/style.css?ver=5.1.1' type='text/css' media='all' /><script type='text/javascript' src='http://monkeycoder.co.nz/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script><script type='text/javascript'>/* <![CDATA[ */var quicktagsL10n = {"closeAllOpenTags":"Close all open tags","closeTags":"close tags","enterURL":"Enter the URL","enterImageURL":"Enter the URL of the image","enterImageDescription":"Enter a description of the image","textdirection":"text direction","toggleTextdirection":"Toggle Editor Text Direction","dfw":"Distraction-free writing mode","strong":"Bold","strongClose":"Close bold tag","em":"Italic","emClose":"Close italic tag","link":"Insert link","blockquote":"Blockquote","blockquoteClose":"Close blockquote tag","del":"Deleted text (strikethrough)","delClose":"Close deleted text tag","ins":"Inserted text","insClose":"Close inserted text tag","image":"Insert image","ul":"Bulleted list","ulClose":"Close bulleted list tag","ol":"Numbered list","olClose":"Close numbered list tag","li":"List item","liClose":"Close list item tag","code":"Code","codeClose":"Close code tag","more":"Insert Read More tag"};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-includes/js/quicktags.min.js?ver=5.1.1'></script><script type='text/javascript'>/* <![CDATA[ */var CrayonSyntaxSettings = {"version":"_2.7.2_beta","is_admin":"0","ajaxurl":"http:\/\/monkeycoder.co.nz\/wp-admin\/admin-ajax.php","prefix":"crayon-","setting":"crayon-setting","selected":"crayon-setting-selected","changed":"crayon-setting-changed","special":"crayon-setting-special","orig_value":"data-orig-value","debug":""};var CrayonSyntaxStrings = {"copy":"Press %s to Copy, %s to Paste","minimize":"Click To Expand Code"};var CrayonTagEditorSettings = {"home_url":"http:\/\/monkeycoder.co.nz","css":"crayon-te","css_selected":"crayon-selected","code_css":"#crayon-code","url_css":"#crayon-url","url_info_css":"#crayon-te-url-info","lang_css":"#crayon-lang","title_css":"#crayon-title","mark_css":"#crayon-mark","range_css":"#crayon-range","inline_css":"crayon-inline","inline_hide_css":"crayon-hide-inline","inline_hide_only_css":"crayon-hide-inline-only","hl_css":"#crayon-highlight","switch_html":"#content-html","switch_tmce":"#content-tmce","tinymce_button_generic":".mce-btn","tinymce_button":"a.mce_crayon_tinymce,.mce-i-crayon_tinymce","tinymce_button_unique":"mce_crayon_tinymce","tinymce_highlight":"mce-active","submit_css":"#crayon-te-ok","cancel_css":"#crayon-te-cancel","content_css":"#crayon-te-content","dialog_title_css":"#crayon-te-title","submit_wrapper_css":"#crayon-te-submit-wrapper","data_value":"data-value","attr_sep":":","css_sep":"_","fallback_lang":"monkey","add_text":"Add Code","edit_text":"Edit Code","quicktag_text":"Insert Code","submit_add":"Add","submit_edit":"Save","bar":"#crayon-te-bar","bar_content":"#crayon-te-bar-content","extensions":{"scpt":"applescript","applescript":"applescript","swf":"as","fla":"as","cs":"c#","h":"c++","hh":"c++","hpp":"c++","hxx":"c++","h++":"c++","cc":"c++","cpp":"c++","cxx":"c++","c++":"c++","pas":"delphi","java":"java","class":"java","jar":"java","mel":"mel","ma":"mel","mv":"miva","mvc":"miva","mvt":"miva","m":"objc","mm":"objc","psc":"papyrus","pl":"perl","py":"python","pyw":"python","pyc":"python","pyo":"python","pyd":"python","rb":"ruby","rbx":"ruby","rhtml":"ruby","vbs":"vb"}};var CrayonSyntaxSettings = {"version":"_2.7.2_beta","is_admin":"0","ajaxurl":"http:\/\/monkeycoder.co.nz\/wp-admin\/admin-ajax.php","prefix":"crayon-","setting":"crayon-setting","selected":"crayon-setting-selected","changed":"crayon-setting-changed","special":"crayon-setting-special","orig_value":"data-orig-value","debug":""};var CrayonSyntaxStrings = {"copy":"Press %s to Copy, %s to Paste","minimize":"Click To Expand Code"};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/crayon-syntax-highlighter/js/min/crayon.te.min.js?ver=_2.7.2_beta'></script><script type='text/javascript'>/* <![CDATA[ */var ctPublic = {"_ajax_nonce":"de98041bb7","_ajax_url":"http:\/\/monkeycoder.co.nz\/wp-admin\/admin-ajax.php"};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/cleantalk-spam-protect/js/apbct-public.js?ver=5.117.1'></script><script type='text/javascript'>/* <![CDATA[ */var ctNocache = {"ajaxurl":"http:\/\/monkeycoder.co.nz\/wp-admin\/admin-ajax.php","info_flag":"","set_cookies_flag":"","blog_home":"http:\/\/monkeycoder.co.nz\/"};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/cleantalk-spam-protect/inc/cleantalk_nocache.js?ver=5.117.1'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/fancybox-for-wordpress/assets/js/jquery.fancybox.js?ver=1.3.4'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/image-upload-for-bbpress/js/bbp-image-upload.js?ver=5.1.1'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/simple-banner/simple-banner.js?ver=5.1.1'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/js/vendor/bootstrap.min.js?ver=5.1.1'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/js/functions.js?ver=20180503'></script><link rel='https://api.w.org/' href='http://monkeycoder.co.nz/wp-json/' /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://monkeycoder.co.nz/xmlrpc.php?rsd" /><link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://monkeycoder.co.nz/wp-includes/wlwmanifest.xml" /><meta name="generator" content="WordPress 5.1.1" /><link rel="canonical" href="http://monkeycoder.co.nz/" /><link rel='shortlink' href='http://monkeycoder.co.nz/' /><link rel="alternate" type="application/json+oembed" href="http://monkeycoder.co.nz/wp-json/oembed/1.0/embed?url=http%3A%2F%2Fmonkeycoder.co.nz%2F" /><link rel="alternate" type="text/xml+oembed" href="http://monkeycoder.co.nz/wp-json/oembed/1.0/embed?url=http%3A%2F%2Fmonkeycoder.co.nz%2F&format=xml" /><!-- Fancybox for WordPress v3.2.0 --><style type="text/css">div.fancybox-caption{display:none !important;}img.fancybox-image{border-width:10px;border-color:#FFFFFF;border-style:solid;height:auto;}div.fancybox-bg{background-color:rgba(102,102,102,0.3);opacity:1 !important;}div.fancybox-content{border-color:#FFFFFF}div#fancybox-title{background-color:#FFFFFF}div.fancybox-content{background-color:#FFFFFF}div#fancybox-title-inside{color:#333333}div.fancybox-caption p.caption-title{display:inline-block}div.fancybox-caption p.caption-title{font-size:14px}div.fancybox-caption p.caption-title{color:#333333}div.fancybox-caption {color:#333333}div.fancybox-caption p.caption-title {background:#fff; width:auto;padding:10px 30px;}</style><script type="text/javascript">jQuery(function(){jQuery.fn.getTitle = function() { // Copy the title of every IMG tag and add it to its parent A so that fancybox can show titlesvar arr = jQuery("a[data-fancybox]");jQuery.each(arr, function() {var title = jQuery(this).children("img").attr("title");var caption = jQuery(this).next("figcaption").html();if(caption && title){jQuery(this).attr("title",title+" " + caption)}else if(title){ jQuery(this).attr("title",title);}else if(caption){jQuery(this).attr("title",caption);}}); }// Supported file extensionsvar thumbnails = jQuery("a:has(img)").not(".nolightbox").not('.envira-gallery-link').not('.ngg-simplelightbox').filter(function () {return /\.(jpe?g|png|gif|mp4|webp|bmp|pdf)(\?[^/]*)*$/i.test(jQuery(this).attr('href'))});// Add data-type iframe for links that are not images or videos.var iframeLinks = jQuery('.fancyboxforwp').filter( function() { return ! /\.(jpe?g|png|gif|mp4|webp|bmp|pdf)(\?[^/]*)*$/i.test(jQuery(this).attr('href')) }).filter( function() { return ! /vimeo|youtube/i.test(jQuery(this).attr('href')) });iframeLinks.attr({ "data-type" : "iframe" }).getTitle();// Gallery Allthumbnails.addClass("fancyboxforwp").attr("data-fancybox","gallery").getTitle();iframeLinks.attr({ "data-fancybox":"gallery" }).getTitle();// Gallery type NONE// Call fancybox and apply it on any link with a rel atribute that starts with "fancybox", with the options set on the admin paneljQuery("a.fancyboxforwp").fancyboxforwp({loop: false,smallBtn: true,zoomOpacity: "auto",animationEffect: "fade",animationDuration: 500,transitionEffect: "fade",transitionDuration : "300",overlayShow: true,overlayOpacity: "0.3",titleShow: true,titlePosition: "inside",keyboard: true,showCloseButton: true,arrows: true,clickContent: false,clickSlide: "close",wheel: false,toolbar: true,preventCaptionOverlap: true,onInit: function() { }, onDeactivate: function() { }, beforeClose: function() { }, afterShow: function() { }, afterClose: function() { }, caption : function( instance, item ) {var testing = jQuery(this).context.title;var caption = jQuery(this).data('caption') || '';if ( item.type === 'image' && testing.length ) {caption = (caption.length ? caption + '<br />' : '') + '<p class="caption-title">'+testing+'</p>' ;}return caption;},afterLoad : function( instance, current ) {current.$content.append('<div class=\"fancybox-custom-caption\" style=\" position: absolute;left:0;right:0;color:#000;padding-top:10px;bottom:-50px;margin:0 auto;text-align:center; \">' + current.opts.caption + '</div>');},});})</script><!-- END Fancybox for WordPress --><!-- Plugin: Open external links a new window. Plugin by Kristian Risager Larsen, http://kristianrisagerlarsen.dk . Download it at http://wordpress.org/extend/plugins/open-external-links-in-a-new-window/ --><script type="text/javascript">//<![CDATA[function external_links_in_new_windows_loop() {if (!document.links) {document.links = document.getElementsByTagName('a');}var change_link = false;var force = '';var ignore = '';for (var t=0; t<document.links.length; t++) {var all_links = document.links[t];change_link = false;if(document.links[t].hasAttribute('onClick') == false) {// forced if the address starts with http (or also https), but does not link to the current domainif(all_links.href.search(/^http/) != -1 && all_links.href.search('monkeycoder.co.nz') == -1) {// alert('Changeda '+all_links.href);change_link = true;}if(force != '' && all_links.href.search(force) != -1) {// forced// alert('force '+all_links.href);change_link = true;}if(ignore != '' && all_links.href.search(ignore) != -1) {// alert('ignore '+all_links.href);// ignoredchange_link = false;}if(change_link == true) {// alert('Changed '+all_links.href);document.links[t].setAttribute('onClick', 'javascript:window.open(\''+all_links.href+'\'); return false;');document.links[t].removeAttribute('target');}}}}// Loadfunction external_links_in_new_windows_load(func){var oldonload = window.onload;if (typeof window.onload != 'function'){window.onload = func;} else {window.onload = function(){oldonload();func();}}}external_links_in_new_windows_load(external_links_in_new_windows_loop);//]]></script><style type="text/css" media="screen">.simple-banner{background:#d6d6d6};</style><style type="text/css" media="screen">.simple-banner{/*height:42px;*//* background-image: url("http://monkeycoder.co.nz/wp-content/uploads/2018/11/lights_32.png");*/background-color: #000;};</style><script type="text/javascript">document.addEventListener("DOMContentLoaded", function() {var bannerSpan = document.getElementById("simple-banner");bannerSpan.innerHTML = "<div class=simple-banner-text><span>To get approved for the forums:Visit the Monkey2 Discord channel (via Desktop/App or Web), talk to us and proove you\'re not a spambot! :-)</span></div>"});</script><style type="text/css">.cfa { background-color: #dd4453; } .cfa-button:hover a {color: #dd4453;}.cfa-text { color: #000000;}.cfa-button {border-color: #ffffff; color: #ffffff;}.navbar.navbar-default, .navbar-default .navbar-nav .open .dropdown-menu > li > a {background-color: #d6d6d6;}.navbar-default .navbar-nav > li > a, .navbar-default .navbar-nav.sparkling-mobile-menu > li:hover > a, .navbar-default .navbar-nav.sparkling-mobile-menu > li:hover > .caret, .navbar-default .navbar-nav > li, .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #000000;}@media (max-width: 767px){ .navbar-default .navbar-nav > li:hover > a, .navbar-default .navbar-nav > li:hover > .caret{ color: #000000!important ;} }body, .entry-content {color:#2d2d2d}</style> <style type="text/css">.navbar > .container .navbar-brand {color: #dadada;}</style><style type="text/css" id="custom-background-css">body.custom-background { background-color: #e0e0e0; }</style><link rel="icon" href="http://monkeycoder.co.nz/wp-content/uploads/2018/01/cropped-512logo-01-32x32.png" sizes="32x32" /><link rel="icon" href="http://monkeycoder.co.nz/wp-content/uploads/2018/01/cropped-512logo-01-192x192.png" sizes="192x192" /><link rel="apple-touch-icon-precomposed" href="http://monkeycoder.co.nz/wp-content/uploads/2018/01/cropped-512logo-01-180x180.png" /><meta name="msapplication-TileImage" content="http://monkeycoder.co.nz/wp-content/uploads/2018/01/cropped-512logo-01-270x270.png" /><style type="text/css" id="wp-custom-css">.blog-item-wrap{background-color:#fff;}#secondary .widget a {color: #555;}.post-inner-content , .well{/*background-color:#f1f1f1;*/}.paypal-donations, .widget_paypal_donations{text-align: center;}blockquote {font-style: italic;color: #4d4d4d;}a:hover, a:active,a:visited,a:focus, #secondary .widget .post-content a:hover, .woocommerce nav.woocommerce-pagination ul li a:focus, .woocommerce nav.woocommerce-pagination ul li a:hover, .woocommerce nav.woocommerce-pagination ul li span.current, #secondary .widget a:hover {color: #DA4453;}a.cfa-button:visited{color:#fff;} </style><!-- START - Open Graph for Facebook, Google+ and Twitter Card Tags 2.2.6 --><!-- Facebook Open Graph --><meta property="og:site_name" content="Monkey 2"/><meta property="og:title" content="About Monkey 2"/><meta property="og:url" content="http://monkeycoder.co.nz/"/><meta property="og:image" content="http://monkeycoder.co.nz/wp-content/uploads/2018/01/monkeysite-1.jpg"/><meta property="og:image:url" content="http://monkeycoder.co.nz/wp-content/uploads/2018/01/monkeysite-1.jpg"/><!-- Google+ / Schema.org --><meta itemprop="name" content="About Monkey 2"/><meta itemprop="headline" content="About Monkey 2"/><meta itemprop="description" content="Monkey2 is a new programming language designed by Mark Sibly"/><meta itemprop="image" content="http://monkeycoder.co.nz/wp-content/uploads/2018/01/monkeysite-1.jpg"/><!-- Twitter Cards --><meta name="twitter:title" content="About Monkey 2"/><meta name="twitter:card" content="summary"/><!-- SEO --><link rel="canonical" href="http://monkeycoder.co.nz/"/><!-- Misc. tags --><!-- is_singular --><!-- END - Open Graph for Facebook, Google+ and Twitter Card Tags 2.2.6 --></head><body class="home page-template-default page page-id-97 custom-background group-blog"><a class="sr-only sr-only-focusable" href="#content">Skip to main content</a><div id="page" class="hfeed site"><header id="masthead" class="site-header" role="banner"><nav class="navbar navbar-default" role="navigation"><div class="container"><div class="row"><div class="site-navigation-inner col-sm-12"><div class="navbar-header"><button type="button" class="btn navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><div id="logo"><a href="http://monkeycoder.co.nz/"><img src="http://monkeycoder.co.nz/wp-content/uploads/2018/01/logo-header16-01.png" height="77" width="349" alt="Monkey 2"/></a></div><!-- end of #logo --></div><div class="collapse navbar-collapse navbar-ex1-collapse"><ul id="menu-main-menu" class="nav navbar-nav"><li id="menu-item-12923" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item page-item-97 current_page_item menu-item-12923 active"><a href="http://monkeycoder.co.nz/">Home</a></li><li id="menu-item-12940" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12940"><a href="http://monkeycoder.co.nz/news/">News</a></li><li id="menu-item-12641" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12641"><a href="http://monkeycoder.co.nz/monkey2-files/">Download</a></li><li id="menu-item-99" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-99"><a href="http://monkeycoder.co.nz/forums/">Forums</a></li><li id="menu-item-12925" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-12925 dropdown"><a href="http://monkeycoder.co.nz/module-manager/">Modules</a><span class="caret sparkling-dropdown"></span><ul role="menu" class=" dropdown-menu"><li id="menu-item-13139" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13139"><a href="http://monkeycoder.co.nz/module-manager/">Modules</a></li><li id="menu-item-13589" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13589"><a href="http://monkeycoder.co.nz/module-manager/user-projects-and-modules/">User projects and Modules links</a></li></ul></li><li id="menu-item-12924" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-12924 dropdown"><a href="http://monkeycoder.co.nz/docs/">Documentation</a><span class="caret sparkling-dropdown"></span><ul role="menu" class=" dropdown-menu"><li id="menu-item-14002" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-14002"><a href="http://turdus.be/monkey2docs/docs/">Monkey online documentation (opens a new window)</a></li><li id="menu-item-14001" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14001"><a href="http://monkeycoder.co.nz/monkey2-roadmap/">The Monkey 2 TODO List!</a></li><li id="menu-item-14741" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14741"><a href="http://monkeycoder.co.nz/links/">Links</a></li></ul></li><li id="menu-item-14557" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14557"><a href="http://monkeycoder.co.nz/tutorials/">Tutorials</a></li><li id="menu-item-12927" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12927"><a href="http://monkeycoder.co.nz/login/">Log In</a></li></ul></div> </div></div></div></nav><!-- .site-navigation --></header><!-- #masthead --><div id="content" class="site-content"><div class="top-section"><div class="flexslider"><ul class="slides"><li><a href="http://monkeycoder.co.nz/2018/12/30/welcome-back-and-happy-new-year/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">Welcome back and happy new year!</h2><div class="excerpt">Yeehaa, we’re back! Sorry the site has been down over xmas, but the monkey2 forums were spammed and I just wasn’t in the mood for embarking on an involuntary MySql refresher. I don’t even particularly dislike MySql or anything, I JUST WASN’T FEELING IT. Spammers kindly fuck off forever. All done now though, although I […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/11/11/back-to-the-future/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">Back to the future!</h2><div class="excerpt">Hello all, I have been thinking a lot lately about where to take monkey2 (and blitz research) next and I have decided to concentrate most of my efforts on a single target. I am very happy with most aspects of monkey2, but one thing I think I seriously misjudged was the cost of using c++ […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/09/16/mid-september-update/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">Mid-September update!</h2><div class="excerpt">Whoooeeeee, life sure can change big time in just a few months! I am now a 9-5 (well, 7.30-4) c++ programmer working in a team of around 100+ people around the world on a project with millions of lines of code. I work in a large open plan office with about 50+ other people, about […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/07/22/july-2018-update/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">July 2018 Update!</h2><div class="excerpt">Monkey2 Threads Threads are finally in! I eventually gave up on my fancy ‘Tasks’ idea from the previous worklog update. It’s not a bad idea, but communicating between tasks would have been pretty cumbersome as it effectively involves serialization and that’s never particularly fun. I did actually take it quite far. I had a proof […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/06/13/monkey2-update-for-june/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">Monkey2 Update for June</h2><div class="excerpt">Hi everyone, It’s mainly been a month of tweaking and tooling around, but there have been a few semi-major developments along the way. For starters, weak references have been added to the language via the new WeakRef class. It’s taken a while to add these as I honestly wasn’t that clear on how to implement […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/05/06/monthly-monkey2-update-for-may-2018/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">Monthly Monkey2 update for May 2018</h2><div class="excerpt">Hello everyone!I have mainly been playing with 3d over the last month. The shader system is now much tidier, thanks to the addition of a pseudo ‘import’ directive (glsl doesn’t have one so you need to roll your own) that should make writing shaders much cleaner/easier. For example, the default PbrMaterial shader is now only […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/04/13/april-2018-monthly-ish-update/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">April 2018 Monthly-ish update!</h2><div class="excerpt">Hey ho mighty Patreon supporters and assorted lesser beings, OK, monkey2 version 2018.04 is out! Again, this pre-built release is for patreon supporters only but you can pretty easily build it yourself from source. As always, if you’ve donated to the monkey2 cause via the itch.io page (or otherwise), feel free to contact me for […]</div></div></a></li><li><a href="http://monkeycoder.co.nz/2018/03/12/monthlyish-monkey-update/"><img width="680" height="240" src="http://monkeycoder.co.nz/wp-content/uploads/2017/12/slider_eyes.gif" class="attachment-activello-slider size-activello-slider wp-post-image" alt="" /><div class="flex-caption"><h2 class="entry-title">March Monthly(ish) Monkey Update!</h2><div class="excerpt">Hello all! Well, Februrary turned out to be a bit of a ‘low throughput’ month sorry. It kind of turned into a ‘research’ month as I started a few things but ended up filing them under ‘later’ as they were obviously going to take considerably more planning and thought than I had originally envisioned. Still, […]</div></div></a></li></ul> </div> <div class="cfa"><div class="container"><div class="col-sm-8"><span class="cfa-text">Prebuilt binaries at itch.io are now ver. 2018.08</span></div><div class="col-sm-4"><a class="btn btn-lg cfa-button" target="_blank" href="https://blitzresearch.itch.io/monkey2">Get them now!</a></div></div></div> </div><div class="container main-content-area"><div class="row side-pull-left"><div class="main-content-inner col-sm-12 col-md-8"><div id="primary" class="content-area"><main id="main" class="site-main" role="main"><div class="post-inner-content"><article id="post-97" class="post-97 page type-page status-publish hentry"><header class="entry-header page-header"><h1 class="entry-title">About Monkey 2</h1></header><!-- .entry-header --><div class="entry-content"><p>Monkey2 is a new programming language designed by Mark Sibly, creator of the ‘Blitz’ range of languages.</p><p>While staying true to the ‘basic’ style of the original blitz languages, Monkey2 offers some very powerful new features including:</p><h4>Generic classes and methods.</h4><p>Classes, interfaces, structs, methods and functions can have ‘type’ parameters:</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a91a185744233" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">struct Rect<T>Field x0:T,y0:TField x1:T,y1:TEndFunction Main()Local r:=New Rect<Float>End</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a91a185744233-8">8</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-1"><span class="crayon-t">struct</span><span class="crayon-h"> </span><span class="crayon-v">Rect</span><span class="crayon-e "><T></span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-2"><span class="crayon-h"> </span><span class="crayon-r">Field</span><span class="crayon-h"> </span><span class="crayon-v">x0</span><span class="crayon-o">:</span><span class="crayon-v">T</span><span class="crayon-sy">,</span><span class="crayon-v">y0</span><span class="crayon-o">:</span><span class="crayon-i">T</span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-3"><span class="crayon-h"> </span><span class="crayon-r">Field</span><span class="crayon-h"> </span><span class="crayon-v">x1</span><span class="crayon-o">:</span><span class="crayon-v">T</span><span class="crayon-sy">,</span><span class="crayon-v">y1</span><span class="crayon-o">:</span><span class="crayon-i">T</span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-4"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-5"> </div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-6"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-7"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">r</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-v">Rect</span><span class="crayon-e "><Float></span></div><div class="crayon-line" id="crayon-5cb8a11d7a91a185744233-8"><span class="crayon-st">End</span></div></div></td></tr></table></div></div><!-- [Format Time: 0.0009 seconds] --><p><h4>‘First class’ functions.</h4><p>Functions (and methods) can be stored in variables and passed to/from other functions.</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a924636118963" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">Function Test1()Print "Test1!"EndFunction Test2()Print "Test2!"EndFunction Tester( test:Void() )test()EndFunction Main()Tester( Test1 )Tester( Test2 )End</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-13">13</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-14">14</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-15">15</div><div class="crayon-num" data-line="crayon-5cb8a11d7a924636118963-16">16</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-1"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Test1</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-2"><span class="crayon-h"> </span><span class="crayon-i">Print</span><span class="crayon-h"> </span><span class="crayon-s">"Test1!"</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-3"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-4"> </div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-5"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Test2</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-6"><span class="crayon-h"> </span><span class="crayon-i">Print</span><span class="crayon-h"> </span><span class="crayon-s">"Test2!"</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-7"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-8"> </div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-9"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Tester</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">test</span><span class="crayon-o">:</span><span class="crayon-t">Void</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-10"><span class="crayon-h"> </span><span class="crayon-e">test</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-11"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-12"> </div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-13"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-14"><span class="crayon-h"> </span><span class="crayon-e">Tester</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-i">Test1</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-15"><span class="crayon-h"> </span><span class="crayon-e">Tester</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-i">Test2</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a924636118963-16"><span class="crayon-st">End</span></div></div></td></tr></table></div></div><!-- [Format Time: 0.0010 seconds] --><p><h4>Lambda functions.</h4><p>Lambda functions allow you to create closures:</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a928417133420" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">Function Test( func:Void() )func()EndFunction Main()For Local i:=0 Until 10Test( Lambda()Print iEnd )NextEnd</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-13">13</div><div class="crayon-num" data-line="crayon-5cb8a11d7a928417133420-14">14</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-1"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Test</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">func</span><span class="crayon-o">:</span><span class="crayon-t">Void</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-2"><span class="crayon-h"> </span><span class="crayon-e">func</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-3"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-4"> </div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-5"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-6"> </div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-7"><span class="crayon-h"> </span><span class="crayon-st">For</span><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">i</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-cn">0</span><span class="crayon-h"> </span><span class="crayon-i">Until</span><span class="crayon-h"> </span><span class="crayon-cn">10</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-8"><span class="crayon-h"> </span><span class="crayon-e">Test</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-e">Lambda</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-9"><span class="crayon-h"> </span><span class="crayon-i">Print</span><span class="crayon-h"> </span><span class="crayon-i">i</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-10"><span class="crayon-h"> </span><span class="crayon-st">End</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-11"><span class="crayon-h"> </span><span class="crayon-st">Next</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-12"> </div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-13"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a928417133420-14"> </div></div></td></tr></table></div></div><!-- [Format Time: 0.0010 seconds] --><p><h4>New ‘struct’ type that provides value semantics.</h4><p>Structs are similar to classes in that they encapsulate member data, but differ in that they are passed around ‘by value’ instead of ‘by reference’.</p><p>This allows structs to be efficiently created on the stack without any garbage collection overhead.</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a92b071552241" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">Struct SField data:Int=10EndFunction Test( s:S )s.data=100EndFunction Main()Local s:=new S 'Create a new S on the stack (very fast!)Test( s ) 'Test gets a copy of 's'.Print s.data 'Print '10'End</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92b071552241-13">13</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-1"><span class="crayon-t">Struct</span><span class="crayon-h"> </span><span class="crayon-i">S</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-2"><span class="crayon-h"> </span><span class="crayon-r">Field</span><span class="crayon-h"> </span><span class="crayon-v">data</span><span class="crayon-o">:</span><span class="crayon-t">Int</span><span class="crayon-o">=</span><span class="crayon-cn">10</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-3"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-4"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-5"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Test</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">s</span><span class="crayon-o">:</span><span class="crayon-i">S</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-6"><span class="crayon-h"> </span><span class="crayon-v">s</span><span class="crayon-sy">.</span><span class="crayon-v">data</span><span class="crayon-o">=</span><span class="crayon-cn">100</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-7"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-8"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-9"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-10"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">s</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-i">S</span><span class="crayon-h"> </span><span class="crayon-c">'Create a new S on the stack (very fast!)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-11"><span class="crayon-h"> </span><span class="crayon-e">Test</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-i">s</span><span class="crayon-h"> </span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-c">'Test gets a copy of 's'.</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-12"><span class="crayon-h"> </span><span class="crayon-i">Print</span><span class="crayon-h"> </span><span class="crayon-v">s</span><span class="crayon-sy">.</span><span class="crayon-i">data</span><span class="crayon-h"> </span><span class="crayon-c">'Print '10'</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92b071552241-13"><span class="crayon-st">End</span></div></div></td></tr></table></div></div><!-- [Format Time: 0.0012 seconds] --><p><h4>Fibers for easy asynchronous programming.</h4><p>Fibers provide support for ‘cooperative’ multithreading:</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a92e045588618" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">Function Server( host:String,service:String )Local server:=Socket.Listen( host,service )RepeatLocal client:=server.Accept()New Fiber( Lambda()Local data:=client.Receive(...)End )ForeverEnd</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-13">13</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-14">14</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-15">15</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-16">16</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-17">17</div><div class="crayon-num" data-line="crayon-5cb8a11d7a92e045588618-18">18</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-1"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Server</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">host</span><span class="crayon-o">:</span><span class="crayon-t">String</span><span class="crayon-sy">,</span><span class="crayon-v">service</span><span class="crayon-o">:</span><span class="crayon-t">String</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-2"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-3"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">server</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-v">Socket</span><span class="crayon-sy">.</span><span class="crayon-e">Listen</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">host</span><span class="crayon-sy">,</span><span class="crayon-i">service</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-4"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-5"><span class="crayon-h"> </span><span class="crayon-st">Repeat</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-6"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-7"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">client</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-v">server</span><span class="crayon-sy">.</span><span class="crayon-e">Accept</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-8"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-9"><span class="crayon-h"> </span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-e">Fiber</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-e">Lambda</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-10"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-11"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">data</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-v">client</span><span class="crayon-sy">.</span><span class="crayon-e">Receive</span><span class="crayon-sy">(</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-12"><span class="crayon-h"> </span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-13"><span class="crayon-h"> </span><span class="crayon-st">End</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-14"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-15"><span class="crayon-h"> </span><span class="crayon-st">Forever</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-16"> </div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-17"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a92e045588618-18"> </div></div></td></tr></table></div></div><!-- [Format Time: 0.0013 seconds] --><p><h4>Operator overloading.</h4><p>Operator overloading allows you to override the meaning of the built-in language operators, making for more expressive code:</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a930058946164" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">Struct Vec2Field x:FloatField y:FloatMethod New( x:float,y:Float )Self.x=xSelf.y=yEndOperator+:Vec2( v:Vec2 )Return New Vec2( x+v.x,y+v.y )EndOperator To:String()Return "Vec2("+x+","+y+")"EndEndFunction Main()Local v0:=New Vec2( 10,20 )Local v1:=New Vec2( 30,40 )Print v0+v1End</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-13">13</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-14">14</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-15">15</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-16">16</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-17">17</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-18">18</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-19">19</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-20">20</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-21">21</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-22">22</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-23">23</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-24">24</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-25">25</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-26">26</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-27">27</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-28">28</div><div class="crayon-num" data-line="crayon-5cb8a11d7a930058946164-29">29</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-1"><span class="crayon-t">Struct</span><span class="crayon-h"> </span><span class="crayon-e">Vec2</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-2"><span class="crayon-e"> </span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-3"><span class="crayon-e"> </span><span class="crayon-r">Field</span><span class="crayon-h"> </span><span class="crayon-v">x</span><span class="crayon-o">:</span><span class="crayon-t">Float</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-4"><span class="crayon-h"> </span><span class="crayon-r">Field</span><span class="crayon-h"> </span><span class="crayon-v">y</span><span class="crayon-o">:</span><span class="crayon-t">Float</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-5"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-6"><span class="crayon-h"> </span><span class="crayon-e">Method </span><span class="crayon-r">New</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">x</span><span class="crayon-o">:</span><span class="crayon-t">float</span><span class="crayon-sy">,</span><span class="crayon-v">y</span><span class="crayon-o">:</span><span class="crayon-t">Float</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-7"><span class="crayon-h"> </span><span class="crayon-r">Self</span><span class="crayon-sy">.</span><span class="crayon-v">x</span><span class="crayon-o">=</span><span class="crayon-i">x</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-8"><span class="crayon-h"> </span><span class="crayon-r">Self</span><span class="crayon-sy">.</span><span class="crayon-v">y</span><span class="crayon-o">=</span><span class="crayon-i">y</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-9"><span class="crayon-h"> </span><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-10"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-11"><span class="crayon-h"> </span><span class="crayon-v">Operator</span><span class="crayon-o">+</span><span class="crayon-o">:</span><span class="crayon-e">Vec2</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">v</span><span class="crayon-o">:</span><span class="crayon-i">Vec2</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-12"><span class="crayon-h"> </span><span class="crayon-st">Return</span><span class="crayon-h"> </span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-e">Vec2</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">x</span><span class="crayon-o">+</span><span class="crayon-v">v</span><span class="crayon-sy">.</span><span class="crayon-v">x</span><span class="crayon-sy">,</span><span class="crayon-v">y</span><span class="crayon-o">+</span><span class="crayon-v">v</span><span class="crayon-sy">.</span><span class="crayon-i">y</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-13"><span class="crayon-h"> </span><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-14"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-15"><span class="crayon-h"> </span><span class="crayon-e">Operator </span><span class="crayon-st">To</span><span class="crayon-o">:</span><span class="crayon-t">String</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-16"><span class="crayon-h"> </span><span class="crayon-st">Return</span><span class="crayon-h"> </span><span class="crayon-s">"Vec2("</span><span class="crayon-o">+</span><span class="crayon-v">x</span><span class="crayon-o">+</span><span class="crayon-s">","</span><span class="crayon-o">+</span><span class="crayon-v">y</span><span class="crayon-o">+</span><span class="crayon-s">")"</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-17"><span class="crayon-h"> </span><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-18"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-19"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-20"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-21"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-22"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-23"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">v0</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-e">Vec2</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-cn">10</span><span class="crayon-sy">,</span><span class="crayon-cn">20</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-24"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">v1</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-e">Vec2</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-cn">30</span><span class="crayon-sy">,</span><span class="crayon-cn">40</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-25"><span class="crayon-h"> </span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-26"><span class="crayon-h"> </span><span class="crayon-e">Print </span><span class="crayon-v">v0</span><span class="crayon-o">+</span><span class="crayon-e">v1</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-27"> </div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-28"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a930058946164-29"> </div></div></td></tr></table></div></div><!-- [Format Time: 0.0023 seconds] --><p><h4>Class extensions.</h4><p>Class extensions allow you to add extra methods and functions to existing classes.</p><h4>Fully garbage collected.</h4><p>Monkey2 provides a ‘mostly’ incremental garbage collector that efficiently collects garbage as it runs without any of those annoying ‘sweep’ spikes found in typical garbage collectors.</p><h4>Optional reflection features.</h4><p>Monkey2 includes an optional reflection system that allows you to inspect and modify variables and values at runtime:</p><!-- Crayon Syntax Highlighter v_2.7.2_beta --><div id="crayon-5cb8a11d7a933069291641" class="crayon-syntax crayon-theme-tomorrow-night-copy crayon-font-sourcecodepro crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always disable-anim" style=" font-size: 14px !important; line-height: 16px !important;"><div class="crayon-toolbar" data-settings=" show" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><span class="crayon-title"></span><div class="crayon-tools" style="font-size: 14px !important;height: 21px !important; line-height: 21px !important;"><div class="crayon-button crayon-plain-button" title="Toggle Plain Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="Open Code In New Window"><div class="crayon-button-icon"></div></div><span class="crayon-language">Monkey</span></div></div><div class="crayon-info" style="min-height: 19.6px !important; line-height: 19.6px !important;"></div><div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;">#Import "<reflection>"Class CMethod Update( msg:String )Print "C.Update : msg="+msgEndEndFunction Main()Local c:=New CLocal type:=Typeof( c )Print typeLocal decl:=type.GetDecl( "Update" )decl.Invoke( c,"Hello World!" )End</textarea></div><div class="crayon-main" style=" max-height: 500px;"><table class="crayon-table"><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div class="crayon-nums-content" style="font-size: 14px !important; line-height: 16px !important;"><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-1">1</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-2">2</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-3">3</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-4">4</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-5">5</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-6">6</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-7">7</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-8">8</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-9">9</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-10">10</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-11">11</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-12">12</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-13">13</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-14">14</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-15">15</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-16">16</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-17">17</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-18">18</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-19">19</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-20">20</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-21">21</div><div class="crayon-num" data-line="crayon-5cb8a11d7a933069291641-22">22</div></div></td><td class="crayon-code"><div class="crayon-pre" style="font-size: 14px !important; line-height: 16px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-1"><span class="crayon-o">#</span><span class="crayon-r">Import</span><span class="crayon-h"> </span><span class="crayon-s">"<reflection>"</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-2"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-3"><span class="crayon-t">Class</span><span class="crayon-h"> </span><span class="crayon-i">C</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-4"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-5"><span class="crayon-h"> </span><span class="crayon-e">Method </span><span class="crayon-e">Update</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">msg</span><span class="crayon-o">:</span><span class="crayon-t">String</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-6"><span class="crayon-h"> </span><span class="crayon-i">Print</span><span class="crayon-h"> </span><span class="crayon-s">"C.Update : msg="</span><span class="crayon-o">+</span><span class="crayon-e">msg</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-7"><span class="crayon-e"> </span><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-8"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-9"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-10"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-11"><span class="crayon-t">Function</span><span class="crayon-h"> </span><span class="crayon-e">Main</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-12"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-13"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">c</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-r">New</span><span class="crayon-h"> </span><span class="crayon-i">C</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-14"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-15"><span class="crayon-h"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">type</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-e">Typeof</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-i">c</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-16"><span class="crayon-h"> </span><span class="crayon-e">Print </span><span class="crayon-e">type</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-17"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-18"><span class="crayon-e"> </span><span class="crayon-m">Local</span><span class="crayon-h"> </span><span class="crayon-v">decl</span><span class="crayon-o">:</span><span class="crayon-o">=</span><span class="crayon-v">type</span><span class="crayon-sy">.</span><span class="crayon-e">GetDecl</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-s">"Update"</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-19"><span class="crayon-h"> </span><span class="crayon-v">decl</span><span class="crayon-sy">.</span><span class="crayon-e">Invoke</span><span class="crayon-sy">(</span><span class="crayon-h"> </span><span class="crayon-v">c</span><span class="crayon-sy">,</span><span class="crayon-s">"Hello World!"</span><span class="crayon-h"> </span><span class="crayon-sy">)</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-20"> </div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-21"><span class="crayon-st">End</span></div><div class="crayon-line" id="crayon-5cb8a11d7a933069291641-22"> </div></div></td></tr></table></div></div><!-- [Format Time: 0.0014 seconds] --><p><h4>Multi-target</h4><p>Monkey2 works on a wide range of targets: Windows, Macos, Linux, Emscripten, Android and iOS.</p><div class="wpulike wpulike-default " ><div class="wp_ulike_general_class wp_ulike_is_unliked"><button type="button"data-ulike-id="97"data-ulike-nonce="b00fcea78c"data-ulike-type="likeThis"data-ulike-status="3" class="wp_ulike_btn wp_ulike_put_image wp_likethis_97"></button><span class="count-box">24+</span> </div></div></div><!-- .entry-content --></article><!-- #post-## --></div></main><!-- #main --></div><!-- #primary --></div><!-- close .main-content-inner --><div id="secondary" class="widget-area col-sm-12 col-md-4" role="complementary"><div class="well"><aside id="media_image-2" class="widget widget_media_image"><a href="https://discord.gg/ZHpRAFp"><img width="298" height="151" src="http://monkeycoder.co.nz/wp-content/uploads/2018/01/discord.gif" class="image wp-image-12929 attachment-full size-full" alt="" style="max-width: 100%; height: auto;" /></a></aside><aside id="bbp_topics_widget-4" class="widget widget_display_topics"><h3 class="widget-title">Recent Forums Topics</h3><ul><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/100-bounty-mx2-running-on-samsungs-linux-on-dex/">$100 Bounty: MX2 Running on Samsung's Linux on Dex</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/banana-glwindow-test-black-output/">Banana glwindow test black output</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/android-keyboard/">Android keyboard</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/float-rounding/">Float rounding</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/mx2-on-linux-on-dex-by-samsung/">MX2 on Linux on Dex by Samsung</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/viva-mortis/">Viva Mortis</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/requiring-discord-to-join-forums/">Requiring discord to join forums</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/lehnsherr/">Lehnsherr</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/monkey-x-game-now-an-official-zelda-game/">Monkey-X game now an official Zelda game!</a></li><li><a class="bbp-forum-title" href="http://monkeycoder.co.nz/forums/topic/how-to-use-git-for-your-own-projects-modules-within-the-monkey2-repo/">How to use GIT for your own projects/modules within the monkey2 repo</a></li></ul></aside> </div></div><!-- #secondary --></div><!-- close .row --></div><!-- close .container --></div><!-- close .site-content --><div id="footer-area"><div class="container footer-inner"><div class="row"><div class="footer-widget-area"><div class="col-sm-4 footer-widget" role="complementary"><div id="search-2" class="widget widget_search"><form role="search" method="get" class="form-search" action="http://monkeycoder.co.nz/"><div class="input-group"><label class="screen-reader-text" for="s">Search for:</label><input type="text" class="form-control search-query" placeholder="Search…" value="" name="s" title="Search for:" /><span class="input-group-btn"><button type="submit" class="btn btn-default" name="submit" id="searchsubmit" value="Search"><span class="glyphicon glyphicon-search"></span></button></span></div></form></div><div id="archives-7" class="widget widget_archive"><h3 class="widgettitle">Archives</h3> <label class="screen-reader-text" for="archives-dropdown-7">Archives</label><select id="archives-dropdown-7" name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'><option value="">Select Month</option><option value='http://monkeycoder.co.nz/2018/12/'> December 2018 </option><option value='http://monkeycoder.co.nz/2018/11/'> November 2018 </option><option value='http://monkeycoder.co.nz/2018/09/'> September 2018 </option><option value='http://monkeycoder.co.nz/2018/07/'> July 2018 </option><option value='http://monkeycoder.co.nz/2018/06/'> June 2018 </option><option value='http://monkeycoder.co.nz/2018/05/'> May 2018 </option><option value='http://monkeycoder.co.nz/2018/04/'> April 2018 </option><option value='http://monkeycoder.co.nz/2018/03/'> March 2018 </option><option value='http://monkeycoder.co.nz/2018/02/'> February 2018 </option><option value='http://monkeycoder.co.nz/2018/01/'> January 2018 </option><option value='http://monkeycoder.co.nz/2017/12/'> December 2017 </option><option value='http://monkeycoder.co.nz/2017/11/'> November 2017 </option><option value='http://monkeycoder.co.nz/2017/09/'> September 2017 </option><option value='http://monkeycoder.co.nz/2017/08/'> August 2017 </option><option value='http://monkeycoder.co.nz/2017/06/'> June 2017 </option><option value='http://monkeycoder.co.nz/2017/05/'> May 2017 </option><option value='http://monkeycoder.co.nz/2017/03/'> March 2017 </option><option value='http://monkeycoder.co.nz/2017/01/'> January 2017 </option><option value='http://monkeycoder.co.nz/2016/11/'> November 2016 </option><option value='http://monkeycoder.co.nz/2016/10/'> October 2016 </option><option value='http://monkeycoder.co.nz/2016/09/'> September 2016 </option><option value='http://monkeycoder.co.nz/2016/08/'> August 2016 </option><option value='http://monkeycoder.co.nz/2016/07/'> July 2016 </option><option value='http://monkeycoder.co.nz/2016/06/'> June 2016 </option><option value='http://monkeycoder.co.nz/2016/05/'> May 2016 </option><option value='http://monkeycoder.co.nz/2016/04/'> April 2016 </option><option value='http://monkeycoder.co.nz/2016/03/'> March 2016 </option><option value='http://monkeycoder.co.nz/2016/02/'> February 2016 </option><option value='http://monkeycoder.co.nz/2015/12/'> December 2015 </option><option value='http://monkeycoder.co.nz/2015/11/'> November 2015 </option><option value='http://monkeycoder.co.nz/2015/10/'> October 2015 </option><option value='http://monkeycoder.co.nz/2015/09/'> September 2015 </option></select></div> </div><!-- .widget-area .first --><div class="col-sm-4 footer-widget" role="complementary"><div id="bbp_replies_widget-3" class="widget widget_display_replies"><h3 class="widgettitle">Recent Replies</h3><ul><li><a class="bbp-reply-topic-title" href="http://monkeycoder.co.nz/forums/topic/viva-mortis/#post-16179" title="what sort of collision issues are you having? Mig…">Viva Mortis</a></li><li><a class="bbp-reply-topic-title" href="http://monkeycoder.co.nz/forums/topic/viva-mortis/#post-16178" title="Played the first windows version. Everything seem…">Viva Mortis</a></li><li><a class="bbp-reply-topic-title" href="http://monkeycoder.co.nz/forums/topic/viva-mortis/#post-16177" title="YAY. Viva Mortis come second in the SyntaxBomb co…">Viva Mortis</a></li><li><a class="bbp-reply-topic-title" href="http://monkeycoder.co.nz/forums/topic/how-to-use-git-for-your-own-projects-modules-within-the-monkey2-repo/#post-16176" title="Thanks Danilo, very helpful!">How to use GIT for your own projects/modules within the monkey2 repo</a></li><li><a class="bbp-reply-topic-title" href="http://monkeycoder.co.nz/forums/topic/100-bounty-mx2-running-on-samsungs-linux-on-dex/#post-16175" title="Bounty still stands!">$100 Bounty: MX2 Running on Samsung's Linux on Dex</a></li></ul></div> </div><!-- .widget-area .second --><div class="col-sm-4 footer-widget" role="complementary"><div id="text-3" class="widget widget_text"><h3 class="widgettitle">What is this?</h3> <div class="textwidget"><p>Monkey2 is an easy to use, cross platform, games oriented programming language from Blitz Research.</p></div></div> </div><!-- .widget-area .third --></div></div></div><footer id="colophon" class="site-footer" role="contentinfo"><div class="site-info container"><div class="row"><nav id="menu-social" class="social-icons"><ul id="menu-social-items" class="social-menu"><li id="menu-item-12928" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-12928"><a href="https://www.facebook.com/BlitzResearchLtd"><i class="social_icon"><span>Blitz Research on Facebook</span></i></a></li></ul></nav> <nav role="navigation" class="col-md-6"><ul id="menu-social-menu" class="nav footer-nav clearfix"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-12928"><a href="https://www.facebook.com/BlitzResearchLtd">Blitz Research on Facebook</a></li></ul> </nav><div class="copyright col-md-6">2018 © Blitz Research Ltd. </div></div></div><!-- .site-info --><div class="scroll-to-top"><i class="fa fa-angle-up"></i></div><!-- .scroll-to-top --></footer><!-- #colophon --></div></div><!-- #page --><script type="text/javascript">jQuery(document).ready(function ($) {if ($(window).width() >= 767) {$('.navbar-nav > li.menu-item > a').click(function () {if ($(this).attr('target') !== '_blank') {window.location = $(this).attr('href')}})}})</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/bbpress/templates/default/js/editor.js?ver=2.5.14-6684'></script><script type='text/javascript'>/* <![CDATA[ */var themeMyLogin = {"action":"","errors":[]};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/theme-my-login/assets/scripts/theme-my-login.min.js?ver=7.0.13'></script><script type='text/javascript'>/* <![CDATA[ */var wp_ulike_params = {"ajax_url":"http:\/\/monkeycoder.co.nz\/wp-admin\/admin-ajax.php","notifications":"1"};/* ]]> */</script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/plugins/wp-ulike/assets/js/wp-ulike.min.js?ver=3.6.0'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/js/vendor/flexslider.min.js?ver=20140222'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/js/flexslider-custom.js?ver=20140716'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-content/themes/sparkling/assets/js/skip-link-focus-fix.min.js?ver=20140222'></script><script type='text/javascript' src='http://monkeycoder.co.nz/wp-includes/js/wp-embed.min.js?ver=5.1.1'></script></body></html>…so if you set canvas.Shader to a non-null value, you can draw a bunch of stuff using a single shader regardless of each image’s Image.Shader. I can see this being useful for multipass techniques.
This actually kind of mirrors the Canvas.Blend property which overrides Image.Blend if non-null.
It also provides a way to set the shader used for points, lines, polys etc.
Is this right Anatol?
October 26, 2017 at 5:28 am #11325Hi Mark, yes, that’s about what I had in mind. So one shader that applies to multiple things. If the usage would be as you’ve shown in your sample code that’d be nice and easy to apply.
Even better if, as you mentioned, it could be applied to drawn shapes, not just bitmaps.
October 26, 2017 at 1:22 pm #11330Could you reimplement default behavior in custom shader, then control which effect via uniforms? Or maybe use intermediate render targets per effect with default images?
November 4, 2017 at 11:05 am #11470Sorry, I’m just coming back to this. So it appears that at the moment shaders can only be used for images, is that right? I tried to apply a shader by looping through all shapes that I’ve drawn, but they don’t have a Shader property. I just thought I can use something like that as a temporary solution until (fingers crossed) Mark’s suggestion above would be implemented. But maybe I need to put shaders aside until a later version of Monkey2.
Mark, is it helpful to put this into Github as an “issue” (labelled as an enhancement)? Thank you!
November 7, 2017 at 12:35 pm #11532Just a brief update, I actually got this to work and could apply a shader (a mask in this case) to a number of drawn shapes. This was possible in the current Monkey2 with a combination of the following:
- a glsl shader (sprite-masked) from this related thread (a mask glsl shader is linked there as part of the zip file)
- a MaskedImage Image extension, however with slightly modified code to the one in the link above to take a pixmap instead of an image path
- a new canvas that renders to that MaskedImage above (see also the rendertoimage banana)
- a bunch of randomly generated shapes that are drawn onto that new canvas
I can animate the shapes and the mask independently and it works very well. I’m not sure if this is very efficient performance wise but for now at least it works as intended.
I’ll see if I can write an isolated sample code to share here. So far I still don’t understand this 100% and it’s surrounded by a bit of convoluted work in progress, but I’m glad I got it working. Thanks to everyone who gave me the hints to get there. I’ll follow up.
Having said that, a way as suggested by Mark above would still be great.
November 7, 2017 at 8:28 pm #11534I did have a look into this andit’s doable but a bit complicated to make ‘nice’.
Just to clarify though, are you only wanting to apply a shader to a bunch of shapes? This is easier…
November 8, 2017 at 9:17 am #11553Hi Mark. In this case I’m thinking of “layers” (conceptually). So I have a number of things (shapes, possibly bitmaps, etc.) in a “layer” (i.e. somehow grouped), and I want to apply a shader to this layer/group. I’ll eventually end up with probably 3–4 “layers” total that each have a different (yet very simple) shader applied. I need to test if this is too expensive performance-wise, and what’s the best way to do this to avoid drawing everything onto the layer each frame. But that’s a different issue.
I think the way to just draw the shapes/bitmaps that I need to a canvas, render that canvas onto an image and apply a shader to that image is working well. It’s great to discover the flexibility that Monkey2 already provides.
If it works in practice for my game remains to be seen, but I’m on the right track.
-
AuthorPosts
You must be logged in to reply to this topic.