AS3 Show and hide movieclip/image when button/mc is clicked - actionscript-3

I want to make something like this http://www.bakedbymelissa.com/checkout/CustomizerCreator.aspx
for now I have squares(square1,square2,square3,square4) as cupcakes and circles(circle1,circle2,circle3,circle4) as the buttons. If I click circle1, square1 should appear and so on. The AS has a separate layer and the shapes are all in one layer. I placed the squares on top of each other but the problem is, when I click the buttons, the square shows up but it can't really be seen cuz it's beneath the square on top of it. How do you do it so that the corresponding square appears and the previous square that appeared, disappears? Any alternatives that you know that does the trick is fine.
my stage looks like this
AS3:
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.*;
var fadeIn:Tween;
var thisCircle:MovieClip;
var thisSquare:MovieClip;
var circles:Array = new Array(circle1,circle2,circle3,circle4);
var squares:Array = new Array(square1,square2,square3,square4);
for(var i:Number = 0; i < circles.length; i++)
{
thisCircle = circles[i];
thisCircle.buttonMode = true;
thisCircle.id = i;
thisCircle.addEventListener(MouseEvent.CLICK, doFadeIn);
thisSquare = squares[i];
thisSquare.alpha = 0;
}
function doFadeIn(e:MouseEvent):void
{
e.currentTarget.mouseEnabled = false;
trace(e.currentTarget.name + " is disabled while " + squares[e.currentTarget.id].name + " tweens in.");
fadeIn = new Tween(squares[e.currentTarget.id],"alpha",None.easeNone,0,1,2.5,true);
fadeIn.addEventListener(TweenEvent.MOTION_FINISH,enableButton(e.currentTarget));
}
function enableButton(thisButton:Object):Function
{
return function(e:TweenEvent):void
{
thisButton.mouseEnabled = true;
trace(e.target.obj.name + " has finished fading in, "+ thisButton.name + " is now enabled again.");
};
}
//credits to fruitbeard for the code.

I think that in your code you have forgot to fade out the current square and then fade in the new one.
Take a look on this code :
// to indicate the index of current active circle/square
var current:int = 0;
var fadeIn:Tween, fadeOut:Tween;
var thisCircle:MovieClip;
var thisSquare:MovieClip;
var circles:Array = new Array(circle1, circle2, circle3, circle4);
var squares:Array = new Array(square1, square2, square3, square4);
for(var i:Number = 0; i < circles.length; i++)
{
thisCircle = circles[i];
thisCircle.buttonMode = true;
thisCircle.id = i;
thisCircle.addEventListener(MouseEvent.CLICK, doFadeIn);
// keep the first square as visible
if(i != current){
thisSquare = squares[i];
thisSquare.alpha = 0;
}
}
function doFadeIn(e:MouseEvent):void
{
// if our button is the active one, exit
if(current == e.currentTarget.id) return;
// fade out current square
fadeOut = new Tween(squares[current], "alpha", None.easeNone, 1, 0, 2.5, true);
// fade in the new active square
fadeIn = new Tween(squares[e.currentTarget.id], "alpha", None.easeNone, 0, 1, 2.5, true);
current = e.currentTarget.id;
}
You can see this code working here.
I hope this can help you.

Related

RemoveChild on Button Click

