Posts Tagged ‘as2’
Add this to the list of things I should have already known!
Story
I’ve got an html enabled text box and was trying to devise a way that I could have a hyperlink anchor tag not link to a webpage but actually do something flash. It didn’t seem possible, and I looked through all the different html css combinations I could think of. I finally resorted to trying to use some component like Deng or FlashML. FlashML had a smaller footprint and seemed to do more what I wanted, so I started investigating it. To my dismay, the support for it was few and far between. I found an older version that came with an example file and then a newer one with some documentation but no example and I found no examples any where else. So Lee, if you ever read this, some new examples could be nice. In the documentation I was reading about a functino called AddASFunction and the example html line was very interesting:
1
| <a href="asfunction:doSomething, startFrame">link</a> |
I started looking through the rest of the documentation to find this asfunction use. But all it had was:
The href attribute can include the asfunction string which allows the link provided by the anchor to call a function in Flash. More of this can be found within the addASFunction definition in this help document.
I knew I was on to something, asfunction. So a quick google search and I found the official doc! I was shocked that I had the tool to do this the whole time! Well, shocked and feeling like an idiot for never having heard of it before. I knew it could be done somehow, but had no idea that it was already a feature of htmlText in flash! So now that you know my embarrassing story, I’ll let you in on the secret.
Overview
In flash, you can allow html text within a text area. You either set the text html property as true with actionscript (my_txt.html = true;) or click the ‘Render text as HTML’ button in the properties window of the text area. You cannot enable html text on static text areas however. You can have links and various html elements (but not full html). Usually links have a url in the href attribut of the anchor tag, but flash will read a special value of ‘asfunction’ which specifies that an actionscript function is to be called rather than a url. The correct syntax is asfunction followed by a colon and then the name of the actionscript function to be called, optionally followed by a comma and a possible single argument to be passed to the specified function (href=”asfunction:functionName,argument”).
Steps
- Enable html in the text box.
- Have your function (ex: functionName) ready to be called from the html link.
- Give the href attribute of the anchor tag a property “asfunction:functionName,argument” Notice that the official documentation calls for spaces after punctuation, but any space you put after the colon (:) or comma (,) will be sent to the function in the argument, or will expect a space in the function name and give you a headache.
Example
In this example I’ve got an html enabled text box with 4 links. The first is a standard link (I hope you know what that does). The next link calls an actionscript function with asfunction. The third link sends a single argument to another function. And the last link sends multiple arguments to yet another function. Wait! Multiple arguments? I thought I said only one was supported, well this example shows how to send multiple arguments disguised as a single param and parse them. It’s pretty simple actually.
Actionscript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import TextField.StyleSheet;
myHTMLText = "Sample text in an html enabled text box. "+
"Here's a normal link to <a href='http://blog.circlecube.com' target='_blank'>circlecube</a>! "+
"And some more links that don't go anywhere, they call functions in actionscript. "+
"<a href='asfunction:clickLink'>Click this one</a>, "+
"to see the actionscript function called from the html text box. "+
"<a href='asfunction:clickWithArg,Click this too'>Click this too</a>, "+
"and see that the actionscript function you're calling can have an argument passed to it. And "+
"<a href='asfunction:clickWithMultipleArgs, one,two,three args'>click me three and four</a> "+
"to see a way to send multiple arguments from your htmlText. "+
"Also, one last example of what not to do "+
"<a href='asfunction: clickWithArg, arg with preceding space'>Click for nothing</a>";
//create and initialize css
var myCSS:StyleSheet = new StyleSheet();
myCSS.setStyle("a:link", {color:'#0000CC',textDecoration:'none'});
myCSS.setStyle("a:hover", {color:'#0000FF',textDecoration:'underline'});
myHTML.html = true;
myHTML.htmlText = myHTMLText;
myHTML.styleSheet = myCSS;
//function to be called from html text
function clickLink() {
giveFeedback("Hyperlink clicked!");
}
//another function to be called from html text, recieves one argument
function clickWithArg(arg) {
giveFeedback("Hyperlink clicked! Argument: "+arg);
}
//a simple trick to allow passing of multiple arguments
function clickWithMultipleArgs(args) {
giveFeedback("Hyperlink clicked! Multiple arguments passed: "+args);
argArray = new Array();
argArray = args.split(',');
for (i = 0; i < argArray.length; i++) {
giveFeedback("arg "+i+": "+argArray[i]);
}
}
function giveFeedback(str) {
trace(str);
feedback.text += str +"\n";
feedback.scroll = feedback.maxscroll;
} |
HTML
1 2 3 4 5 6 7 8 9 10 11
| Sample text in an html enabled text box.
Here's a normal link to <a href='http://blog.circlecube.com' target='_blank'>circlecube</a>!
And some more links that don't go anywhere, they call functions in actionscript.
<a href='asfunction:clickLink'>Click this one</a>,
to see the actionscript function called from the html text box.
<a href='asfunction:clickWithArg,Click this too'>Click this too</a>,
and see that the actionscript function you're calling can have an argument passed to it. And
<a href='asfunction:clickWithMultipleArgs, one,two,three args'>click me three and four</a>
to see a way to send multiple arguments from your htmlText.
Also, one last example of what not to do
<a href='asfunction: clickWithArg, arg with preceding space'>Click for nothing</a> |
Download Source
asfunction.zip

