By Zevan | January 2, 2009
Actionscript:
-
var centerX:Number=stage.stageWidth/2;
-
var centerY:Number=stage.stageHeight/2;
-
// 1 to 2 ratio
-
// try others 1 / 1.5 etc...
-
var theta:Number = Math.atan(1 / 2);
-
-
var cosX:Number=Math.cos(theta);
-
var sinX:Number=Math.sin(theta);
-
var pnt:Point = new Point();
-
-
function iso3D(x:Number, y:Number, z:Number):Point {
-
pnt.x = centerX + (x-z) * cosX;
-
pnt.y = centerY - (x+z) * sinX - y;
-
return pnt;
-
}
-
-
var p:Point = iso3D(0,0,0);
-
-
graphics.beginFill(0x000000);
-
graphics.drawCircle(p.x, p.y, 2);
-
-
// x axis positive
-
trace("x = red");
-
for (var i:int = 1; i<10; i++){
-
graphics.beginFill(0xFF0000);
-
p = iso3D(i*10, 0, 0);
-
graphics.drawCircle(p.x, p.y, 2);
-
}
-
-
// y axis positive
-
trace("y = green");
-
for (i= 1; i<10; i++){
-
graphics.beginFill(0x00FF00);
-
p = iso3D(0, i * 10, 0);
-
graphics.drawCircle(p.x, p.y, 2);
-
}
-
-
// z axis positive
-
trace("z = blue");
-
for (i= 1; i<10; i++){
-
graphics.beginFill(0x0000FF);
-
p = iso3D(0, 0, i * 10);
-
graphics.drawCircle(p.x, p.y, 2);
-
}
The above code demos a conversion from isometric coordinates to cartesian coordinates. It draws out part of the x, y and z axis using the iso3D() function.
I've always faked isometric conversion by just tweaking numbers. A few years ago I created some strange isometric engines (here's another example). The other day when I wrote the isometric voxels snippet I just created the iso3D() function with a little trial and error. As you'll see it's not exactly the same as the one here. This new conversion is the result of some googling. The updated conversion is pretty close to the one that I wrote for the voxel post, but has one less multiplication... and a clearer place to control the scale ratio ...
Also posted in 3D | Tagged actionscript, flash, isometric |
By Zevan | January 1, 2009
Actionscript:
-
var circle:Shape = Shape(addChild(new Shape()));
-
with(circle.graphics) beginFill(0x00000), drawCircle(0,0,10);
-
-
var point:Point = new Point();
-
var trans:Matrix = new Matrix();
-
trans.rotate(Math.PI);
-
trans.scale(.5, .5);
-
trans.tx = stage.stageWidth / 2;
-
trans.ty = stage.stageHeight / 2;
-
-
addEventListener(Event.ENTER_FRAME, onLoop);
-
-
function onLoop(evt:Event):void {
-
point.x = mouseX - trans.tx;
-
point.y = mouseY - trans.ty;
-
-
point = trans.transformPoint(point);
-
-
circle.x = point.x;
-
circle.y = point.y;
-
}
If you don't feel like rolling your own transformations Matrix.transformPoint() is a very powerful method. It simply applies the tranformations of a given matrix to a Point. The above example scales rotates and translates a point which is then used to position a circle Shape.
Matrix.transformPoint() is well suited for creating orbiting behavior:
Actionscript:
-
var circle:Shape = Shape(addChild(new Shape()));
-
with(circle.graphics) beginFill(0x00000), drawCircle(0,0,10);
-
-
var point:Point = new Point(100,0);
-
var trans:Matrix = new Matrix();
-
trans.rotate(.1);
-
trans.scale(.99,.99);
-
-
addEventListener(Event.ENTER_FRAME, onLoop);
-
-
function onLoop(evt:Event):void {
-
-
point = trans.transformPoint(point);
-
-
circle.x = point.x + stage.stageWidth / 2;
-
circle.y = point.y + stage.stageHeight / 2;
-
}
This code will cause the circle Shape to move in a spiral formation.
Also posted in motion | Tagged actionscript, flash, matrix |
By Zevan | December 19, 2008
Actionscript:
-
var file:FileReference = new FileReference();
-
-
stage.addEventListener(MouseEvent.CLICK, onClick);
-
-
function onClick(evt:MouseEvent):void {
-
file.save("some text. \nsome more text", "actionsnippet.txt");
-
}
This is possibly my favorite feature of flash 10. Save any kind of file to the users computer...
The first argument is for the data to put in the file, this can be a String, ByteArray or XML object. The second argument is the name of the file.
As a test I also created one that saved a BitmapData object as a jpeg. But it doesn't really fall into the category of snippet because it uses the Jpeg Encoder from adobe.
Posted in misc | Tagged actionscript, flash |