Category Archives: functions

Recursive Countdown

Actionscript:
1. loop(20);
2.
3. function loop(i:int):void {
4.     if (i <0) return;
5.       trace(i);
6.       loop(i - 1);
7. }
8.
9. /* outputs:
10. 20
11. 19
12. 18
13. 17
14. 16
15. 15
16. 14
17. 13
18. 12
19. 11
20. 10
21. 9
22. 8
23. 7
24. 6
25. 5
26. 4
27. 3
28. 2
29. 1
30. 0
31. */

This snippet uses a recursive function to count down from some number. Recursion is pretty useless in actionscript, it will eventually cause an error... If you were to try to countdown from a higher number it would choke pretty fast...

Been writing haskell lately so I have recursion on the brain.

Also posted in misc | Tagged , , | 7 Comments

Functions Returning Functions

Actionscript:
1. var connect:Function = function(xp:Number, yp:Number, col:uint=0):Function{
2.     graphics.lineStyle(0,col);
3.     graphics.moveTo(xp, yp);
4.     var line:Function = function(xp:Number, yp:Number):Function{
5.         graphics.lineTo(xp, yp);
6.         return line;
7.     }
8.     return line;
9. }
10.
11. // draw a triangle
12. connect(200,100)(300,300)(100,300)(200, 100);
13.
14. // draw a box
15. connect(100,100, 0xFF0000)(150,100)(150,150)(100, 150)(100,100);

This is one of those techniques that I never really get tired of. It's pretty useless, but fun to play around with every now and then. This draws the somewhat boring looking picture below:

[EDIT]
A few people pointed out that this could be simplified with arguments.callee... So here is an example... it does the same thing as the original code...

Actionscript:
1. var connect:Function = function(xp:Number, yp:Number, col:uint=0):Function{
2.     graphics.lineStyle(0,col);
3.     graphics.moveTo(xp, yp);
4.     return function(xp:Number, yp:Number):Function{
5.         graphics.lineTo(xp, yp);
6.         return arguments.callee;
7.     }
8. }

Also posted in misc | Tagged , , | 6 Comments

JS Sketch Experiment

Actionscript:
1. [SWF(width=950, height=600)]
2. with (graphics) beginFill(0xefefef), drawRect(0,0,stage.stageWidth, stage.stageHeight);
3. var btn:Sprite = Sprite(addChild(new Sprite()));
4. with (btn.graphics) beginFill(0x666666), drawRect(0,0,100,20);
5. with(btn)  x=320, y=430, buttonMode = true;
6. btn.addEventListener(MouseEvent.ROLL_OVER, function():void{
7.   with(btn.graphics) clear(), beginFill(0x222222), drawRect(0,0,100,20);
8. });
9. btn.addEventListener(MouseEvent.ROLL_OUT, function():void{
10.   with(btn.graphics) clear(), beginFill(0x666666), drawRect(0,0,100,20);
11. });
12. btn.addEventListener(MouseEvent.CLICK, function():void{
13.     var res:*= ExternalInterface.call("function(){ plot=[]; colors=[]; " + txt.text + " return {plot:plot, colors:colors};}");
14.     render((res == null) ? {plot:[], colors:[]} : res);
15. });
16.
17. var v:Shape = Shape(addChild(new Shape()));
18. v.x = 700;
19. v.y = 220;
20. function render(obj:Object):void{
21.     var plot:Array = obj.plot;
22.     var colors:Array = obj.colors;
23.     var leng:int = plot.length;
24.     v.graphics.clear();
25.     var inc:int = 0;
26.     v.graphics.moveTo(plot[0], plot[1]);
27.     for (var i:int = 2; i<leng; i+=2){
28.         v.graphics.lineStyle(0,colors[inc++]);
29.         v.graphics.lineTo(plot[i], plot[i + 1]);
30.     }
31. }
32.
33.
34. var submit:TextField = TextField(btn.addChild(new TextField()));
35. submit.defaultTextFormat = new TextFormat("_sans", 12);
36. with(submit) textColor=0xFFFFFF, width=100, autoSize="center";
37. with(submit) mouseEnabled = false,  text="submit";
38.
39. var txt:TextField = TextField(addChild(new TextField()));
40. with(txt) x = y = 20, type = "input", multiline=true;
41. with(txt) width = 400, height = 400, border = true, background = 0xFFFFFF;
42. txt.defaultTextFormat = new TextFormat("Monaco", 12);
43. txt.text = "enter text";
44. txt.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
45. function onDown(evt:MouseEvent):void{
46.     txt.text = "";
47.     txt.removeEventListener(MouseEvent.MOUSE_DOWN, onDown);
48. }

This snippet is a mini code editor that allows the user to write javascript into a textfield - the javascript is then run using external interface. Optionally the javascript code can populate two arrays (plot and colors). If these arrays are populated flash, will render the data in each array using the Graphics class.

Have a look at the demo:

If you do something nice with this... post your javascript snippet as a comment and I'll add it to the JS Sketch page...

Also posted in Graphics, Math, dynamic, external data | Tagged , , , | Leave a comment

ActionScript Eval (well, not really)

Actionscript:
1. var txt:TextField = TextField(addChild(new TextField()));
2. txt.autoSize = TextFieldAutoSize.LEFT;
3.
4. var myVar:Number = 100;
5. // works as an expression parser
6. txt.text = js("return (" + myVar + " * 2 + 10) / 2");
7. txt.appendText("\n\n");
8.
9. // parses javascript
10. txt.appendText(js("var a = []; for (var i = 0; i<10; i++){ a.push(i) } return a;"));
11.
12. function js( data:String ):*{
13.    var res:*= ExternalInterface.call("function(){" + data + "}");
14.    return (res == null) ? "null" : res;
15. }

This one made my day - CAN'T believe I never thought of it before... haven't done any speed tests yet... but it shows how to use ExternalInterface.call to parse math expressions and javascript code. This will only work when the swf is shown in an html page of course... so if your in flash cmd+f12...

I got the idea from this code snippet... which actually has an error in it... the decode() function should not return void... I found that snippet thanks to this tweet by makc3d.

Also posted in Math, external data, misc, string manipulation, strings | Tagged , , | Leave a comment