Author: Evan Mullins | Filed under: tutorial
Tags: actionscript, as2, css, download, flash, html, open source, tutorial
I’ve had a couple special requests to explain flashvars and how to use it and show it in action.
Overview
The property “FlashVars” can be used to import root level variables to the flash movie or swf. The flashvars propery is used in codes for embedding flash in the html page. The string of variables passed in as flashvars, will be imported into the top level of the movie when it is first instantiated. Variables are created before the first frame of the SWF is played. The format of the string is a set of name=value combinations separated by ampersand (&) symbols.
Steps
- Include the flashvars property in your embed codes and voila! You have these variables to use in your swf.
- That’s the one step
Code
HTML Embed Codes
1 2 3 4 5 6
| Here's some sample embed codes, including object and embed tags:
<object width="540" height="240" title="sample">
<param name="movie" value="flashvarsTutorial.swf" />
<param name="flashvars" value="var1=here&var2=are&var3=my&var4=flashvars" />
<embed src="flashvarsTutorial.swf" flashvars="var1=here&var2=are&var3=my&var4=flashvars" type="application/x-shockwave-flash" width="540" height="240" ></embed>
</object> |
Actionscript using flashvars
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //flashvars="var1=val1&var2=val2&var3=val3";
display("var1 = "+ var1);
display("var2 = "+ var2);
display("var3 = "+ var3);
display("var4 = "+ var4);
function display(todisplay:String){
feedback.text += todisplay+"\n";
trace(todisplay);
} |
Example
Page 1 (var1=val1&var2=val2&var3=val3)
Page 2 (var1=here&var2=are&var3=my&var4=flashvars)
Source
Download the html files and the fla and swf in this flashvars.zip

Author: Evan Mullins | Filed under: tutorial
Tags: actionscript, as2, download, flash, html, open source, tutorial
Here’s a new site and series from StomperNet called Going Natural 3!
It’s a bit of free videos made and released to showcase the talents and business of what StomperNet is about and what they do for their clients. They’re ‘moving the freeline’ so to speak…
The first video series begins with Dan Thies talking about his ‘Crazy Theory’ for AdWords.
On signing in there are a couple BONUS videos for you as well. So go check them out as well!
Watch Going Natural 3 – Adwords Triangulation Method and more
This site contains the latest flash video player built by yours truly. I also did the design of the site: involving html, css, php, javascript and dealing with drupal too!

Author: Evan Mullins | Filed under: portfolio
Tags: actionscript, as2, css, drupal, flash, html, javascript, php, stompernet, video, web design, website, work

iKill: Pick Fruit, Be Happy, Keep Killing
I developed this game for my Digital Media Thesis. I wanted to do a project that was interactive, and enjoying flash I decided to create it in the form of a game. The project called “iKill’ is Installation Game Art, and is also available online. It explores multiple these, such as man in nature, globalization, fast food, economics, etc. The game was part of an installation for the Digital Media Exit show of Spring 2007. I kept progress of the game online at my digmeexit blog with incremental demo versions of the project. The installation had a fully interactive game and used game controller to play. In the game you play the generic man and work through the work week. Your job is to pick fruit as it grows on the trees. You receive your wages according to your harvest and at the end of the day you “cash out” and earn your happiness (how else but with Happy Meals). You do encounter obstacles and must kill the bugs before they deprive you of your happy harvest! It is pretty simple critique on a culture that equates unhealthy food to happiness without regard to the environment, and equates a mindless 40 hour work week and competitive salary to a full life. For more details visit the development blog (digmeexit.blogspot)




Use the arrows to move, space bar to pause, ‘z’ to jump and ‘x’ to swat.

