Tuesday, July 6, 2010

mxmlc: Compiler error - command line: Error: ambiguous argument list

As part of creating a as3 based preloader I needed to use "-frame start some_main_class" option. I hit the below error:

command line: Error: ambiguous argument list; unable to determine where 'frames.frame' parameters end, and default 'file-specs' parameters begin. Use '--' to terminate the parameter list, or perhaps use the '-frames.frame=val[,val]+' syntax instead.

The solution is to use a alternative syntax like the error message points to namely, "-frame=start,some_main_class".

Friday, June 18, 2010

AS3: Textfield alpha

If create a dynamic textfield and use non-embedded fonts, the alpha property will not do anything. The solution is to put the textfield in a container and set the blendMode property of that container to Layer.

Tuesday, March 30, 2010

AS3: Runtime class instantiating

This is very useful if you do custom actions based on XML or any other method. This post explains thing quite nicely:

http://thillerson.wordpress.com/2007/03/01/runtime-class-instantiation-in-actionscript-30/

Friday, March 5, 2010

AS3: Does my xml doc contain a attribute

This is a simple check which increases the ease of using xml.

if you have a xml file like so:

<root_node some_attribute="">
</root_node>

in AS3 you can decide if a attribute exist by using the lenght() method. So code using the xml would be:

var my_xml:XML = some_function_to_get_xml();

if( my_xml.@some_attribute.length() != 0 ) {
trace("Yup, some_attribute exists");
}

if( my_xml.@some_non_existant_attribute.length() != 0) {
trace("This will not be printed since attribute does not exist");
}

Note it is easy to make a mistake and forget to use length as a method i.e. "length()" and use it as variable i.e. just "length" which will not work.

Wednesday, February 17, 2010

AS3: Preventing a parent from getting a Child's mouse clicks

If you have code that is like this:

var parent_sprite:Sprite = new Sprite();

parent_sprite.addEventListener(MouseEvent.CLICK,
handle_mouse_click);
addChild(parent_sprite);

function handle_mouse_click(event:MouseEvent):void {
parent_sprite.removeEventListener(MouseEvent.CLICK,
handle_mouse_click);
var child_sprite:Sprite = new Sprite();
draw_button_using_child_sprite(); // Some func to
// draw a button
child_sprite.addEventListener(MouseEvent.CLICK,
handle_button_click);

parent_sprite.addChild(child_sprite);
}

function handle_button_click(event:MouseEvent):void {
do_my_stuff();
parent_sprite.removeChild(child_sprite);
parent_sprite.addEventListener(MouseEvent.CLICK,
handle_mouse_click);
}

Now one would expect that on clicking on the parent_sprite, the child_sprite would appear. On click on the child_sprite, some stuff would get done and then the child_sprite is removed and the parent_sprite would be the only one on screen.

What I experienced is, that the child_sprite reappeared on the screen. This was because the parent was registering a click as soon as the event for the parent was registered again in handle_button_click() and was doing a addChild(child_sprite). The reason for this is that AS3 has a concept of "bubbling" where a event is passed down to the parent once the child is done with it and it will continue down the chain to the stage.

The solution to this is to use stopPropagation() or stopImmediatePropagation(). stopPropagation() will only prevent parent from receiving the events. While stopImmediatePropagation will prevent everyone listening for the event in the chain from receiving it.

So the code would be:

var parent_sprite:Sprite = new Sprite();
addChild(parent_sprite);
parent_sprite.addEventListener(MouseEvent.CLICK,
handle_mouse_click);


function handle_mouse_click(event:MouseEvent):void {
parent_sprite.removeEventListener(MouseEvent.CLICK,
handle_mouse_click);

var child_sprite:Sprite = new Sprite();
draw_button_using_child_sprite(); // Some func
// to draw a button

child_sprite.addEventListener(MouseEvent.CLICK,
handle_button_click);


parent_sprite.addChild(child_sprite);
}

function handle_button_click(event:MouseEvent):void {
do_my_stuff();
parent_sprite.removeChild(child_sprite);
parent_sprite.addEventListener(MouseEvent.CLICK,
handle_mouse_click);

event.stopPropagation(); // Prevent parent from
// receiving event

}

Got the information for this from:
http://www.kirupa.com/forum/showpost.php?p=1948149&postcount=202

Saturday, January 30, 2010

AS3: Using a String to access Object / Class properties and getDefinitionByName

Consider for example you have a wonderful asset library and have a great scheme of describing maps and such in XML. So you get a asset name from XML and now want to add it to stage.

Remember you can access a Object property like so:

import my_assets.graphics;

var grap:graphics = new graphics();

var my_prop:String = "wonderful_img_class"; /* Got from XML :p */

stage.addChild(new graph[my_prop]); /* Now you asset is displayed */

wonderful_img_class in this case could refer to a image you have included using the [Embed(source=)] tag.

I initially spent time trying to use getDefinitionByName and got hit by the "Error #1065: Variable is not defined" before realising I could just do the above.

From my initial googling getDefinitionByName seems pretty unflexible and hence useless.

However if you want to investigate getDefinitionByName this post seems most useful:

