Showing posts with label ActionScript 3. Show all posts
Showing posts with label ActionScript 3. Show all posts

Jun 12, 2010

XML Serializer 1.0.3


Decided to simplify yet another step in my work process and make an app that automatically maps xml-data to a class in AS3, this was the result of that.


Features
  • Drag & Drop XML files directly onto application.
  • Analyzes data and suggests variable types.
  • Exclude unwanted nodes from serialization.
  • Generates .as class file for use in ActionScript 3 projects.
Coming feature
  • Specify entry level of parsing.
Download

May 9, 2010

Building classes with MXMLC

Since the recent post of the UTFCompressor, you might wonder what the hell it´s good for or, just how this will speed up the workprocess when exporting optimized fonts.

Ideally I would write an app that exports a flash font based on a font file directly. Bam you're done.

But then you would have no control over which glyphs are included, some Unicode fonts are extremely large (> 10 MB). This would then wreak havoc online if say you're doing an Asian website in flash, going about it coding in AS3. Every visitor has to load > 10 MB just to see the site.

You could just make shapes of all the texts on the website, but hey. Where's the fun in that?

Right now the AIR platform doesn't support execution of native processes, but that will soon change. For now you will have to make do with this short second phase of font generation.

The Flex SDK uses a binary to compile Actionscript 3. Senocular has a great tutorial on using this to compile your own swf:s.

http://www.senocular.com/flash/tutorials/as3withmxmlc/

1. Add your flexSDK/bin folder in the system path variable.

2. Make a .bat-file with contents similar to:

mxmlc %1 -output %1.swf -as3


3. In UTF Compressor there is this option

Use that to save a class and drop it onto your .bat-file. Now you should have a Flash font lying around somewhere.


If you don't have the Flex SDK, go ahead and download it here.

Go ahead and grab the UTF Compressor while you're at it.

Apr 14, 2010

Nice Url in AS3

Feeling generous today, here you go.
(Made to include nordic names)

public static function niceUrl(s:String):String
{
 s = s.toLowerCase();
 s = s.replace(/^\s+|\s+$/g, "");
 s = s.replace(/[_|\s]+/g, "-");
 s = s.replace(/[øöõóò]+/g, "o");
 s = s.replace(/[åäáàãâ]+/g, "a");
 s = s.replace(/[ëéèê]+/g, "e")
 s = s.replace(/[^a-z0-9-\/]+/g, "");
 s = s.replace(/[-]+/g, "-");
 s = s.replace(/^-+|-+$/g, "");

 return s;
}

Mar 17, 2010

Key.isDown(), where did you go?

Got a bit stumped when I realized that multi-keystroke handling was totally removed from AS3. The rabid game programmer in me worked up a little steam while it scurried about the internet looking for a solution. The alternative isn't acceptable, you can't make games without multiple buttons pressed at the same time.

Found a bunch of solutions to this problem, all of them over 100 lines in length. How hard can this problem be?

package Extrude.Utils 
{
 import flash.events.KeyboardEvent; 

 public class Keyhandler
 {
  protected static var _keys:Array = new Array(126);

  public static function onKeyDown(e:KeyboardEvent):void
  { _keys[e.keyCode] = true; }

  public static function onKeyUp(e:KeyboardEvent):void
  { _keys[e.keyCode] = false; }

  public static function isDown(key:uint):Boolean
  { return (_keys[key]); }
 }
}

Jun 18, 2009

Solving the wmode keyboard bug in Firefox (AS3)

The Firefox team has embarrasingly been saying (for years) that they are working on solving their problems with keyboard focus on embedded flash objects with wmode set to either 'transparent' or 'opaque'.

See details:
http://forum.sephiroth.it/showthread.php?t=9232
http://timconfessions.blogspot.com/2008/04/firefox-wmodetransparent-bug.html
http://lists.macosforge.org/pipermail/webkit-unassigned/2008-September/084474.html

The list goes on and hopes are low. There has been some dirty quickfixes circulating but I grew tired and wrote a more robust solution for AS3.

Embed the following in your class, assign it to your inputField and... enjoy.