Author: Evan Mullins | Filed under: portfolio
Tags: actionscript, as2, circle cube, design, experiment, flash, game, installation, interactive, physics, portfolio
Overview
The Shared Object is like a cookie for flash. It lets flash store some data on the local machine, so between sessions it can remember things. Learn more from wikipedia.
Shared Objects are used to store data on the client machine in much the same way that data is stored in a cookie created through a web browser. The data can only be read by movies originating from the same domain that created the Shared Object. This is the only way Macromedia Flash Player can write data to a user’s machine. Shared Objects can not remember a user’s e-mail address or other personal information unless they willingly provide such information.
I’ve seen many Local Shared Object tutorials and examples, which have users input their name and/or hometown and other filler data. But I wanted to show how to creatively incorporate shared objects into interactions. So I’ve thrown in many simultaneous examples including the uber-simple ‘input your name and I’ll remember it’ approach. I hope I didn’t throw in so much that it got confusing… just let me know if you have any questions or anything is unclear. Keeping it simply and broad there’s only a few things to know about Shared Objects.
Steps
Simply put there are only a couple things to worry about with Local Shared Objects
- Create them.
- As in create the shared object
- Write them.
- As is write to the shared object
- Set them.
- As in setting variables in the shared object
- Get them.
- As in getting variables back out of the shared object
- Clear them.
- As in clearing the shared objec
Actionscript
here’s samples on how to do each of those
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| /* Create them. */
//make Local Shared Object named myLocalSO(in as) called "myflashcookie" on disk
var myLocalSO:SharedObject = SharedObject.getLocal("myflashcookie");
/* Write them. */
//flush the SO, write the SO to disk
myLocalSO.flush();
/* Set them. */
//set key's value to specified value in SO
//key is the name of the data
//val is key's value
function setVal(key, val) {
myLocalSO.data[key] = val;
trace(key +" set to "+val);
/* including writing to Shared Object in the setter function */
//flush the SO, write the SO to disk
myLocalSO.flush();
}
/* Get them. */
//get key's value from SO
function getVal(key) {
return myLocalSO.data[key];
trace(myLocalSO.data[key] +" received from "+key);
}
/* Clear them. */
myLocalSO.clear(); |
Example
here’s my colorful example.
The purple/yellow circle is draggable, so place it where you want it. Enter your name and age in the input boxes. Press the center red ‘Set cookie’ button to copy those values to the shared object that is on your computer now. The red transparent circle represents the cookie positions. You can position the purple/yellow circle from the cookie contents with the dark green ‘Position from cookie’ button, or position it randomly with the blue ‘Position randomly’ button. Erase the cookie with the orange ‘Erase cookie’ button. Toggle easing (animation) with the Bright green button (which changes to dark red when off), it tells the current mode of ease. I have the cookie coordinates displayed and the current coordinates of the purple/yellow circle also displayed.
The cookie includes a date object, which is used to calculate the age of the cookie (watch it reset when you erase the cookie (orange button)).
The ‘All Time Visit’ stat is the only thing that does not get reset when you erase the cookie,
[kml_flashembed fversion="9.0.0" movie="http://blog.circlecube.com/wp-content/uploads/2008/04/sharedObject.swf" targetclass="flashmovie" publishmethod="dynamic" width="300" height="400"]