http://www.rozengain.com/blog/2009/08/21/getdefinitionbyname-referenceerror-and-the-frame-metadata-tag/

Tuesday, December 22, 2009

AS3: Embedding XML files

If you have a XML file called myfile.xml. Code to include this would be:

[Embed(source="mfile.xml", mimeType="application/octet-stream")]
[Bindable]
private var my_file:Class;

function some_func():void {
var my_xml:XML = XML(new my_file);
}


my_xml now contains valid XML. You can now access stuff it like normal XML variables.

Got this from the comments in this post: http://dispatchevent.org/roger/embed-almost-anything-in-your-swf/

Tuesday, November 10, 2009

AS3: Adding a Sprite as a child to a Flex Container for example a Canvas

From http://www.sebastiaanholtrop.com/archives/3 use:


import mx.core.*;

var my_canvas:Canvas = new Canvas();
var my_uic:UIComponent = new UIComponent();
var my_sprite:Sprite = new Sprite();

my_canvas.addChild(my_uic);
my_uic.addChild(my_sprite);

Sunday, November 8, 2009

Flex 3: Adding you custom component sources in the compiler

Rather then copying custom or external code libraries to your source, it is better to add it using mxmlc compiler option "--source-path=/your/path/here".

Thursday, November 5, 2009

AS3: Enabling scaling in AS3 for your games or movies

By default AS3 set scaling to NO_SCALE. If you want to override this so that your games or movies scale properly use:

stage.scaleMode = StageScaleMode.SHOW_ALL;
once your stage has been initialized.

Tuesday, October 27, 2009

AS3: Opening a window in the users browser

Use navigateToURL if you want to open a window in the users browser. For example:

 navigateToURL(new URLRequest("http://www.lazysquirrelgames.com"),  
"_blank");


Adobe documentation:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLRequest.html

Sunday, October 25, 2009

AS3: Customizing the preloader

By default Flash player displays a simple bar for loading progress. A little code snippet at http://www.flexdeveloper.eu/forums/actionscript-3-0/download-progress-bar-(downloadprogressbar)/ shows how to start modifying this initial screen. The code does not generate anything pretty but is a good start towards understanding what needs to be done.

The relevant adobe documents:
http://livedocs.adobe.com/flex/3/html/help.html?content=app_container_4.html
http://livedocs.adobe.com/flex/3/langref/mx/preloaders/DownloadProgressBar.html

Thursday, October 22, 2009

AS3: Latency aka delay in playing sound

Encountered a problem where I am trying to play short sounds in response to key presses and noticing a considerable delay. Googling for stuff other people seem to have encountered it. Need to test the swf on a windows box to see if what I am seeing is specific to my Linux box.

Some usefull threads on this:


http://stackoverflow.com/questions/227674?sort=oldest#sort-top

This thread indicates it may be specific to Pulseaudio: http://ubuntuforums.org/archive/index.php/t-1146361.html

No solution here but describes the problem well: http://forums.tigsource.com/index.php?topic=7927.0;wap2

EDIT: So tested this on windows XP, the lag still exist but is small enough that I can work around it.

Monday, October 12, 2009

Flex/AS3 :: Flash player debug version for Linux

Remember to use the debug flash player for Linux. There is a tarball on the adobe download page.

The standalone player is great for debugging and lets us leave our browsers flash player alone.

Thursday, October 8, 2009

AS3: Data binding is useful

Data binding is a useful and powerful concept. Its easy to do in Flex, AS3 is more complicated, the adobe docs help:

Adobe livedoc link.

Wednesday, October 7, 2009

AS3: Alpha for Sprite that has children

This one caught me out. I was wondering why I could not change the alpha of a bitmap that I had added as a child of a Sprite. Consider this code block:
var my_sprite:Sprite = new Sprite();

my_sprite.graphics.beginFill(0x000000);
my_sprite.graphics.lineStyle(1, 0x111111, 1, false,
"normal", null, null, 3);
my_sprite.graphics.drawRect(0, 0, 400, 500);
my_sprite.graphics.endFill();
my_sprite.alpha = 0.3; // This is not correct. Will affect all children

stage.addChild(my_sprite);

my_sprite.addChild(my_bitmap); // Some valid bitmap

my_bitmap.alpha = 1; // Does not work.
What I expected was that the sprite would be translucent and my bitmap would be solid. However I found the bitmap taking on the alpha of the sprite. The reason for that was I should not have been trying to change the Sprite's alpha rather I needed to use the alpha parameter of the beginFill call. So the correct code would be:
var my_sprite:Sprite = new Sprite();

my_sprite.graphics.beginFill(0x000000, 0.3); // Alpha of 0.3 for the fill
my_sprite.graphics.lineStyle(1, 0x111111, 1, false,
"normal", null, null, 3);
my_sprite.graphics.drawRect(0, 0, 400, 500);
my_sprite.graphics.endFill();

stage.addChild(my_sprite);

my_sprite.addChild(my_bitmap); // Some valid bitmap

my_bitmap.alpha = 1; // This will work now

Thursday, September 17, 2009

AS3: Getting/Keeping keyboard focus

If your application is losing keyboard focus, you can regain it by adding:

myobject.stage.focus = this;

More details in this discussion.