I'm currently trying to remove a graphic 'lose_mc' that i added to the scene using addChild.
When trying to use removeChild when the user clicks the next level_btn, this error appears:
TypeError: Error #2007: Parameter listener must be non-null.
at flash.events::EventDispatcher/removeEventListener()
at Function/<anonymous>()
Any one has any ideas of why this isn't working? This is my code at the minute.
**
import flash.net.URLRequest;
import flash.display.MovieClip;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.Event;
import flash.display.Loader;
stop();
//stage.removeEventListener(Event.ENTER_FRAME, nextButtonClick);
var hitObstacle:Boolean=false;
var points=2; //The points will be set at 2
points_txt.text=points.toString(); //Health will be displayed in points_txt box
var lose_mc = new lose();
var win_mc = new win();
//crowhit_mc.visible=false;
var loader:Loader = new Loader()
addChild(loader);
//var url:URLRequest = new URLRequest("test.swf");
//var lose_mc = new lose();
//var win_mc = new win();
//var hitObstacle:Boolean=false;
var leafArray:Array = new Array(leaf01,leaf02,leaf03);
var leafsOnstage:Array = new Array();
var leafsCollected:int = 0;
var leafsLost:int = 0;
for (var i:int = 0; i<20; i++) {
var pickLeaf = leafArray[int(Math.random() * leafArray.length)];
var leaf:MovieClip = new pickLeaf();
addChild(leaf);
leaf.x = Math.random() * stage.stageWidth-leaf.width;// fruit.width is subtracted from the random x position to elimate the slight possibility that a clip will be placed offstage on the right.
leaf.y = Math.random() * -500;
leaf.speed = Math.random() * 15 + 5;
leafsOnstage.push(leaf);
}
basket_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragBasket);
stage.addEventListener(MouseEvent.MOUSE_UP, dragStop);
function dragBasket(e:Event):void {
basket_mc.startDrag();
}
function dragStop(e:Event):void {
basket_mc.stopDrag();
}
stage.addEventListener(Event.ENTER_FRAME, catchLeaf);
function catchLeaf(e:Event):void {
for (var i:int = leafsOnstage.length-1; i > -1; i--) {
var currentLeaf:MovieClip = leafsOnstage[i];
currentLeaf.y += currentLeaf.speed;
if (currentLeaf.y > stage.stageHeight - currentLeaf.height) {
currentLeaf.y = 0 - currentLeaf.height;
leafsLost++;
field2_txt.text = "Total Leaves Lost: " + leafsLost;
}
if (currentLeaf.hitTestObject(basket_mc)) {
leafsCollected++;
removeChild(currentLeaf);
leafsOnstage.splice(i,1);
field1_txt.text = "Total Leaves Collected: " + leafsCollected;
if (leafsCollected >= 20) {
basket_mc.gotoAndStop(20);
} else if (leafsCollected > 15) {
basket_mc.gotoAndStop(15);
} else if (leafsCollected>10) {
basket_mc.gotoAndStop(10);
} else if (leafsCollected>5) {
basket_mc.gotoAndStop(5);
}
}
}
if (leafsOnstage.length <= 0) {
field1_txt.text = "You Win! You have collected enough leaves for the day.";
nextlevel_btn.addEventListener(Event.ENTER_FRAME, fl_FadeSymbolINwin);
nextlevel_btn.alpha = 0;
function fl_FadeSymbolINwin(event:Event)
{
nextlevel_btn.alpha += 0.01;
if(nextlevel_btn.alpha >= 1)
{
nextlevel_btn.removeEventListener(Event.ENTER_FRAME, fl_FadeSymbolIn);
}
}
field2_txt.text = "";
stage.removeEventListener(Event.ENTER_FRAME, catchLeaf);
var win_mc = new win();
win_mc.x = 215.70;
win_mc.y = 163.25;
win_mc.w = 100;
win_mc.h = 145;
addChild(win_mc);
removeChild(crow_mc);
}
if (leafsLost >= 20) {
field1_txt.text = "Sorry you lose. You have lost too many leaves!";
restart_btn.addEventListener(Event.ENTER_FRAME, fl_FadeSymbolIn);
restart_btn.alpha = 0;
function fl_FadeSymbolIn(event:Event)
{
restart_btn.alpha += 0.01;
if(restart_btn.alpha >= 1)
{
restart_btn.removeEventListener(Event.ENTER_FRAME, fl_FadeSymbolIn);
}
}
field2_txt.text = "";
stage.removeEventListener(Event.ENTER_FRAME, catchLeaf);
for (var j:int = leafsOnstage.length-1; j > -1; j--) {
currentLeaf = leafsOnstage[j];
removeChild(currentLeaf);
leafsOnstage.splice(j,1);
lose_mc.x = 215.70;
lose_mc.y = 163.25;
lose_mc.w = 100;
lose_mc.h = 145;
addChild(lose_mc); //this is the movieclip in my library im adding it to the screen
}
}
}
//nextlevel_btn.addEventListener(MouseEvent.CLICK, nextButtonClick);
/*restart_btn.addEventListener(MouseEvent.CLICK, buttonClick)
function buttonClick(e:MouseEvent):void
{
try{
loader_mc.unloadAndStop();
} catch(e:Error) {
}
var urlRequest : URLRequest = new URLRequest("test.swf");
loader_mc.load(urlRequest);
removeChild(win_mc);
}
//function nextButtonClick(e:MouseEvent):void{
//removeChild(win_mc);
//loader.unloadAndStop();
//var request:URLRequest = new URLRequest("test.swf");
//loader.load(request);
crow_mc.addEventListener(MouseEvent.CLICK,rotateCrow);
function rotateCrow(e:MouseEvent):void {
crow_mc.rotation +=10;
var myTween:Tween = new Tween(crow_mc, "alpha", Strong.easeOut, 1,10,25, true);
}
*/
var crow_mcSpeedX:int = -6;
var crow_mcSpeedY:int = 2;
stage.addEventListener(Event.ENTER_FRAME, loop);
function loop(evt:Event) {
crow_mc.x += crow_mcSpeedX;
crow_mc.y += crow_mcSpeedY;
//because the ball's position is measured by where its CENTER is...
//...we need add or subtract half of its width or height to see if that SIDE is hitting a wall
//first check the left and right boundaries
if(crow_mc.x <= crow_mc.width/2){ //check if the x position of the left side of the ball is less than or equal to the left side of the screen, which would be 0
crow_mc.x = crow_mc.width/2; //then set the ball's x position to that point, in case it already moved off the screen
crow_mcSpeedX *= -1; //and multiply the ball's x speed by -1, which will make it move right instead of left
} else if(crow_mc.x >= stage.stageWidth-crow_mc.width/2){ //check to see the right side of the ball is touching the right boundary, which would be 550
crow_mc.x = stage.stageWidth-crow_mc.width/2; //reposition it, just in case
crow_mcSpeedX *= -1; //multiply the x speed by -1 (now moving left, not right)
}
//now we do the same with the top and bottom of the screen
if(crow_mc.y <= crow_mc.height/2){ //if the y position of the top of the ball is less than or equal to the top of the screen
crow_mc.y = crow_mc.height/2; //like we did before, set it to that y position...
crow_mcSpeedY *= -1; //...and reverse its y speed so that it is now going down instead of up
} else if(crow_mc.y >= stage.stageHeight-crow_mc.height/2){ //if the bottom of the ball is lower than the bottom of the screen
crow_mc.y = stage.stageHeight-crow_mc.height/2; //reposition it
crow_mcSpeedY *= -1; //and reverse its y speed so that it is moving up now
}
//}
//points--; //Health is decreased by 1 each time a trap_mc is clicked
//points_txt.text=points.toString();
//lose_mc.visible=true;
if (basket_mc.hitTestObject(crow_mc)) { //If the player_mc hits the sharkfin_mc
if (hitObstacle==false){ //Only subtract health if hitObstacle is false
trace("Hit Object")
//crow_mc.visible=false; //crow_mc becomes invisible
//removeChild(leaf);
//leafsOnstage.visable = false;
//lose_mc.x = 215.70;
//lose_mc.y = 163.25;
//lose_mc.w = 100;
//addChild(lose_mc);
points--; //Points are decreased by 1 each time crow_mc is hit - hittestobject()
points_txt.text=points.toString();
}
hitObstacle=true;
}
}
restart_btn.addEventListener(MouseEvent.CLICK, backButtonClick);
function backButtonClick(e:MouseEvent):void{
removeChild(lose_mc);
loader.unloadAndStop();
var request:URLRequest = new URLRequest("test.swf");
loader.load(request);
}
nextlevel_btn.addEventListener(MouseEvent.CLICK, nextButtonClick);
function nextButtonClick(e:MouseEvent):void{
loader.unloadAndStop();
var request:URLRequest = new URLRequest("snowflake.swf");
loader.load(request);
}
**
This is the area of code that is causing the problem..
**
nextlevel_btn.addEventListener(MouseEvent.CLICK, nextButtonClick);
function nextButtonClick(e:MouseEvent):void{
removeChild(win_mc);
loader.unloadAndStop();
var request:URLRequest = new URLRequest("snowflake.swf");
loader.load(request);
}
**
That is not the area causing the problem because Flash clearly says:
TypeError: Error #2007: Parameter listener must be non-null.
at flash.events::EventDispatcher/removeEventListener()
at Function/<anonymous>()
As we can see, the error is happening in removeEventListener.
removeEventListener takes two parameters: event and listener.
What we can also see, Flash says: parameter listener must be non-null.
That means that parameter listener passed to removeEventListener is null.
The part of your code that may cause the error is the following:
if (leafsOnstage.length <= 0) {
field1_txt.text = "You Win! You have collected enough leaves for the day.";
nextlevel_btn.addEventListener(Event.ENTER_FRAME, fl_FadeSymbolINwin);
nextlevel_btn.alpha = 0;
function fl_FadeSymbolINwin(event:Event)
{
nextlevel_btn.alpha += 0.01;
if(nextlevel_btn.alpha >= 1)
{
nextlevel_btn.removeEventListener(Event.ENTER_FRAME, fl_FadeSymbolIn);
}
}
First, you are adding listener fl_FadeSymbolINwin, but you remove a different listener fl_FadeSymbolIn. Second, for some reason you are declaring a function inside an if block. What you need to do is to get your code formatting right and check where and how you do removeEventListener's with what parameters. Trace them if needed.
Also I suggest using TweenLite (or even TweenNano) for fade effects. You won't have to mess with all these EventListeners. Your code for fading button would look as simple as this:
TweenNano.to(nextlevel_btn, 0.5, {alpha:1});

ScrollPane and ScrollBar not working

I have an application I'm trying to build where it will display a large map image (1920x1040 which is set as the base layer of frame one, then all my AS is on the layer above on the first frame too), then draw lines to it by reading in their coordinates from an external file (lines.txt) and associate a particular image with each line.
When a user clicks on a line, a ScrollPane should open, showing the image associated with the line they clicked on. These images are 1040 in height, and at least 4000px wide, so I want the image to fill the screen height, and then allow the user to use a scroll bar along the bottom to scroll left and right to see the full image.
Right now, I have it working where it reads in my lines.txt file, and draws the lines correctly. Then when I click on a line, it will load the corresponding image in the ScrollPane (along with a button to click that will remove the scroll pane and allow them to select a new line).
However, I can't get a horizontal scroll bar to work. I have it so that the space shows up at the bottom where a scroll bar should be, but there's no bar to drag left/right, and no way to scroll around.
I saw that it's possible to use dragging to scroll, which would be nice, but that hasn't worked either (it' now commented out), and when I have it turned on, when I click my Back Button and attempt to click another line, it throws an error saying,
"TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::ScrollPane/endDrag()"
Anybody able to help me clean this up and get it figured out what's going wrong here?
My code:
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.geom.ColorTransform;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import fl.containers.ScrollPane;
import fl.events.ScrollEvent;
import fl.controls.ScrollPolicy;
import fl.controls.DataGrid;
import fl.data.DataProvider;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLLoader;
import fl.controls.UIScrollBar;
import flash.events.Event;
import fl.controls.ScrollBar;
var worldLines:Array = new Array();
var lineSprites:Array = new Array();
var lineSpritesLength:int;
var basicColorTransform:ColorTransform = new ColorTransform();
basicColorTransform.color = 0x00FF00;
var hoverColorTransform:ColorTransform = new ColorTransform();
hoverColorTransform.color = 0xFFFF00;
populateWorldLines();
function populateWorldLines():void
{
var textFile:File = File.applicationDirectory.resolvePath("lines.txt");
var fileContents:String = getFileData(textFile);
var contentsLength:int = fileContents.split("$").length;
for(var i:int = 0; i < contentsLength; i++)
{
trace(i);
worldLines[i] = new Object();
worldLines[i]["x1"] = fileContents.slice(0, fileContents.indexOf(","));
fileContents = fileContents.slice(fileContents.indexOf(",") + 1, fileContents.length);
worldLines[i]["y1"] = fileContents.slice(0, fileContents.indexOf(","));
fileContents = fileContents.slice(fileContents.indexOf(",") + 1, fileContents.length);
worldLines[i]["x2"] = fileContents.slice(0, fileContents.indexOf(","));
fileContents = fileContents.slice(fileContents.indexOf(",") + 1, fileContents.length);
worldLines[i]["y2"] = fileContents.slice(0, fileContents.indexOf(","));
fileContents = fileContents.slice(fileContents.indexOf(",") + 1, fileContents.length);
worldLines[i]["image"] = fileContents.slice(0, fileContents.indexOf(";"));
fileContents = fileContents.slice(fileContents.indexOf("$") + 1, fileContents.length);
}
drawLines(worldLines);
}
function drawLines(lines:Array):void
{
for(var i:int = 0; i < lines.length; i++)
{
var line:Sprite = new Sprite;
line.graphics.moveTo(lines[i]["x1"], lines[i]["y1"]);
line.graphics.lineStyle(3, basicColorTransform.color);
line.graphics.lineTo(lines[i]["x2"], lines[i]["y2"]);
lineSprites.push(line);
addChild(line);
}
lineSpritesLength = lineSprites.length;
this.addEventListener(MouseEvent.MOUSE_OVER, checkLines);
}
function checkLines(e:MouseEvent):void
{
var targetSprite:* = e.target;
for(var i:int = 0; i < lineSpritesLength; i++)
{
if(targetSprite == lineSprites[i])
{
targetSprite.transform.colorTransform = hoverColorTransform;
targetSprite.addEventListener(MouseEvent.CLICK, lineClicked);
targetSprite.addEventListener(MouseEvent.MOUSE_OUT, resetColorTransform);
}
}
}
function lineClicked(e:MouseEvent):void
{
var targetSprite:* = e.target;
for(var i:int = 0; i < lineSpritesLength; i++)
{
if(targetSprite == lineSprites[i])
{
showImage(worldLines[i]["x1"], worldLines[i]["y1"], worldLines[i]["image"]);
}
}
//e.target.removeEventListener(e.type, lineClicked);
}
function showImage(xPos:int, yPos:int, imageName:String):void
{
var aSp:ScrollPane = new ScrollPane();
var aBox:MovieClip = new MovieClip();
drawBox(aBox, imageName);
aSp.source = aBox;
aSp.setSize(1920, 1040);
aSp.move(0, 0);
aSp.name = "scrollyPaneThing";
//aSp.scrollDrag = true;
aSp.horizontalScrollPolicy=ScrollPolicy.ON;
aSp.addEventListener(ScrollEvent.SCROLL, scrollListener);
addChild(aSp);
}
function scrollListener(event:ScrollEvent):void {
var mySP:ScrollPane = event.currentTarget as ScrollPane;
trace("scrolling");
trace("\t" + "direction:", event.direction);
trace("\t" + "position:", event.position);
trace("\t" + "horizontalScrollPosition:", mySP.horizontalScrollPosition, "of", mySP.maxHorizontalScrollPosition);
trace("\t" + "verticalScrollPosition:", mySP.verticalScrollPosition, "of", mySP.maxVerticalScrollPosition);
};
function drawBox(box:MovieClip,imageName:String):void {
trace(imageName + ":imageName");
var file:File = File.applicationDirectory.resolvePath("dataImages/"+imageName);
var imageLoader:Loader = new Loader();
var image:URLRequest = new URLRequest(file.url);
imageLoader.load(image);
imageLoader.x = 1;
imageLoader.y = 1;
box.addChild (imageLoader);
trace("backButton.png:imageName");
var file2:File = File.applicationDirectory.resolvePath("backButton.png");
var imageLoader2:Loader = new Loader();
var image2:URLRequest = new URLRequest(file2.url);
imageLoader2.load(image2);
imageLoader2.x = 10;
imageLoader2.y = 950;
box.addChild (imageLoader2);
imageLoader2.addEventListener(MouseEvent.CLICK, removeScrollyPaneThing);
}
function removeScrollyPaneThing(MouseEvent):void
{
removeChild(getChildByName("scrollyPaneThing"));
}
function resetColorTransform(e:MouseEvent):void
{
e.target.transform.colorTransform = basicColorTransform;
e.target.removeEventListener(e.type, resetColorTransform);
}
function getFileData(file:File):String
{
var fDataStream:FileStream;
var sContent:String;
fDataStream = new FileStream();
fDataStream.open(file, FileMode.READ);
sContent = fDataStream.readUTFBytes(fDataStream.bytesAvailable);
fDataStream.close();
return sContent;
}
Your Loader Object has a scrollRect property that is built in.
It is MUCH easier to use a simple ScrollBar than a ScrollPane,
but mouse dragging is much cleaner:
see: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#scrollRect
To mouse drag:
private var scrollyThingy:Rectangle;
private var map:Loader;
// holders for the location of the view
//(to allow for cancelling the drag):
private var _cx:int = 0;
private var _cy:int = 0;
private var downpoint:Point = null;
public function init():void{
// Load your image:
/* I prefer to use embeded png files
or draw simple line images, but
Loader objects also have a scrollRect property
From this point I will assume your main image ('map') is loaded,
and 'scrollyThingy' is the part you want diplayed
I could not follow the code once you added the
loader to the stage very well...
*/
// to enable mouse dragging:
map.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
var w:int = 100;
var h:int = 100;
scrollyThingy = new Rectangle(_cx, _cy, w, h);
map.scrollRect = scrollyThingy;
AddChild(map);
}
private function onMouseDown(event:MouseEvent):void{
_downpoint = new Point(event.stageX, event.stageY);
map.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
map.addEventListener(MouseEvent.MOUSE_DRAG, onMouseDrag);
map.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
map.addEventListener(MouseEvent.RELEASE_OUTSIDE , onReleaseOutside);
}
private function onMouseDrag(event:MouseEvent):void{
if (_downpoint == null)
return;
// the movement delta:
_dx = int((event.stageX - _downpoint.x));
_dy = int((event.stageY - _downpoint.y));
// (if the movement is backwards, use scrollyThingy.x -= _dx)
scrollyThingy.x += _dx;
scrollyThingy.y += _dy;
Loader.scrollRect = scrollyThingy;
}
private function onMouseUp(event:MouseEvent):void{
if (_downpoint == null)
return;
// new corner coords
_cx += int((event.stageX - _downpoint.x));
_cy += int((event.stageY - _downpoint.y));
resetListeners();
}
private function onReleaseOutside(event:MouseEvent):void{
// put it back where it was
resetListeners();
}
private function resetListeners():void{
scrollyThingy.x = _cx;
scrollyThingy.y = _cy;
Loader.scrollRect = scrollyThingy;
_downpoint = null;
if(!map.hasEventListener(MouseEvent.MOUSE_DOWN)
map.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
//(if it has one, it has them all!)
if(map.hasEventListener(MouseEvent.MOUSE_DRAG){
map.removeEventListener(MouseEvent.MOUSE_DRAG, onMouseDrag);
map.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
map.removeEventListener(MouseEvent.RELEASE_OUTSIDE , onReleaseOutside);
}
}
if you still want a ScrollBar, just scale it to your Loader dimensions less the
size of the viewport (xScrollBar.maximum = loader.content.width - scrollyThingy.width,
yScrollbar.maximum = loader.content.height - scrollyThingy.height) then you can use the
same listener for both bars:
function onScrollBarChange(e:event):void{
scrollyThingy.x = xScrollBar.value;
scrollyThingy.y = yScrollBar.value;
}
listen for a change Event and set the Loader.scrollRect.x and Loader.scrollRect.y
properties to the scrollBarx.value & scrollBary.value.
Note also that I did not include any value checking.
You should check the values before moving the scrollRect
to avoid rangeErrors
i.e. if (_cx > loader.width - loader.scrollRect.width)
_cx = Loader.width - Loader.scrollRect.width;

Actionscript, set objects invisible

This is a script for when i click an object, it opens a small book with some page flip effect.
I'm done with almost everything but i want that when i click in a back button everything desapears and i go back to only seeing the original object. It is not working because its only deleting one of the pages! I tried doing an array but it didnt work either and Im not very good with arrays too. Can anyone help?
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.display.Sprite;
import flash.display.Loader;
var cont : DisplayObject;
var cont2 : DisplayObject;
var imgLoader : Loader;
//loads pages
for (var i:int=0; i<=4; i++){
imgLoader = new Loader();
imgLoader.contentLoaderInfo.addEventListener(Event.INIT, onLoadJPEG);
imgLoader.load(new URLRequest(""+i+".png"));
}
var imgLoader2 : Loader;
//loads back button
imgLoader2 = new Loader();
imgLoader2.contentLoaderInfo.addEventListener(Event.INIT, onLoadSketch);
imgLoader2.load(new URLRequest("voltaatrassketchbook.png"));
function onLoadJPEG (e : Event) : void {
cont = e.target.loader;
cont.x =250;
cont.y =50;
cont.width = (445-100)/2;
cont.height = (604-100)/2;
addChild(cont);
cont.addEventListener(MouseEvent.MOUSE_UP, FlipPage);
}
function onLoadSketch (e : Event) : void {
cont2 = e.target.loader;
cont2.x =450;
cont2.y =300;
cont2.width = 181/2;
cont2.height = 127/2;
addChild(cont2);
cont2.addEventListener(MouseEvent.MOUSE_UP, volta);
}
function FlipPage(e:MouseEvent):void{
setChildIndex(DisplayObject(e.currentTarget), this.numChildren - 1);
if (e.currentTarget.rotationY == 0) {
var myTween:Tween = new Tween(e.currentTarget, "rotationY",
Regular.easeInOut,0, 180, 1, true);
}
if (e.currentTarget.rotationY == 180) {
var myTween:Tween = new Tween(e.currentTarget, "rotationY",
Regular.easeInOut, 180, 0, 1, true);
}
}
//function to go back
function volta (e: MouseEvent): void {
gotoAndStop(1);
cont.visible=false;
cont2.visible=false;
}
Option 1
You are right that you could use an array. Put this at the top of your code, before you start loading the pages:
var pages:Array = [];
Then put this as the final line inside onLoadJPEG()
pages.push(cont);
That will add each image to the array when it is loaded.
Then in volta() you can loop through the array and make each image invisible
for(var i:int = 0; i < pages.length; i++) {
DisplayObject(pages[i]).visible = false;
}
Option 2
Another approach would be to add all the images to a container Sprite and then all you would have to do is make the container Sprite invisible.
Add this to the top of your code before you load the pages :
var pages:Sprite = new Sprite();
addChild(pages);
Then in onLoadJPEG() add cont as a child of the container
pages.addChild(cont);
Then in volta() :
pages.visible = false;
If you use this approach, don't forget to call setChildIndex() on the container inside of FlipPage() :
pages.setChildIndex(DisplayObject(e.currentTarget), this.numChildren - 1);

Adding Event Listeners to Buttons

I am new to Actionscript and I am creating a simple addition game where the player will click on numbers 1 through 9 on the bottom of the screen to solve an addition problem. Should I create individual buttons or movieclips on the bottom?
How do I add event listeners to the buttons/movieclips to be able to tell if the player clicked the second button as opposed to other buttons on the screen. Thank you!
Pretty similar to Ronnie's solution (I was almost finished this so had to post) and it is tested:
import flash.display.MovieClip;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.events.MouseEvent;
import flash.text.TextFormat;
var buttonCount = 9;
var buttonSize = 50;
var button:MovieClip;
var label:TextField;
for (var i:int = 0; i < buttonCount; i ++)
{
// Create a new MovieClip
button = new MovieClip();
// We'll use this in the event handler to identify which button was clicked
button.id = i + 1;
// Draw the background in the graphics prop of the MovieClip
button.graphics.beginFill(0x00ff00, 1);
button.graphics.drawRect(0, 0, buttonSize, buttonSize);
// Add event listener
button.addEventListener(MouseEvent.CLICK, this.clickHandler);
// Position the button
button.x = i * (buttonSize + 20); // Add some spacing
button.y = stage.stageHeight - buttonSize - 10;
// Add the button to the stage
addChild(button);
// Create the label for the button
label = new TextField();
label.text = button.id.toString();
label.selectable = false;
label.multiline = false;
label.autoSize = TextFieldAutoSize.LEFT;
label.setTextFormat(new TextFormat('Arial', 12, 0, true));
// Position the label in the centre of the button
label.x = (buttonSize - label.width) / 2;
label.y = (buttonSize - label.height) / 2;
// Add the label to the button MovieClip
button.addChild(label);
}
function clickHandler(event:MouseEvent):void
{
trace("Button clicked:", event.currentTarget.id);
}
What I would do is make a single movie clip with a text field in it. For example, I have a movie clip (with a linkage name of NumClip) and a dynamic text field inside called numText (Be sure to embed numerals or whatever other characters you need). Then a simple for loop should do the trick.
var maxNum:Number = 9;
for (var i:int = 1; i <= maxNum; i++)
{
var clip:NumClip = new NumClip();
clip.x = i * (clip.width + 5);
clip.y = 50;
clip.id = i;
clip.numText.text = String(i);
clip.addEventListener(MouseEvent.CLICK, numClick);
addChild(clip);
}
function numClick(e:MouseEvent):void
{
trace("You clicked number " + e.currentTarget.id);
}
I haven't tested this code, but it looks good to me and should do the trick

Chess board interface. Cannot remove child. Any suggestions?

Hello
I am in the process of creating a chess board where you can move the pieces. Currently i am working on the rook and the coding is below. I know it is not elegant and probably the most inefficient code out there, but this is day 2 of my actionscript 3.0 life and i am kinda a beginner. Anyway, so the thing is, when you click the piece the code below figures out the possible ways to go. Then green squares appear at those places. You can then press those green squares and then the rook will move there.
Ok, now to the problem. The squares will not go away. I want them all to be deleted when i have clicked on one of them and the rook will move there.
I have tried removeChild(), but since that happens in a different function it does not work. So if you are so kind to look through the code and suggest a solution, your help is much appreciated.
Kind Regards Emile
https://picasaweb.google.com/109156245246626370734/Jun42011?authkey=Gv1sRgCMy4v_b01aikzAE&feat=directlink
import flash.display.Sprite
import flash.events.MouseEvent
import flash.text.TextField;
import flash.geom.Point;
import caurina.transitions.*
myPoint.addEventListener(MouseEvent.MOUSE_DOWN, startMove);
function startMove(evt:MouseEvent) {
var boxNum:int = Math.floor(myPoint.y/100)+1;
for (var i:int = 1; i <boxNum; i++) {
var box:Ball = new Ball();
box.x = myPoint.x;
box.y = myPoint.y - i * box.height;
addChild(box);
Tweener.addTween(box, {alpha:0.5});
box.buttonMode = true;
box.addEventListener(MouseEvent.ROLL_OVER, onOver,
false, 0, true);
box.addEventListener(MouseEvent.ROLL_OUT, onOut,
false, 0, true);
box.addEventListener(MouseEvent.MOUSE_DOWN, onclick);
}
var boxNum1:int = Math.floor((800-myPoint.y)/100)+1;
for (var i:int = 1; i <boxNum1; i++) {
var box1:Ball = new Ball();
box1.x = myPoint.x;
box1.y = myPoint.y + i * box.height;
addChild(box1);
Tweener.addTween(box1, {alpha:0.5});
box1.buttonMode = true;
box1.addEventListener(MouseEvent.ROLL_OVER, onOver,
false, 0, true);
box1.addEventListener(MouseEvent.ROLL_OUT, onOut,
false, 0, true);
box1.addEventListener(MouseEvent.CLICK, onclick);
}
var boxNum2:int = Math.floor(myPoint.x/100)+1;
for (var i:int = 1; i <boxNum2; i++) {
var box2:Ball = new Ball();
box2.x = myPoint.x - i * box.height;
box2.y = myPoint.y;
addChild(box2);
Tweener.addTween(box2, {alpha:0.5});
box2.buttonMode = true;
box2.addEventListener(MouseEvent.ROLL_OVER, onOver,
false, 0, true);
box2.addEventListener(MouseEvent.ROLL_OUT, onOut,
false, 0, true);
box2.addEventListener(MouseEvent.CLICK, onclick);
}
var boxNum3:int = Math.floor((800-myPoint.x)/100)+1;
for (var i:int = 1; i <boxNum3; i++) {
var box3:Ball = new Ball();
box3.x = myPoint.x + i * box.height;
box3.y = myPoint.y;
addChild(box3);
Tweener.addTween(box3, {alpha:0.5});
box3.buttonMode = true;
box3.addEventListener(MouseEvent.ROLL_OVER, onOver, false, 0, true);
box3.addEventListener(MouseEvent.ROLL_OUT, onOut, false, 0, true);
box3.addEventListener(MouseEvent.CLICK, onclick);
}
}
function onOver(evt:Event):void {
var box:MovieClip = MovieClip(evt.target);
addChild(box)
box.scaleX = box.scaleY = 1.1;
}
function onOut(evt:Event):void {
evt.target.scaleX = evt.target.scaleY = 1;
}
function onclick(Event:MouseEvent):void {
var xcod:int = Math.ceil(mouseX/100)*100-50;
var ycod:int = Math.ceil(mouseY/100)*100-50;
Tweener.addTween(myPoint, {x:xcod, y:ycod, time:1, transition:"linear"});
}
alxx's answer is correct, you wouldn't need to keep a special list for them. The other way you could do it, using an Array to save references, would look like this:
var boxes:Array = new Array();
function startMove(evt:MouseEvent):void {
...
var box:Ball = new Ball();
addChild(box);
boxes.push(box);
...
var box1:Ball = new Ball();
addChild(box1);
boxes.push(box1);
...
}
function onClick(evt:MouseEvent):void {
for each (var box:Ball in boxes) {
removeChild(box);
}
boxes = new Array();
}
You can put temporary highlights in separate Sprite. Then your board will looks as follows:
Stage children: base board, highlights, pieces, in that order.
When you need to remove highlights, you can iterate highlights' children with numChildren and getChildAt and call removeChild on each, you don't even need a special list for them.