drawRect in actionscript3 - actionscript-3

var blockGraphics : Graphics = null;
blockGraphics.clear();
blockGraphics.beginFill(255);
blockGraphics.drawRect(10,10,10,10);
I am trying to simply draw a rectangle but nothing appears on the screen. What am i missing?

Afaik you can't instantiate graphics class..
you need to make a MovieClip or Sprite and work with that.. you can't draw directly to stage.
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xFF0000);
mc.graphics.drawRect(10,10,10,10);
mc.graphics.endFill();
also don't forget to add it to stage
addChild(mc);

var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x000000);
mySprite.graphics.drawRect(10, 10, 10, 10);
mySprite.graphics.endFill();
addChild(mySprite);

I don't really know a whole lot about the graphics class (I've used it a few times) but I don't believe you can call ANYTHING on a null object.
blockGraphics = null;
blockGraphics.clear();
is the same as calling:
null.clear();
Which is going to give you an error. Typically you'll want to take a movieclip or other such object and get it's graphics instance:
blockGraphics = mc.graphics;
blockGraphics.clear();
blockGraphics.beginFill(0xFF0000);
blockGraphics.drawRect(10,10,10,10);
would draw a red rectangle inside the "mc" movieclip.

Related

How to convert MovieClip into bitmapData

My question is quite simple -
How do I convert a MovieClip (that is dragged from the library) into bitmapData?
PS: I`ve searched a bit for this solution but the only results i get is the other way around - to convert bitmapData into MC/Sprite/bitmap
You need to make sure the MovieClip on stage has an instance name and then you can do the following:
var bitmapData:BitmapData = new BitmapData(myMovieClip.width, myMovieClip.height);
bitmapData.draw(myMovieClip);
// And to actually see it
var bitmap:Bitmap = new Bitmap(bitmapData);
this.addChild(bitmap);

Changing images dynamically from a Sprite?

I have been looking for this answer for days now and no matter how much I look I can't find it for the life of me.
I understand that you can change a bitmap's image easily with something like this:
var image = new Bitmap (Assets.getBitmapData ("image.png"));
// (and later)
image.bitmapData = Assets.getBitmapData ("another-image.png");
but bitmap doesn't support mouse events. Let's say I want to change an image when someone clicks on it, thus I need it to be a sprite. Is there an easy way to just change the image of a sprite? Thanks in advance for any help!
Sure. You can do it one of two ways.
You create a custom class for this and add the bitmap as a public property
You add the bitmap to the Sprite and access it through there. See:
.
var bitmap:Bitmap = new Bitmap();
var container:Sprite = new Sprite();
this.addChild( this.container );
this.container.addChild( this.bitmap );
// to change the bitmap
this.bitmap.bitmapData = new BitmapData();
// or
var bmp:Bitmap = this.container.getChildAt( 0 ) as Bitmap;
bmp.bitmapData = new BitmapData();
The second option assumes the bitmap is the only object in the sprite. If you add more objects to the sprite, you may have to tweak the index accordingly.

Greensock ImageLoader load image as bitmap not create movieclip

I have use greensock imageloader for sometimes (It's a great plug-in so easy to use and i love it), just wondering is there a way you can load bitmap which doesn't create a movieclip inside the container? I couldn't find this solution in the API
http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html
does anyone have any experience?
Cheers
Bill
According to the docs:
The ImageLoader's content refers to a ContentDisplay (Sprite) that is created immediately so that you can position/scale/rotate it or add ROLL_OVER/ROLL_OUT/CLICK listeners before (or while) the image loads. Use the ImageLoader's content property to get the ContentDisplay Sprite, or use the rawContent property to get the actual Bitmap. If a container is defined in the vars object, the ContentDisplay will immediately be added to that container).
So they are saying you don't have to supply a container in the vars object. If you just want to get the bitmap then it says you can use the rawContent property.
Try something like this:
//create an ImageLoader:
var loader:ImageLoader = new ImageLoader("your_image.jpg", {name:"image",
x:0, y:0, width:200, height:200, onComplete:onImageLoad});
//begin loading
loader.load();
//see if we have a bitmap
function onImageLoad(event:LoaderEvent):void {
trace(event.target.rawContent);
}
Although you say that you like this, loading a bitmap is trivial in AS3 without a library:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("your_image.png"));
function onComplete (event:Event):void
{
// get your loaded bitmap
var bmp:Bitmap = Bitmap(LoaderInfo(event.target).content);
}

Create a MovieClip out of another object

In my Actionscript program, I draw a polygon using the methods:
this.graphics.moveTo()
and
this.graphics.lineTo()
In the update function of the polygon model I change it a bit, and then draw it all over again. Eventually, every call to the update() function draws the updated polygon and I can see it changes.
On some point of the program, I want to be able to use this polygon as a movieclip, so I
can attach a mask to it - so as the polygon drawn over and over again, I could see a nice
background in the form of that polygon, fills it inside.
Problem is - I do not know how to take this array of points I have, which is my polygon representation, and turn it into a movieclip ( if possible at all... )
If you have any other recommendations how to implement the above, It would be great.
You can just create a new MovieClip and use it's graphics for drawing. So instead of using this.graphics.moveTo / lineTo, try this:
var mc:MovieClip = new MovieClip();
mc.graphics.moveTo(...);
mc.graphics.lineTo(...);
this.addChild(mc);
A convenient way of drawing, if you want to type less, is to do something like this:
var mc:MovieClip = new MovieClip();
with(mc.graphics) {
clear();
lineStyle(...);
moveTo(...);
lineTo(...);
...
ect.
}
this.addChild(mc);
I suggest you take a look at Point class. For example,
var p1:Point = new Point(100,150);
Then you can have an array of points
var arrPoints:Array = new Array(p1,p2,p3);
With a for loop, you can decide if i==0 you use moveTo and for the rest use lineTo. You can have a special condition at the end to close your polygon, i==arrPoints.length-1.
So, basically create a movieclip object, use its graphic property to fill it with the points you defined in your array. As long as your points are in a movieclip, you can mask it. Finally, that "this" notation you used is probably referring to the main movieclip which is the stage.
var mc:MovieClip = new MovieClip();
mc.graphics.moveTo(p1.x,p1.y);
will draw your graphics into your mc.

convert masked movieclip into bitmap and save it on server

i have a
dsgnArea----> a movieclip
dsgnArea is masked by dsgnAreaMask, which inturn is a movieclip
dsgnArea.mask=dsgnAreaMask;
the width,height and position of dsgnAreaMask and dsgnArea are same.
i dynamically added multiple movieclips and labels to dsgnArea;
like..
dsgnArea.addChild(movieClip1);
dsgnArea.addChild(movieClip2);
dsgnArea.addChild(label1);
dsgnArea.addChild(label2); and so on...
these movieclips (movieClip1,movieClip2,......) and labels(label1,label2,....) positions can be altered in runtime..
but as i masked the dsgnArea with dsgnAreaMask, only a portion of the added movieClips and labels are visible...
So, my problem is to grab that visible portion in dsgnArea into a bitmap,like a screenshot of that particular dsgnArea, and save it in my server.
please help me out in this problem.
Say s is the DisplayObject object you want to capture and m is the mask applied on it.
var maskRect:Rectangle = m.getRect(s);
var matrix:Matrix = new Matrix(1, 0, 0, 1, -maskRect.x, -maskRect.y);
var w:Number = Math.min(s.width, maskRect.right) - maskRect.x;
var h:Number = Math.min(s.height, maskRect.bottom) - maskRect.y;
var bd:BitmapData = new BitmapData(w, h);
bd.draw(s, matrix);
Does that work?
The BitmapData draw method is what you are looking for. You can use it's clipRect param to define what you would like to draw (the masked parts).
Quasimondo did a handy little method to do this (take a snapshot of the whole displayObject), it's available here: http://www.quasimondo.com/archives/000670.php
I don't know if it works with masked content though.
if it doesn't, the trick would be to translate the whole content by the size of the mask
var bounds:Rectangle = dsgnAreaMask.getBounds( dsgnAreaMask );
instead of using the content of the clip
var bounds:Rectangle = clip.getBounds( clip );
as far as saving file to server is concerned, the question was asked (answered?) here AS3 Save Media File to server