Download Flex Project Archive

 0)? input.text.substring(input.selectionEndIndex, input.text.length) : "";

     // Enter the codes to change here
     // Below is Swedish keyboard
     switch (event.text)
     {
      case "2" : event.text = "@"; break;
      case "3" : event.text = "£"; break;
      case "4" : event.text = "$"; break;
      case "5" : event.text = "€"; break;
      case "6" : event.text = "6"; break;
      case "7" : event.text = "{"; break;
      case "8" : event.text = "["; break;
      case "9" : event.text = "]"; break;
      case "0" : event.text = "}"; break;
      case "+" : event.text = "\\"; break;
      case "<" : event.text = "|"; break;
      default : break;                     
     }

     input.text = startText + event.text + endText;
     input.setSelection(input.selectionBeginIndex + 1, input.selectionBeginIndex + 1);
    }
    catch (error:Error)
    {
     trace(error.getStackTrace());
    }
   }
  }
 }
}

Jun 8, 2009

Doing perspective in Adobe Flash the old way

This has been a problem for ages:



http://pixelfumes.blogspot.com/2006/01/flash-why-do-you-mock-me-bitmap.html

As a solution to this, some smart developer came up with a quick fix, and people seem to stick to it.

http://pixelfumes.blogspot.com/2006/01/perspective-distort-example.html

This solution maps a lot of triangles to a quad and uses bitmapFill to project the image onto the surface. As you can see it has some limitations, the borders become teared and the final results look so so.

I'm currently working on a wallpaper application for a company that sells.. well guess.

Since there's always version-limitations as to what you can expect from the visitors, we decided that flashplayer 9 was the target version for this application, but this version suffers from the aforementioned problems so we had to fix it somehow.



After looking at the results of the 'perspective distort script' I concluded that there was something awkwardly wrong with this way of drawing images. The code places the triangles in a linearly interpolated fashion which screws up any chance of actually drawing something close to a correct perspective.

(If you're into this kind of stuff, You've probably seen this bit of code before)
public function setTransform( x0:Number , y0:Number , x1:Number , y1:Number , x2:Number , y2:Number , x3:Number , y3:Number ):void
{
var w:Number = texture.width;
var h:Number = texture.height;

var dx30:Number = x3 - x0;
var dy30:Number = y3 - y0;
var dx21:Number = x2 - x1;
var dy21:Number = y2 - y1;

var l:Number = poly.length;

while( --l > -1 )
{
var point:Object = poly[ l ];

var gx:Number = (( point.x - _xMin ) / w);
var gy:Number = ( point.y - _yMin ) / h;

var bx:Number = x0 + gy * ( dx30 );
var by:Number = y0 + gy * ( dy30 );

point.sx = bx + gx * ( ( x1 + gy * ( dx21 ) ) - bx );
point.sy = by + gx * ( ( y1 + gy * ( dy21 ) ) - by );
}
render();
}
After some thinking I came up with a somewhat simple quick-fix to a wall specific problem. With a bit of tinkering you'll easily be able to add vertical correction too, if that floats your boat. Anyway... enjoy.
public function setTransform( x0:Number , y0:Number , x1:Number , y1:Number , x2:Number , y2:Number , x3:Number , y3:Number ):void
{
var w:Number = texture.width;
var h:Number = texture.height;

var dx30:Number = x3 - x0;
var dy30:Number = y3 - y0;
var dx21:Number = x2 - x1;
var dy21:Number = y2 - y1;

var l:Number = poly.length;

// Calculate the facing angle of the quad.
var dangle:Number = ((Math.atan2(dy30 - dy21, x2 - x0) * (180/Math.PI)) / 90);

while( --l > -1 )
{
var point:Object = poly[ l ];

var gx:Number = (( point.x - _xMin ) / w);
var gy:Number = ( point.y - _yMin ) / h;

// Quadraticly shift the triangles x-ward into the perspective depending on the facing angle
var gxshift:Number = (gx * (1 - Math.abs(dangle))) + (Math.pow(gx, 2) * Math.abs(dangle));

if (dangle > 0) gxb = 1 - gxb;

var bx:Number = x0 + gy * ( dx30 );
var by:Number = y0 + gy * ( dy30 );

// Apply the new coordinates
point.sx = bx + gxshift * ( ( x1 + gy * ( dx21 ) ) - bx );
point.sy = by + gxshift * ( ( y1 + gy * ( dy21 ) ) - by );
}
render();
}
During this project I also came across some creative ways to apply subtle sharpening to images in flash. Post a comment or something if you're interested.