and source code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
| //////////////////////// Initialize variables ///////////////////////
//make Local Shared Object named myLocalSO(in as) called "myflashcookie" on disk
var myLocalSO:SharedObject = SharedObject.getLocal("myflashcookie");
//speed var for easing
var speed = 3;
var w = myCircle._width/2;
//toggle var for easing
var ease = true;
//as var to store alltime cookie
var allTimeVisitCount=0;
countVisit();
cookieFeedback();
//line style for tracing movement
lineStyle(1, 0, 50);
//////////////////////// Functions ///////////////////////
//set key's value to specified value in SO
//key is the name of the data
//val is key's value
function setVal(key, val) {
myLocalSO.data[key] = val;
trace(key +" set to "+val);
//flush the SO, write the SO to disk
myLocalSO.flush();
}
//get key's value from SO
function getVal(key) {
return myLocalSO.data[key];
trace(myLocalSO.data[key] +" received from "+key);
}
function countVisit() {
//if first visit
if (getVal('visitCount') == undefined) {
//create date for now and store in cookie
var todayDate:Date = new Date();
setVal('date', todayDate);
trace("creating date");
//start/reset counting visits
var visitCount = 0;
//notice allTimeVisitCount is not reset, but stored still as a var in actionscript
}
//not first visit
else {
visitCount = getVal('visitCount');
allTimeVisitCount = getVal('allTimeVisitCount');
}
//increment visit counter
setVal('visitCount', visitCount+1);
setVal('allTimeVisitCount', allTimeVisitCount+1);
//feedback of visit counting
visitsFeedback.text = getVal('visitCount');
allTimeVisitsFeedback.text = getVal('allTimeVisitCount');
}
//feedback of cookie contents
function cookieFeedback() {
//in defined print coordinate contents
cookiex.text = getVal('circleX') == undefined ? "no cookie" : getVal('circleX');
cookiey.text = getVal('circleY') == undefined ? "no cookie" : getVal('circleY');
//if not easing assign coordinates from cookie
if (!ease) {
myCookie._x = getVal('circleX');
myCookie._y = getVal('circleY');
}
//set target to cookie coordinates
else {
ctargetx = getVal('circleX');
ctargety = getVal('circleY');
}
//if name then trace cookie contents
if (getVal('name') != undefined) {
visitorFeedback.text = "Returning Visitor";
nameInput.text = getVal('name');
ageInput.text = getVal('age');
}
//no name then a new visitor
else {
visitorFeedback.text = "First Time Visitor";
nameInput.text = "";
ageInput.text = "";
}
calculateCookieAge();
}
function calculateCookieAge() {
//make a date now
todayDate = new Date();
//get the cookie's stored date
cookieDate = getVal('date');
//difference between two dates
cookieDateAge = Math.floor(todayDate - cookieDate);
//convert miliseconds to a timecode
cookieAge.text = msToTimeCode(cookieDateAge);cookieDateAge;
}
//convert miliseconds to a hh:mm:ss
function msToTimeCode(ms) {
//make sure value is within bounds. if a number grater than zero and less than the duration of video
if (isNaN(ms) || ms< 0) {
ms = 0;
}
//find seconds
var sec = ms/1000;
//find minutes
var min = Math.floor(sec/60);
//adjust seconds
sec = sec - min*60;
//find hours
var hour = Math.floor(min/60);
//adjust minutes
min = min - hour*60;
//floor seconds down to whole number
sec = Math.floor(sec);
//make time code with hours
if (hour == 0) {
if (sec < 10) {
sec = "0"+sec;
}
if (min < 10) {
min = "0"+min;
}
var tc = min+":"+sec;
}
//make time code without hours
else {
if (sec < 10) {
sec = "0"+sec;
}
if (min < 10) {
min = "0"+min;
}
var tc = hour+":"+min+":"+sec;
}
return tc;
}
////// Actionscript attached to Objects/handlers //////////
//place data on stage into cookie (circle coordinates and input text)
setCookieButton.onRelease = function() {
setVal('circleX', myCircle._x);
setVal('circleY', myCircle._y);
setVal('name', nameInput.text);
setVal('age', ageInput.text);
//update the display on stage
cookieFeedback();
}
//make random coordinates on stage
randomButton.onRelease = function() {
//if not easing assign coordinates to myCircle
if (!ease) {
myCircle._x = Math.random() * (Stage.width - w);
myCircle._y = Math.random() * (Stage.height - w);
}
//if easing assign coordinates to myCircle's target coords
else {
targetx = Math.random() * (Stage.width - w);
targety = Math.random() * (Stage.height - w);
}
}
myCircle.onPress = function() {
this.startDrag();
dragging = true;
lineStyle(1, 200, 30);
}
myCircle.onRelease = myCircle.onReleaseOutside = function() {
targetx = this._x;
targety = this._y;
lineStyle(1, 0, 50);
dragging = false;
this.stopDrag();
}
myCircle.onEnterFrame = function() {
//print position feedback
currentx.text = this._x;
currenty.text = this._y;
//if eas move to target
if (ease) {
if (!dragging) {
moveTo(this._x+w, this._y+w);
this._x+=(targetx-this._x)/speed;
this._y+=(targety-this._y)/speed;
}
//draw line
lineTo(this._x+w, this._y+w);
}
}
myCookie.onEnterFrame = function() {
//if ease move cookie to target
if (ease) {
this._x+=(ctargetx-this._x)/speed;
this._y+=(ctargety-this._y)/speed;
}
calculateCookieAge();
}
//Position from Cookie
cookieButton.onRelease = function() {
//if not easing set coordinates from cookie
if (!ease) {
myCircle._x = getVal('circleX');
myCircle._y = getVal('circleY');
}
//if easing set target coordinates from cookie
else {
targetx = getVal('circleX');
targety = getVal('circleY');
}
}
easeBtn.onRelease = function () {
//toggle easing
ease = !ease;
//advance the frame of this button...
this.play();
}
clearCookieBtn.onRelease = function() {
//clear the cookie (swipe all data)
myLocalSO.clear();
//restart visit count
countVisit();
//read cookie and give feedback
cookieFeedback();
} |
Source
download the source for this example: sharedObject.fla

Author: Evan Mullins | Filed under: tutorial
Tags: actionscript, as2, download, experiment, flash, interactive, open source, tutorial