In order to use the <b> tag within html text in flash and have Flash automatically detect the right font to use for bold, you must embed both character sets and specify the fontWeight of both.
Sounds more complicated than it is. Just use the following code when embedding fonts:
[Embed
(mimeType=
'application/x-font', source=
'fonts/myFont-Medium.ttf', fontName=
'myfont')]
private var font:
Class;
[Embed(mimeType='application/x-font', source='fonts/myFont-Bold.ttf', fontName='myfont', fontWeight='bold')]
private var fontBold:Class;
And it does it out of the box.
SWFAddress 2.1 is out and it supports Google Analytics with no extra effort. No code necessary except for the usual SCRIPT tags code provided by Google.
If you are like me and don't like to read all the fine print, keep in mind that you'll have to remove the following code
pageTracker._trackPageview();
from the HTML, because SWFAddress tracks the page view automatically for you. If you don't remove you'll end up with double page visits.
Pages are ready to be tracked. So now to track events:
public static function track(event:String):void
{
ExternalInterface.call("pageTracker._trackPageview('"+event+"')");
}
And you are all set.
Let's go with a little bit of hacking for the masses. Adobe implementation of security relies in some cases on the crossdomain.xml file hosted at the server that holds the data. You can access that data, generally, with your browser, but you can't with the Flash Player if the crossdomain file doesn't allow you. Actionscript will throw a Sandbox violation error.
In many cases we want access to data that is available to us by other means but restricted to Flash by this file. In my case I was trying to access Google Geolocation API from actionscript:
http://maps.google.com/maps/geo?q=...
This is the content of http://maps.google.com/crossdomain.xml :
<cross-domain-policy>
<site-control permitted-cross-domain-policies="by-content-type"/>
</cross-domain-policy>
I have yet to figure out if there is a workaround in actionscript, but I come across a nifty php that will let you overpass those crossdomain restrictions. Here it goes:
crossdomain-proxy.php
<?php
$post_data =
$HTTP_RAW_POST_DATA;
$header[] =
"Content-type: text/xml";
$header[] =
"Content-length: ".
strlen($post_data);
preg_match("/url=(.*)/",
$_SERVER['REQUEST_URI'],
$params);
$ch = curl_init
( $params[1] );
curl_setopt
($ch, CURLOPT_RETURNTRANSFER,
1);
curl_setopt
($ch, CURLOPT_TIMEOUT,
10);
curl_setopt
($ch, CURLOPT_HTTPHEADER,
$header);
if ( strlen($post_data)>
0 ){
curl_setopt
($ch, CURLOPT_POSTFIELDS,
$post_data);
}
$response = curl_exec
($ch);
if (curl_errno
($ch)) {
print curl_error
($ch);
} else {
curl_close
($ch);
header("Content-type: text/xml; Content-length: ".
strlen($response));
print $response;
}
?>
This code was extracted from Yoppa blog where he goes into detail explaining how to use it. In case your Japanese is rusty here's how it goes.
Instead of requesting the url:
var url:String = "http://maps.google.com/maps/geo?q=...";
we are going to request:
var url:String = "crossdomain-proxy.php?url=http://maps.google.com/maps/geo?q=...";
This bypasses the security error and retrieves the exact same content as the original url.
Now I have to admit that I don't understand every bit of code in that php file, but I checked it first to make sure that my server wasn't going to explode with it, and it works really well..
Php n00bies, beware.
If I were you, I would restrict the calls to this php to my own domain only.
Just to make sure that those smart-ass hackers out there won't use my php's url to retrieve their content.
The very basis of Flash security that concern many content creators is the protection of the intellectual property around websites and other flash powered RIAs. The most common security breach is the easiness to "steal material" from the web (note the quotes).
If it's digital it can't be "stolen"
and it for sure can't be called "material".
- Flash Pirates
Ok, so this is your common guy. Stealing for them can be as easy as checking their browser cache, or fiddling with FireBug and download SWF files or other assets that might be dynamically loaded from the flash (swf files, images, xmls, mp3s, ....). We all know them, and -let's be honest- we all have been there.
We all have a hacker inside.
It's the size what makes the difference
Then again, nosing around your computer cache can hardly be called "stealing", and in many circumstances keeping a file at one's computer for personal use doesn't harm its author either.
On the other hand one example comes to my mind: Flash Game developers. I have read through the years how some of this developers have seen their games stolen reposted on other sites, and appropriated by others. Something one doesn't want to deal with specially when the intent for the piece of work was freeware software and the copies are being monetized. In this case we are dealing with more than "stealing" we are dealing with "appropriation".
Flash pirates are numerous, but they lack in many cases further technological knowledge. They can steal but they can't modify. That is the labor of other guys...
- SWF Hackers
These are the clever guys. They will bypass any trick you've set up, and successfully download your SWFs. Then, if they so desire, they will expose your creations inner core. There are out there a handful of decompilers that will do the trick and they keep up to date with their counterpart the obfuscators.
Sometimes it is a very useful tool for content creators. I'll explain. I recently found about a set of components that an individual was selling on his web when I opened a SWF file in FlashDevelop. I would have never been exposed to this creations if it wasn't for the fact that I check the classes involved on the application. This particular SWF file was nothing but a clever use of Google APIs, PaperVision and some commercial components from this site. If you have released a component or other code, you know that once an author encapsulates their flash there is no easy way to claim that some of your code might be there.
You can rest assured that, for the hackers, you will always get some credit.
- So what can you do?
OpenSource is a great idea, and probably unavoidable, but for content creators, programmers and artist (they are all the same) this might be a hard road.
Ask yourself first: Do I have to do something?
Flash Pirates can be more or less deceived. Protect your work to a minimum and you will be saving yourself from 95% of your work appropriation. Still worried about the rest 5%? It's futile. SWF Hackers can be as persistent and methodological as your browser is. If your content is open to be read and interpreted by a browser, it can be too be read and interpreted by a human given enough time.
If they want it bad enough
they will have it.
"Bad enough" is the key here, and I will be posting some tools and techniques to test how far those hackers are eager to go to open your code. But in the end, remember, you learned from other's code. Be generous and let other learn from you. Spend your time coding the next thing, not protecting what you've already finish!.
That should be "forth and back".
EasingAround is a class to simplify even more very basic tweens. The idea behind this class is to provide a means to create a tween that starts and ends at the same value.
If your regular Easing function [from 1 to 10] behaves as follows:
1 . . . . 5 . . . . 10
then, an EasingAround function with the same parameters behaves as:
1 . .5. . 10 . .5. . 1
in the same amount of time.
These equations come in handy when we want to create some quick animation -like button rollovers- with the shortest code, without having to "chain" two consecutive tweens.
Example (rollover the icon or click the stage to tween):
This movie requires Flash Player 9
This is the code for the rollover tween:
new Tween(box, "scaleX", EasingAround.easeInOutSine, 1, 2, 0.3, true)
new Tween(box, "scaleY", EasingAround.easeInOutSine, 1, 2, 0.3, true)
This class contains only the easing equations and should be compatible with any AS3 tween engine out there (e.g. Tweener) or with code that uses fl.motion.easing.* or fl.transitions.easing.*
The functions are named as follows:
EasingAround.easeNone
EasingAround.easeInQuad
EasingAround.easeOutQuad
EasingAround.easeInOutQuad
EasingAround.easeOutInQuad
EasingAround.easeInCubic
EasingAround.easeOutCubic
EasingAround.easeInOutCubic
EasingAround.easeOutInCubic
etc...
Note: EasingAround uses the original easing equations by Robert Penner.
For those of you that have done some pixel shading programming, Adobe is bringing into Flash a very interesting project:
Adobe Image Foundation (AIF) Toolkit preview , codenamed Hydra.
Now, if only my card was supported...
With the last release of AIR beta 2 comes more detailed file type asociation.
This is the fileTypes tag in the AIR configuration XML:
<fileTypes>
<fileType>
<name>com.example</name>
<extension>xmpl</extension>
<description>Example file</description>
<contentType>example/x-data-type</contentType>
<icon>
<image16x16>icons/AIRApp_16.png</image16x16>
<image32x32>icons/AIRApp_32.png</image32x32>
<image48x48>icons/AIRApp_48.png</image48x48>
<image128x128>icons/AIRApp_128.png</image128x128>
</icon>
</fileType>
</fileTypes>
There's a description of some of these paremeters at the Adobe Live Docs site.
The code above, registers the types with your application, so the AIR app is open upon clicking any file with the right extension. In order to perform an action (eg. open), we need to retrieve the value of such file.
To do so we need to add the following code to the "invoke" event in the WindowedApplicaton ( invoke="onInvoke(event) ):
public function onInvoke(invokeEvent:InvokeEvent):void
{
//trace("Invoke event received.");
if(invokeEvent.arguments.length> 0){
trace("Application opened with: "+event.arguments[0]); // file path
// ...
// custom code
// ...
} else {
trace("--no arguments--");
}
}
Again, at Adobe you can find more details.
Finally, if you want a full detailed tutorial go over to Setting Up an AIR Application with File Associations where you'll find an excellent step-by-step guide by senocular.
If you have some old AS2 code laying around that you'd like to take into the desktop, here you have a quick tip that might save you hours of re-coding those AS2 classes into AS3.
In my case, I had an AS2 project completed that I had long ago converted into an executable with Screenweaver. I needed to change a couple of things, and it was then when I realized that Screenweaver was obsolete and would not run in Vista.
Of course AIR is the "desktop publisher" of choice right now, but AIR supports only AS3. The solution comes (using Flex) with an easy SWFLoader, that simply performs an old loadMovie, effectively loading your AS2 movie into AS3. Create a wrapper AS3 class that simply loads your AS2 movie, and create your application with AIR.
You'll need to create a WindowedApplication class to substitute the default class created by Flex.
AS2AIR.as
package com.domain
{
import mx.core.WindowedApplication;
import mx.controls.SWFLoader;
public class AS2AIR extends WindowedApplication
{
public var swf:SWFLoader;
public function init():void
{
this.swf.source = "My_Old_AS2_Code.swf";
}
}
}
And the MXML file contains just that SWFLoader.
AS2AIR.mxml
<xml
version=
"1.0" encoding=
"utf-8"?>
<app:AS2AIR
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:app="com.domain.*"
initialize="init();" width="800" height="600"
layout="absolute" xmlns:ns1="*">
<mx:SWFLoader id="swf" scaleContent="false" width="100%" height="100%" x="0" y="0"/>
</app:AS2AIR>
You can, of course, indicate the source file direclty in the MXML file, but if you need to manage some communication between your AIR application and your AS2 movie, you'll have to deal with your own AS class.
Recent Comments