How to toggle color of a movieclip? - actionscript-3

Let's say I have a movie clip on stage. Every time this movie clip is clicked I want it to change color but if is click again I want it to recolor (becomes white again). To be more clear - it is white at the begin and with the first click I want it to become yellow, with the second click to become white again and with the third click to become yellow again and so on.
I just wrote the code for the first click but I can't think how to do the rest.
var myColorTransform:ColorTransform=transform.colorTransform;
half1a.addEventListener(MouseEvent.CLICK, changeColour);
function changeColour(event:MouseEvent):void
{
myColorTransform.color = 0xD5E40D;
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}

Or if you don't like typing to much:
var myColorTransform:ColorTransform=transform.colorTransform;
half1a.addEventListener(MouseEvent.CLICK, changeColour);
var cc:uint = 0; //current color.
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length)? cc : 0];
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}
Explanation:
Little bit of explanation as after I saw comment I realized that this could be confusing to less experienced programmers and we want to teach each other here ant not to do job for someone else.
So what is going on here?
Basic setup
We declare some array with colors that we want cycle our movieclip with(by?).
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
No we want to know which color we are now displaying so we declare another variable which will store index of current color.
var cc:uint = 0; //current color.
If you are already confused see Working with arrays
Basically (with current value of 0) we would access first item of the array 0xFFFFFF by this:
cl[cc];
The goal
Now all we need to do each time we click the movieclip is just move the index so that it points to next item(color) in our array.
We could simply increment the value of our current color like that
myColorTransform.color = cl[++cc];
Notice here the difference between x++ and ++x. Adobe has great example of how this differs.
and it would work but only until we reach end of array (obviously we don't want to increment our index anymore, we want it to go back to 0)
And all the rest is about doing just that - resting index to 0;
If you have no idea what this strange ()?:;syntax mean. You would probably want to check this this out - simply it's just if...else abbreviation but you may better think of it as a function returning some value.
So in out case cc = (++cc < cl.length)? cc : 0
Would be equivalet of writing something like this:
cc = nextIndex();
function nextIndex() {
if (++cc < cl.length) return cc;
else return 0; //else is redundant here - if "if" is ture then function will return "cc" and no other instruction are executed in this function.
}
Summary
So in summary what myColorTransform.color = cl[cc = (++cc < cl.length)? cc : 0]; line does is.
increment color index.
check if new index is smaller than length of color list.
if true, set cc to cc (leave as it is)
else, set cc back to 0
Pick color value from color list cl at index evaluated within [].
Set myColorTransform.color to picked value.
Answer to additional question.
From the point we've just ended the cc value is storing index of new color so you can simply use it to access cl again without redoing this crazy stuff. For example, if you want to have simply a single mc, you can just use visible property:
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length) ? cc : 0];
half1a.transform.colorTransform = myColorTransform;
half_number1a.visible = cl[cc] == 0xFFFFFF; //check if current color is white and set it's visible state accordingly
}
Note that if button is not added to stage fist, you wont see it, even if visible property is set to true.
More flexible solution
Or another way of doing this would to to create parallel or multidimensional array. In simple scenario like this, parallel array should be better choice as it's easier to track and you don't need to change anything you've already have.
Basically the idea is to create another array where each value(in your case, movie clips is companion with color value at the same index:
var cl:Array = [0xFFFFFF, 0xD5E40D]; //list of all colors.
var ml:Array = [half_number1a, null ]; //movie clips list.
So if you have something like this, now your changeColor function would look something like that:
function changeColour(event:MouseEvent):void
{
myColorTransform.color = cl[cc = (++cc < cl.length) ? cc : 0];
half1a.transform.colorTransform = myColorTransform;
if (ml[cc]) addChild(ml[cc]); //add child if exist.
if (ml[cc - 1]) removeChild(ml[cc - 1]); //remove previous child if exist.
}
And that's it. Just remember that you need to fist movie clip on stage before you call to removeChild()
The nice thing about this setup is that you can add as many colors and movieclips as you like just by pushing new values to arrays :)

Untested but you can try something like this...
var myColorTransform:ColorTransform=transform.colorTransform;
var nextColor : String = "yellow"; //set with expected Next Color
half1a.addEventListener(MouseEvent.CLICK, changeColour);
function changeColour(event:MouseEvent):void
{
if (nextColor == "yellow") { myColorTransform.color = 0xD5E40D; nextColor == "white" }
else if (nextColor == "white") { myColorTransform.color = 0xFFFFFF; nextColor == "yellow" }
half1a.transform.colorTransform=myColorTransform;
addChild(half_number1a);
}
Ideally you should use a Boolean to set a true/false state then use the If/Else to set colors. If true then make white or else if false then set yellow.

I'd use ColorMatrixFilter:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/filters/ColorMatrixFilter.html
var aMatrix:Array = [
0, 0, 0, 0, 0xD5,
0, 0, 0, 0, 0xE4,
0, 0, 0, 0, 0x0D,
0, 0, 0, 1, 0
];
var aYellow:ColorMatrixFilter = new ColorMatrixFilter(aMatrix);
// Make object yellow.
M.filters = [aYellow];
// Make object normal.
M.filters = null;
function toggleColor():void
{
if (M.filters) M.filters = null;
else M.filters = [aYellow];
}

Related

Nested movieclips; changing background frame

Where have all my children gone?
Hope this is a relatively simple answer to a less-than-intelligent question that's a consequence of how I learn things when not doing them for work. In this case I started a game about 3 years ago in AS3 as I was familiar with js at least and had also worked with shockwave back in the day. Anyway, when learning something offline like this I tend to learn just what I need to know to do what I need to do next, and can sometimes get pretty far into one area while missing something obvious and simple because I just haven't crossed that case yet.
We have a playing field and playing pieces. Those playing pieces (sailing ships) you see below are complex objects with dozens of properties and several children including graphics and text fields that change depending on the state of the ship. It's WEGO where each side plots moves, those moves are then executed one ship at a time alternatively between the two sides, then we have gun combat, etc. All that is there and works fine, a few thousand lines of code.
My current problem is that when a player clicks on a ship to select it, I unhide a yellow border to indicate which ship is selected and draw the complex ship detail screen you see top left, but for a long time I've wanted to change the background color of the playing piece as well.
After a long layoff I started working on this again and decided to start there. So I made new counters, added them as keyframes to the already existing symbol/class that contains all of the country default backgrounds, and modified the code. It works fine in that the background is changed to the correct highlighted version, and then goes back to default when deselected.
In the image the currently-selected ship is in the center, USS Constitution, its detail/info screen is also displayed. You can see the problem, all the children are gone on the playing piece. And they don't come back when you go back to the original default background.
At first I thought it was a z order problem but it isn't, I walked the selected ship playing piece background in the z index until they disappeared behind the ocean background, there was just open ocean where the ship playing piece used to be.
My best guess is that maybe the children have to be instanced on each frame of the parent's timeline each time you change the parent's frame but if so I'm not finding reference to or explanation of that. That and that seems really unwieldy way of doing things, I was completely caught off guard by the idea of the children caring what frame its parent is on unless there was coded logic telling it to.
Somehow even though I have thousands of lines of complex dialogs and screens displaying multiple dynamic children I have never changed the base background in any of those cases.
Also tried to google this, but had little luck. I couldn't even figure out a relatively simple question to ask.
I'll be happy to paste code but I don't seem to have a code problem but an understanding problem.
Example-selected ship with highlighted background graphic is in the center
For those who feel the code is important, this is the end of the 1500 line ship-creation function where most of the children get added:
textShipSailSpeed.name = "textShipSailSpeed";
textShipSailSpeed.width = 20;
textShipSailSpeed.height = 13;
textShipSailSpeed.x = 33;
textShipSailSpeed.y = 14;
textShipSailSpeed.embedFonts = true;
textShipSailSpeed.textColor = 0xFFFFFF;
textShipSailSpeed.rotation -= 90;
//full sails set
if ("full" == finalShip.sailState) {
textShipSailSpeed.text = finalShip.fullSailSpeed;
}
//battle sails set, which are reduced sails to improve visibility and reduce sail damage in combat
else {
textShipSailSpeed.text = finalShip.battleSailSpeed;
}
// textShipBattleSailSpeed and textShipFullSailSpeed no longer used on counters, but still used in Info screens
var textShipBattleSailSpeed: TextField = new TextField();
textShipBattleSailSpeed.name = "textShipBattleSailSpeed";
textShipBattleSailSpeed.text = finalShip.battleSailSpeed;
textShipBattleSailSpeed.visible = false;
var textShipFullSailSpeed: TextField = new TextField();
textShipFullSailSpeed.name = "textShipFullSailSpeed";
textShipFullSailSpeed.text = finalShip.fullSailSpeed;
textShipFullSailSpeed.visible = false;
//create sailState (battle/full) indicator
var sailStateIndicator: WSIM_Counters_SailtState_Indicator = new WSIM_Counters_SailtState_Indicator();
//set indicator to correct sailState background graphic
sailStateIndicator.gotoAndStop("battle");
if ("full" == finalShip.sailState) {
sailStateIndicator.gotoAndStop("full");
}
finalShip.addChild(sailStateIndicator);
//add ship and attach text fields
gridBG1.addChild(finalShip);
finalShip.addChild(textShipName);
finalShip.addChild(textShipSailSpeed);
finalShip.addChild(textShipTurnAllowance);
finalShip.addChild(textShipBattleSailSpeed);
finalShip.addChild(textShipFullSailSpeed);
finalShip.parent.setChildIndex(finalShip, 1);
//logging
if (log_shipCreation) {
trace(finalShip.name + " added added as child of background in createShip()");
}
//create background sprite "ship is selected" border
var border: Sprite = new Sprite();
border.name = "shipBorder";
border.graphics.beginFill(0xFFCC00, 1);
border.graphics.drawRect(-1, -1, 52, 132)
border.graphics.endFill();
border.visible = false;
//create background sprite combat border
var borderCombat: Sprite = new Sprite();
borderCombat.name = "borderCombat";
borderCombat.graphics.beginFill(0xFF0000, 1);
borderCombat.graphics.drawRect(-1, -1, 52, 132)
borderCombat.graphics.endFill();
borderCombat.visible = false;
//add the borders as children of ship
finalShip.addChild(border);
finalShip.addChild(borderCombat);
//move the borders in z-order to behind ship counter, so they show looking like a border
border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);
//PUSH TO MASTER SHIP ARRAYS
//finalShip is Side 1, add to master list of ship objects for Side 1
if (sideList[0] == finalShip.country) { ....
And this is part of the even larger selectShip function, here is where I clear the selected state on all ships on map and then set the current ship's background to currShip.country+"_sel" which is the correct frame label for the "selected" background images.
//clear combat selected state on all ships
for (var i: int = 0; i < shipListSide1.length; i++) {
//hide selection border sprite and set select property false
shipListSide1[i].combatSelected = false;
var borderChildCombat = shipListSide1[i].getChildByName("borderCombat");
borderChildCombat.visible = false;
//show default counter background, build label name
shipListSide1[i].gotoAndStop(shipListSide1[i].country+"_def");
}
for (var i: int = 0; i < shipListSide2.length; i++) {
//hide selection border sprite and set select property false
shipListSide2[i].combatSelected = false;
var borderChildCombat2 = shipListSide2[i].getChildByName("borderCombat");
borderChildCombat2.visible = false;
//show default counter background, build label name
shipListSide2[i].gotoAndStop(shipListSide2[i].country+"_def");
}
//check to see if this is selecting a target in gun combat
if ((false == currShip.side1 && enableCombatSelectSide2) || (currShip.side1 && enableCombatSelectSide1)) {
combatSelectShip(currShip);
}
//we're allowed to select this ship
if ((enableSelectSide1 && currShip.side1) || (enableSelectSide2 && false == currShip.side1)) {
//event is from a ship object
if (currShip is Ship_1) {
//remove previous ship info screen
if (currShipInfo.parent) {
currShipInfo.parent.removeChild(currShipInfo);
}
//clear selected state on all ships
for (var i: int = 0; i < shipListSide1.length; i++) {
//hide selection border sprite and set select property false
shipListSide1[i].selected = false;
var borderChild = shipListSide1[i].getChildByName("shipBorder");
borderChild.visible = false;
//default graphic already set in clearing combatselect status above
}
for (var i: int = 0; i < shipListSide2.length; i++) {
//hide selection border sprite and set select property false
shipListSide2[i].selected = false;
var borderChild2 = shipListSide2[i].getChildByName("shipBorder");
borderChild2.visible = false;
//default graphic already set in clearing combatselect status above
}
//Change graphic of selected ship to selected, highlighted color
currShip.gotoAndStop(currShip.country+"_sel");
//set selected state on clicked ship, unhide border
currShip.selected = true;
borderChild = currShip.getChildByName("shipBorder");
borderChild.visible = true;
Ok based on feedback about it being a z-order issue, the below is what I tried to move the missing children back above the playing piece background. If you notice it also has to be a z order issue as the "selected" border, which is a child of the playing piece like the missing ones, that happens to purposely be behind the playing piece graphic, displays correctly when the ship is in the selected state. See the original screenshot, the playing piece in the center that's selected and is missing its children also has a yellow border.
Anyway, below is what I tried. It works in that there are no errors but I really couldn't find these children in the debugger to confirm what happened, and so far I at least appear to have moved them up in the z order to the max before I get an out of range error, and the problem still exists - no ship graphic, ship name, movement allowance, etc.
//Change playing piece background of the selected ship to selected, highlighted color frame
currShip.gotoAndStop(currShip.country+"_sel");
//trying to move the children of the playing piece back above the playing piece graphic
var shipChildrenArray:Array = new Array("textShipName","textShipTurnAllowance","textShipSailSpeed","sailStateIndicator");
for each(var childItem:String in shipChildrenArray) {
currShip.setChildIndex(currShip.getChildByName(childItem), 3);
}
Your parent movieclip should have layers. The child movieclip that you want to always be visible needs to extend across all frames of the parent.
Note that I did not see what you say I should be able to see on your graphic. Since I don't know what you think it should look like, I wasn't able to spot the difference between what it does look like and that.
You may find you get better feedback if you post a screen capture of the timeline and post any code that's involved.
I try to build a simple replica of your hierarchy here:
package {
import flash.display.MovieClip;
import flash.events.*;
public class gameTestDoc extends MovieClip {
var pieceArray:Array = new Array();
public function gameTestDoc() {
stage.addEventListener(MouseEvent.CLICK, selectPiece);
for (var i:int = 0; i < 4; i++){ // creates 4 instances of a class with 6 frames, each having a different colored rectangle.
var gamePiece:MovieClip = new backGround();
addChild(gamePiece);
gamePiece.x = 50 * i + 200; // space out the game pieces.
gamePiece.y = stage.stageHeight/2; // center game pieces.
pieceArray.push(gamePiece);// add piece to array.
for (var j:int = 0; j < 5; j++){
var components:MovieClip = new MovieClip();
components.graphics.lineStyle();
components.graphics.beginFill(0x00ffcc * j * 200000); //gives different color to each component.
components.graphics.drawRect(0,0,5, 10);
components.graphics.endFill();
gamePiece.addChild(components);
components.y = j * 5;
}
gamePiece.gotoAndStop(Math.ceil(Math.random()*10)); // give each piece a random frame to go to.
}
}
function selectPiece(e:MouseEvent):void{ // sends game piece frame to random frame.
for (var i:int = 0; i < pieceArray.length; i++){
e.target.gotoAndStop(Math.ceil(Math.random()*10));
}
}
}
}
and I have an mc in the GUI library with the linkage name of "backGround". When I click on the pieces, the backgrounds change color, and everything else stays on top. Here is a picture:
and after I click the 2nd piece:
can you see from my simple code what you might be doing differently?
edit: 6-10-16
//move the borders in z-order to behind ship counter, so they show looking like a border
border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);
wouldn't this be less confusing/prone to strange behavior?:
//move the borders in z-order to behind ship counter, so they show looking like a border
border.parent.setChildIndex(border, 0);
borderCombat.parent.setChildIndex(borderCombat, 0);
Would this not give the same result?
At first I thought it was a z order problem but it isn't,
Actually this is probably exactly your problem.
I walked the selected ship playing piece background in the z index until they disappeared behind the ocean
Really? How? Moving the z-order of display objects in a container can't change the z-order of the container. But if you are moving the ship itself (the container of all your other symbols), then yes, the open ocean will appear. But just shifting things around within the ship won't do that. How to shift things around in the ship container? Go here.
Example
If your game piece (pieceMc) is a child of the ocean background (oceanMc) and the the flag background (flagMc) is a child of the piece then
oceanMc.gamePieceMc.setChildIndex(flagMc,0);
should put the flag to the bottom
Edit 6/11/16
One quick and dirty way to change z-order at runtime is to re add the child; it will be put on top of the stack. You could do
piece[i].addChild(ship);
piece[i].addChild(guns);
piece[i].addChild(nameField);
the result will be that the ship will come to the top, then the guns will be put back on top of that, then the nameField on top of that. If the flag background is also a child of "piece" it will below, like you want.
One quick and dirty way to change z-order at runtime is to re add the child; it will be put on top of the stack. You could do piece[1].addChild(ship); piece[1].addChild(guns); piece[1].addChild(nameField); the result will be that the ship will come to the top, then the guns will be put back on top of that, then the nameField on top of that. If the flag background is also a child of "piece" it will below, like you want. – Neal Davis yesterday
Ok, this is the closest to the correct answer I'm going with. As you can see in the update to my original question, I tried to fix the z order problem by either moving the children up or the background down, but had no luck even though the code executes fine.
So I changed my solution to this:
//Change playing piece background of the selected ship to selected, highlighted color frame
currShip.gotoAndStop(currShip.country+"_sel");
//move the children of the playing piece back above the playing piece graphic. When parent changes frame as above it goes to the top of the z order for some stupid reason
var shipChildrenArray:Array = new Array("textShipName","textShipTurnAllowance","textShipSailSpeed","sailStateIndicator", "currShipGraphic");
for each(var childItem:String in shipChildrenArray) {
//currShip.setChildIndex(currShip.getChildByName(childItem), 5);
var childObject = currShip.getChildByName(childItem);
currShip.removeChild(childObject);
currShip.addChild(childObject);
}
It seems very hacky to me, I'd rather correctly manipulate the z order but unless someone has other ideas on how to do that, we'll have to go with this solution. Re-adding the children does indeed move them back to the top of the current z order array.
So:
1) If you have nested movieclips and you change the frame of the parent, it will go to the top of the z order array for reasons I can't begin to fathom. I don't see a way to prevent it either.
2) If you know how to manipulate the z order of the child movieclips better than I do, that would probably be the best solution.
3) A sledgehammer solution is removing and adding all the children back.
...and it won't let me post a screenshot of it working properly because I "need at least 10 reputation points to post more than two links." Makes no sense as this attachment is the SECOND link, not third or more. Oh well.
Responding to Neal's post.
Looking at the code, only difference that I see is that you're adding the pieces as children of the stage, while mine are one nested level down by being children of the ocean graphic.
Since you're interested and spending time with it, I'll post the entire ship creation function below. It gets called iteratively and loops through the side1 master array of ships and then side2, back to back. That's one reason I'm so confused by the two sides' z orders being consistently different, maybe alphabetical is being applied- only z order manipulation I do in the creation is pushing the border children (one normal select one combat) behind the playing piece.
BTW, please also look for another question from me involving a different issue I am having where a dialog is refusing to disappear on removeChild even though the associated code hasn't been touched in a couple years.
This is ship creation. This is a simulation, not a game, so it's reasonably complex with large numbers of properties set. One somewhat unusual thing I do you will see is cast my Ship_1 classes to a generic object to set all the custom properties and then back to Ship_1 once that's done. I always thought that was a little risky but have seen zero problems (unless this issue is tied to that somehow)
//create ship objects, set properties, add to core arrays
function createShip(currShip) {
// create Ship_1 obj and cast it temporarily as parent class (which is dynamic) to set custom properties
var finalShip: Ship_1 = new Ship_1();
var temp_Ship: Object = finalShip as Object;
//set basic stats
temp_Ship.selected = currShip.selected;
temp_Ship.combatSelected = currShip.combatSelected;
temp_Ship.name = currShip.name;
//rigging & rigging damage
temp_Ship.rigging = currShip.rigging;
temp_Ship.riggingSlots = currShip.riggingSlots;
temp_Ship.rigging_1 = currShip.rigging_1;
temp_Ship.rigging_2 = currShip.rigging_2;
temp_Ship.rigging_3 = currShip.rigging_3;
temp_Ship.rigging_4 = currShip.rigging_4;
temp_Ship.riggingDamage = currShip.riggingDamage;
temp_Ship.riggingDamage_1 = currShip.riggingDamage_1;
temp_Ship.riggingDamage_2 = currShip.riggingDamage_2;
temp_Ship.riggingDamage_3 = currShip.riggingDamage_3;
temp_Ship.riggingDamage_4 = currShip.riggingDamage_4;
//hull & hull damage
temp_Ship.hull = currShip.hull;
temp_Ship.hull_1 = currShip.hull_1;
temp_Ship.hull_2 = currShip.hull_2;
temp_Ship.hull_3 = currShip.hull_3;
temp_Ship.hullDamage = currShip.hullDamage;
temp_Ship.hullDamage_1 = currShip.hullDamage_1;
temp_Ship.hullDamage_2 = currShip.hullDamage_2;
temp_Ship.hullDamage_3 = currShip.hullDamage_3;
//guns & guns damage
temp_Ship.guns = currShip.guns;
temp_Ship.gunsDamage = currShip.gunsDamage;
temp_Ship.guns_1 = currShip.guns_1;
temp_Ship.guns_2 = currShip.guns_2;
temp_Ship.guns_3 = currShip.guns_3;
temp_Ship.guns_4 = currShip.guns_4;
temp_Ship.gunsDamageLeftBow = currShip.gunsDamageLeftBow;
temp_Ship.gunsDamageLeftBowInitial = currShip.gunsDamageLeftBowInitial;
temp_Ship.gunsDamageRightBow = currShip.gunsDamageRightBow;
temp_Ship.gunsDamageRightBowInitial = currShip.gunsDamageRightBowInitial;
temp_Ship.gunsDamageLeftStern = currShip.gunsDamageLeftStern;
temp_Ship.gunsDamageLeftSternInitial = currShip.gunsDamageLeftSternInitial;
temp_Ship.gunsDamageRightStern = currShip.gunsDamageRightStern;
temp_Ship.gunsDamageRightSternInitial = currShip.gunsDamageRightSternInitial;
//carronades & carronades damage
temp_Ship.carronades = currShip.carronades;
temp_Ship.carronades_1 = currShip.carronades_1;
temp_Ship.carronades_2 = currShip.carronades_2;
temp_Ship.carronades_3 = currShip.carronades_3;
temp_Ship.carronades_4 = currShip.carronades_4;
temp_Ship.carronadesDamageLeftBow = currShip.carronadesDamageLeftBow;
temp_Ship.carronadesDamageLeftBowInitial = currShip.carronadesDamageLeftBowInitial;
temp_Ship.carronadesDamageRightBow = currShip.carronadesDamageRightBow;
temp_Ship.carronadesDamageRightBowInitial = currShip.carronadesDamageRightBowInitial;
temp_Ship.carronadesDamageLeftStern = currShip.carronadesDamageLeftStern;
temp_Ship.carronadesDamageLeftSternInitial = currShip.carronadesDamageLeftSternInitial;
temp_Ship.carronadesDamageRightStern = currShip.carronadesDamageRightStern;
temp_Ship.carronadesDamageRightSternInitial = currShip.carronadesDamageRightSternInitial;
//crew and crew damage
temp_Ship.crewQuality = currShip.crewQuality;
temp_Ship.crewDamage = currShip.crewDamage;
temp_Ship.crew_1 = currShip.crew_1;
temp_Ship.crew_1_damage = currShip.crew_1_damage;
temp_Ship.crew_1_lost = currShip.crew_1_lost;
temp_Ship.crew_1_lostInitial = currShip.crew_1_lostInitial;
temp_Ship.crew_2 = currShip.crew_2;
temp_Ship.crew_2_damage = currShip.crew_2_damage;
temp_Ship.crew_2_lost = currShip.crew_2_lost;
temp_Ship.crew_2_lostInitial = currShip.crew_2_lostInitial;
temp_Ship.crew_3 = currShip.crew_3;
temp_Ship.crew_3_damage = currShip.crew_3_damage;
temp_Ship.crew_3_lost = currShip.crew_3_lost;
temp_Ship.crew_3_lostInitial = currShip.crew_3_lostInitial;
//initial positions, used in plotted movement
temp_Ship.initialColumn = currShip.initialColumn;
temp_Ship.initialRow = currShip.initialRow;
temp_Ship.initialColumn2 = currShip.initialColumn2;
temp_Ship.initialRow2 = currShip.initialRow2;
temp_Ship.initialDirection = currShip.initialDirection;
//movement properties
temp_Ship.fullSailSpeed = currShip.fullSailSpeed;
temp_Ship.fullSailSpeedArray = currShip.fullSailSpeedArray;
temp_Ship.maxFullSailSpeed = currShip.maxFullSailSpeed;
temp_Ship.initialFullSailSpeed = currShip.initialFullSailSpeed;
temp_Ship.battleSailSpeed = currShip.battleSailSpeed;
temp_Ship.battleSailSpeedArray = currShip.battleSailSpeedArray;
temp_Ship.maxBattleSailSpeed = currShip.maxBattleSailSpeed;
temp_Ship.initialBattleSailSpeed = currShip.initialBattleSailSpeed;
//point of sailing (close reach, broad reach, etc.)
temp_Ship.shipOrientation = currShip.shipOrientation;
temp_Ship.movementAllowanceUsed = currShip.movementAllowanceUsed;
temp_Ship.moveLog = currShip.moveLog;
//turn properties
temp_Ship.turnAllowanceBase = currShip.turnAllowanceBase;
temp_Ship.turnAllowance = currShip.turnAllowance;
//used in movement
temp_Ship.turnAllowed = currShip.turnAllowed;
temp_Ship.moveAllowed = currShip.moveAllowed;
//special conditions (anchored, grappled, etc.) can block movement/turning
temp_Ship.canMove = currShip.canMove;
temp_Ship.fouled = currShip.fouled;
temp_Ship.anchored = currShip.anchored;
temp_Ship.grappled = currShip.grappled;
temp_Ship.onFire = currShip.onFire;
//dismasted
temp_Ship.dismasted = currShip.dismasted;
temp_Ship.initialDismasted = currShip.initialDismasted;
temp_Ship.dismastedPreviousValue = currShip.dismastedPreviousValue;
//weapons status
temp_Ship.loadedLeft = currShip.loadedLeft;
temp_Ship.loadedRight = currShip.loadedRight;
temp_Ship.shotType = currShip.shotType;
//position
temp_Ship.column = currShip.column;
temp_Ship.row = currShip.row;
//stern hex
temp_Ship.column2 = currShip.column2;
temp_Ship.row2 = currShip.row2;
temp_Ship.direction = currShip.direction;
//country
temp_Ship.country = currShip.country;
//class and rating
temp_Ship.shipClassName = currShip.shipClassName;
temp_Ship.shipClassNumber = currShip.shipClassNumber;
temp_Ship.shipRate = currShip.shipRate;
temp_Ship.originalGuns = currShip.originalGuns;
//HACK need to find a better solution
temp_Ship.combatBorderFixed = currShip.combatBorderFixed;
//value will be frame label of the ship portrait we will use for this ship
//these will be used by the info screens
temp_Ship.portraitLabel = "";
// <--- begin select ship portrait for Info screens ---->
//number of options per country + number of guns combo
var portraitRandLimit:int = 1;
//actual class that contains all of the ship portrait bitmaps
var shipPortraitSource:Ship_Portrait = new Ship_Portrait;
//pull list of all frame labels in shipPortraitSource
var labelList:Array = shipPortraitSource.currentLabels;
//iterate through list of frame labels to see if we have one that matches this ship's name
for each (var frameObject:FrameLabel in labelList) {
//we have a name match in our list of ship portraits, use specific bitmap for that individual ship
if (frameObject.name == currShip.name) {
temp_Ship.portraitLabel = currShip.name;
//LOGGING
if (log_shipPortraitSelection) {
trace("==================================================");
trace("framObject.name: "+frameObject.name+" matched currShip.name: "+currShip.name);
trace("temp_Ship.portraitLabel set to: "+temp_Ship.portraitLabel);
trace("==================================================");
trace("");
}
}
}
//we didn't find a name match, select a ship portrait from available options that match the ship country + number of guns it really carried
//Trying to have 3-4 accurate options in each gun number + country combo
if ("" == temp_Ship.portraitLabel) {
//configure the number of options for each country + number of guns combo
switch(currShip.country) {
case "US":
switch(currShip.originalGuns) {
case 44:
portraitRandLimit = 4;
break;
case 38:
portraitRandLimit = 4;
break;
case 36:
break;
case 32:
portraitRandLimit = 2;
break;
case 28:
portraitRandLimit = 2;
break;
case 16:
break;
case 12:
portraitRandLimit = 2;
break;
}
break;
case "GB":
switch(currShip.originalGuns) {
case 38:
portraitRandLimit = 4;
break;
case 36:
break;
case 32:
portraitRandLimit = 2;
break;
case 28:
portraitRandLimit = 3;
break;
}
break;
case "FR":
case "ES":
case "NL":
break;
}
//now that we know how many options we have for this gun number + country combo, select one randomly
var portraitNumber:int = Math.ceil(Math.random() * portraitRandLimit);
//build the label name for us in the info screens, E.G., "GB_38_3", being the third portrait for 38 gun British ships
temp_Ship.portraitLabel = currShip.country+"_"+currShip.originalGuns+"_"+portraitNumber;
//LOGGING
if (log_shipPortraitSelection) {
trace("==================================================");
trace("There was no name match selecting a portrait, so building label name");
trace("currShip.name: "+currShip.name);
trace("portraitRandLimit: "+portraitRandLimit);
trace("portraitNumber: "+portraitNumber);
trace("temp_Ship.portraitLabel set to: "+temp_Ship.portraitLabel);
trace("==================================================");
trace("");
}
}
// <--- end select ship portrait for Info screens ---->
//used for movement rules, ship can only turn once per hex. 1 = straight, 2 = turn
temp_Ship.lastMove = currShip.lastMove;
//is ship fulll or battle sail
temp_Ship.sailState = currShip.sailState;
//designates which sdie ship is on
temp_Ship.side1 = currShip.side1;
temp_Ship.starboardHitZone = currShip.starboardHitZone;
temp_Ship.portHitZone = currShip.portHitZone;
temp_Ship.initialBroadside = currShip.initialBroadside;
//ship going down
temp_Ship.isSinking = currShip.isSinking;
temp_Ship.isExploding = currShip.isExploding;
//ship surrender
temp_Ship.isSurrendered = currShip.isSurrendered;
temp_Ship.strikeColors = currShip.strikeColors;
temp_Ship.strikeFirePower = currShip.strikeFirePower;
temp_Ship.strikeMobility = currShip.strikeMobility;
//recast back to ship type. This seems risky but it works
finalShip = temp_Ship as Ship_1;
//calc initial positions based on column/row properties and a hex-based grid
finalShip.x = (62 * (finalShip.column - 1)) + 17;
//y setting is annoying
finalShip.y = 5 + ((finalShip.row - 1) * 70) + ((finalShip.row - 1) * 1) - 71;
//odd columns must compensate for half hexes
if (1 == finalShip.column % 2) {
finalShip.y += 35;
}
//rotate based on ship direction and correct for top left registration point
switch (finalShip.direction) {
case 1:
//do nothing
break;
case 2:
finalShip.rotation = 60;
finalShip.x += 99;
finalShip.y += 27;
break;
case 3:
finalShip.rotation = 120;
finalShip.x += 124;
finalShip.y += 129;
break;
case 4:
finalShip.rotation = -180;
finalShip.x += 50;
finalShip.y += 202;
break;
case 5:
finalShip.rotation = -120;
finalShip.x -= 51;
finalShip.y += 172;
break;
case 6:
finalShip.rotation = -60;
finalShip.x -= 76;
finalShip.y += 72;
break;
}
//create ship graphics object. Numerous ship graphics representing all countries and all rates (1st-7th). There are multiple options in some country/rate cases
var currShipGraphic:WSIM_Ship_Graphics = new WSIM_Ship_Graphics();
//select correct background and ship graphics. Counter backgrounds are selected by ship country and ship rate sets the correct ship image to place on that background
switch (finalShip.country) {
//United States
case "US":
//set US background
finalShip.gotoAndStop("US_def");
//Select correct ship overlay based on ship rating (1st-7th)
switch (finalShip.shipRate) {
//US had no ships of the line. Well there was America but she saw no action and was given to the French
//everything gets frigate for now
case 5:
case 6:
case 7:
currShipGraphic.gotoAndStop("US_5_1");
break;
}
break;
//Great Britain
case "GB":
//set GB background
finalShip.gotoAndStop("GB_def");
switch (finalShip.shipRate) {
case 1:
currShipGraphic.gotoAndStop("GB_1_1");
break;
case 2:
currShipGraphic.gotoAndStop("GB_2_1");
break;
case 3:
currShipGraphic.gotoAndStop("GB_3_1");
break;
case 4:
currShipGraphic.gotoAndStop("GB_4_1");
break;
//everything gets frigate for now
case 5:
case 6:
case 7:
currShipGraphic.gotoAndStop("GB_5_1");
break;
}
break;
//France
case "FR":
//set FR background
finalShip.gotoAndStop("FR_def");
switch (finalShip.shipRate) {
case 1:
currShipGraphic.gotoAndStop("FR_1_1");
break;
case 2:
case 3:
//we have multiple options for French 3rd rate SoL
var FR_shipGraphicRandom:int = Math.ceil(Math.random() * 2);
switch (FR_shipGraphicRandom) {
case 1:
currShipGraphic.gotoAndStop("FR_3_1");
break;
case 2:
currShipGraphic.gotoAndStop("FR_3_2");
break;
}
break;
case 4:
currShipGraphic.gotoAndStop("FR_4_1");
break;
//everything gets frigate
case 5:
case 6:
case 7:
currShipGraphic.gotoAndStop("FR_5_1");
break;
}
break;
//Spain
case "ES":
//set ES background
finalShip.gotoAndStop("ES_def");
switch (finalShip.shipRate) {
case 1:
currShipGraphic.gotoAndStop("ES_1_1");
break;
case 2:
case 3:
case 4:
currShipGraphic.gotoAndStop("ES_3_1");
break;
//everything gets frigate
case 5:
case 6:
case 7:
currShipGraphic.gotoAndStop("ES_5_1");
break;
}
break;
//Netherlands
case "NL":
//set NL background
finalShip.gotoAndStop("NL_def");
switch (finalShip.shipRate) {
case 1:
case 2:
case 3:
case 4:
currShipGraphic.gotoAndStop("NL_3_1");
break;
//everything gets frigate
case 5:
case 6:
case 7:
currShipGraphic.gotoAndStop("NL_5_1");
break;
}
break;
}
currShipGraphic.x = 0;
currShipGraphic.y = 0;
currShipGraphic.name = "currShipGraphic";
//add correct ship graphic to the counter background
finalShip.addChild(currShipGraphic);
//font and format for counter text fields
var arialFont = new Arial();
var lucidaFont = new Lucida_Cal();
var textShipNameFormat: TextFormat = new TextFormat();
textShipNameFormat.size = 11;
textShipNameFormat.font = lucidaFont.fontName;
//ship name text field
var textShipName: TextField = new TextField();
textShipName.defaultTextFormat = textShipNameFormat;
textShipName.name = "textShipName";
textShipName.width = 80;
textShipName.height = 13;
textShipName.x = 34;
textShipName.y = 105;
textShipName.embedFonts = true;
textShipName.textColor = 0xFFFFFF;
textShipName.rotation -= 90;
textShipName.sharpness = 200;
textShipName.htmlText = "<p align='center'>" + finalShip.name + "</p>";
//font format for movement and turn allowance
var textShipNumbersFormat: TextFormat = new TextFormat();
textShipNumbersFormat.size = 12;
textShipNumbersFormat.font = arialFont.fontName;
//ship turn allowance
var textShipTurnAllowance: TextField = new TextField();
textShipTurnAllowance.defaultTextFormat = textShipNumbersFormat;
textShipTurnAllowance.name = "textShipTurnAllowance";
textShipTurnAllowance.width = 20;
textShipTurnAllowance.height = 13;
textShipTurnAllowance.x = 33;
textShipTurnAllowance.y = 127;
textShipTurnAllowance.embedFonts = true;
textShipTurnAllowance.textColor = 0xFFFFFF;
textShipTurnAllowance.rotation -= 90;
textShipTurnAllowance.text = finalShip.turnAllowance;
//ship movement allowance AS DISPLAYED ON THE COUNTER - display either battle sails speed or full sails speed depending on ship state
var textShipSailSpeed: TextField = new TextField();
textShipSailSpeed.defaultTextFormat = textShipNumbersFormat;
textShipSailSpeed.name = "textShipSailSpeed";
textShipSailSpeed.width = 20;
textShipSailSpeed.height = 13;
textShipSailSpeed.x = 33;
textShipSailSpeed.y = 14;
textShipSailSpeed.embedFonts = true;
textShipSailSpeed.textColor = 0xFFFFFF;
textShipSailSpeed.rotation -= 90;
//full sails set
if ("full" == finalShip.sailState) {
textShipSailSpeed.text = finalShip.fullSailSpeed;
}
//battle sails set, which are reduced sails to improve visibility and reduce sail damage in combat
else {
textShipSailSpeed.text = finalShip.battleSailSpeed;
}
// textShipBattleSailSpeed and textShipFullSailSpeed no longer used on counters, but still used in Info screens
var textShipBattleSailSpeed: TextField = new TextField();
textShipBattleSailSpeed.name = "textShipBattleSailSpeed";
textShipBattleSailSpeed.text = finalShip.battleSailSpeed;
textShipBattleSailSpeed.visible = false;
var textShipFullSailSpeed: TextField = new TextField();
textShipFullSailSpeed.name = "textShipFullSailSpeed";
textShipFullSailSpeed.text = finalShip.fullSailSpeed;
textShipFullSailSpeed.visible = false;
//create sailState (battle/full) indicator
var sailStateIndicator: WSIM_Counters_SailtState_Indicator = new WSIM_Counters_SailtState_Indicator();
//set indicator to correct sailState background graphic
sailStateIndicator.gotoAndStop("battle");
if ("full" == finalShip.sailState) {
sailStateIndicator.gotoAndStop("full");
}
sailStateIndicator.name = "sailStateIndicator";
finalShip.addChild(sailStateIndicator);
//add ship and attach text fields
gridBG1.addChild(finalShip);
finalShip.addChild(textShipName);
finalShip.addChild(textShipSailSpeed);
finalShip.addChild(textShipTurnAllowance);
finalShip.addChild(textShipBattleSailSpeed);
finalShip.addChild(textShipFullSailSpeed);
finalShip.parent.setChildIndex(finalShip, 1);
//logging
if (log_shipCreation) {
trace(finalShip.name + " added added as child of background in createShip()");
}
//create background sprite "ship is selected" border
var border: Sprite = new Sprite();
border.name = "shipBorder";
border.graphics.beginFill(0xFFCC00, 1);
border.graphics.drawRect(-1, -1, 52, 132)
border.graphics.endFill();
border.visible = false;
//create background sprite combat border
var borderCombat: Sprite = new Sprite();
borderCombat.name = "borderCombat";
//Great Britain ships are bright red, need to make combat border white
if ("GB" == finalShip.country) {
borderCombat.graphics.beginFill(0xFFFFFF, 1);
}
else {
borderCombat.graphics.beginFill(0xFF0000, 1);
}
borderCombat.graphics.drawRect(-1, -1, 52, 132)
borderCombat.graphics.endFill();
borderCombat.visible = false;
//add the borders as children of ship
finalShip.addChild(border);
finalShip.addChild(borderCombat);
//move the borders in z-order to behind ship counter, so they show looking like a border
border.parent.setChildIndex(border, border.parent.getChildIndex(border) - 5);
borderCombat.parent.setChildIndex(borderCombat, borderCombat.parent.getChildIndex(borderCombat) - 6);
//PUSH TO MASTER SHIP ARRAYS
//finalShip is Side 1, add to master list of ship objects for Side 1
if (sideList[0] == finalShip.country) {
shipListSide1.push(finalShip);
//logging
if (log_shipCreation) {
trace(finalShip.name + " added to Shiplist1 in createShip()");
}
}
//Side 2, add to master list of ship objects for Side 2
else {
shipListSide2.push(finalShip);
//logging
if (log_shipCreation) {
trace(finalShip.name + " added to Shiplist2 in createShip()");
}
}
//disable events on all children
finalShip.mouseChildren = false;
//ship selection event handler
finalShip.addEventListener(MouseEvent.CLICK, selectShip);
}

TweenLite/TweenMax support for ConvolutionFilter

I am applying filters to a bitmap using something like:
TweenLite.to(origBitmap,0,{colorMatrixFilter:{saturation:2,brightness:3});
and that works fine.
I need to somehow apply a sharpen filter to origBitmap which I have successfully achieved using a ConvolutionFilter. The problem is after I've ran the above tweenlite call, then create a convolution filter and apply it to origBitmap, it removes the initial saturation and brightness filters and just keeps the sharpen filter
private function applyEffects(effects:Array):void
{
currentEffects = effects;
var props:Object = {};
for (var i:String in effects)
{
props[effects[i].effect] = effects[i].amount;
}
TweenLite.to(bitmap,0,{colorMatrixFilter:props});
//-- props could look like {saturation:2,brightness:3}
//-- This will sharpen the container sprite
var matrix:Array = [0, -1, 0,
-1, 5, -1,
0, -1, 0];
var conv:ConvolutionFilter = new ConvolutionFilter();
conv.matrixX = 3;
conv.matrixY = 3;
conv.matrix = matrix;
conv.divisor = 1;
bitmap.filters = [conv]; //-- this removes the above filters and just sharpens the image
}
Is there a way to also incorporate the ConvolutionFilter in that TweenLite call above? I've searched quite a bit and found some guy made a class called TweenMan which was based around your class where ConvolutionFilter is incorporated: https://github.com/danro/tweenman-as3
Nothing to do with TweenMax here since your code is the one making the mistake. This correctly removes all current filter and apply only one:
bitmap.filters = [conv];
Since filters property is either null or is an Array. To add a filter to the list you use array operation and reapply the array:
var filters:Array = bitmap.filters;
if(!filters)
{
filters = [];
}
filters.push(conv);
bitmap.filters = filters;
EDIT: starting over since I think I understand what you are trying to do. You are avoiding creating the filter yourself and let TwennLite do it for you even tough you don't need to tween anything. Don't do that, you are making everything harder for yourself. Instead create your filter that way:
var props:Object = {};
var colorMatrix:ColorMatrixFilter = new ColorMatrixFilter();
for (var i:String in effects)
{
colorMatrix[effects[i].effect] = effects[i].amount;
}
bitmap.filters = [colorMatrix];
//etc .... then
var filters:Array = bitmap.filters;
filters.push(conv);
bitmap.filters = filters;
If you need to animate multiple filters remember that most tween engine can tween easily array values so you can just do that and then apply those array values to your filters.

changing a target crosshair color in actionscript 3

I am stuck at a very basic problem which I am not quite able to figure out. I have 4 alienships and a crosshair which moves around with the mouse. I want to change the color of my crosshair to red when it is near one of the alienships. Both my alienships and crosshair are classes which extend movieclip. I use them in my main document class inside a main game loop which is triggered by the Enter_Frame event listener.
Here is my logic that checks for the same
private var objColor:ColorTransform = new ColorTransform();
private function overlayCursorMove() : void {
var initialColor:ColorTransform = new ColorTransform();
initialColor.color = 0xD3D3D3;
for(var i = 0; i < alienShipArray.length; i++){
var currentShip:AlienShip = alienShipArray[i];
if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) <= 30 ){
overlayCursor.transform.colorTransform = objColor;
}
else if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) > 30 ){
overlayCursor.transform.colorTransform = initialColor;
}
}
}
Below is the custom getDistance function inside the AlienShip class
public function getDistance(delta_x:Number, delta_y:Number):Number
{
return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
}
overlayCursor is my crosshair which moves around with my mouseX and mouseY positions. I have 4 alienships on my stage and all of them are stored inside the alienShipArray.
I am just calculating the distance between my crosshair and the currentship position to check if its less than a certain amount to change the crosshair color else if distance is greater change it back to previous color.
Surprisingly the logic only works for the very last ship in the array that is when the loop reaches i = 3 ( alienShipArray[3] ). For the rest of the ship the color of the crosshair stays the same!
You need to break out of your loop when you encounter an intersection, otherwise your loop will continue to run and the other non-intersecting aliens will cause the else if part of your condition to test true, and your crosshair will be changed back to its initial color.
That would explain why your code only works with the last alien in the loop, as there are no further iterations in that instance to reset the color.
Something like the following should do it (untested):
private var objColor:ColorTransform = new ColorTransform();
private function overlayCursorMove() : void {
var initialColor:ColorTransform = new ColorTransform();
initialColor.color = 0xD3D3D3;
for(var i:uint = 0; i < alienShipArray.length; i++) {
var currentShip:AlienShip = alienShipArray[i];
// Reset cursor back to initial color
overlayCursor.transform.colorTransform = initialColor;
if(currentShip.getDistance(overlayCursor.x - currentShip.x, overlayCursor.y - currentShip.y) <= 30 ) {
// Intersection found, change the cursor color
overlayCursor.transform.colorTransform = objColor;
// And break out of the loop so further iterations don't reset it
break;
}
}
// No intersections found, cursor remains in its initial state
}

AS3 .addEventListener in a loop?

I am creating a line of Sprite elements. Every sprite element has different job, when it is clicked. How can I make the function inside the addEventListener to know which button was clicked?
In this case, the traced value of i when it is cliicked is always 6. Which is wrong, because 6 is only the last element of the array. What about the rest of them, the beginning?
for (var i:int = 0; i < 6; i++) {
var barPart:Sprite = new Sprite();
barPart.x = i * (30);
barPart.y = 0;
barPart.graphics.beginFill(0x000000, 0.2);
barPart.graphics.drawRect(0, 0, 10, 10);
barPart.graphics.endFill();
barPart.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent):void {
trace(i);
});
}
When the application is build and the listeners are added, the loop has already executed, so the index "i" will always be six by the time the user ends up clicking the button.
To distinguish between the different items, use their "name" property (prop of DisplayObject) like shown ...
Try not to have listener function as a method closure in a loop, instead do this:
for (...)
{
... code
barPart.name = "barPart-" +i;
barPart.addEventListener(MouseEvent.CLICK, barPart_clickHandler);
}
and implement the function (event handler separately) like:
private function barPart_clickHandler(e:MouseEvent):void
{
// the event's target will let you know who dispatched the function
var name:String = Sprite(e.currentTarget).name;
name = name.replace("barpart-", "");
switch(name)
{
case '0':
// your code
break;
.
.
}
}
#Shally Virk - My mistake. I was thinking of MovieClip which is a dynamic object so it allows adding arbitrary fields. You are right, there are lots of ways to get around this problem, but your suggestion works fine.
While the cause is not clear to me, the answer is a little more simple,
The events are registered correctly, but flash takes the last computed value.
Knowing that we can work around.
The work around can either do like Shally Virk wrote, but that tends to get confusing on bigger scale. So we want something more general and simple.
Now here are the steps taking this in mind:
1. We know sprite are not dynamic, so we make class to extend spirte and make it dynamic. Since the class has basically 0 code, the only difference being the dynamic , the amount of memory added is small
2. Having the class here's the code:
for (var i:int = 0; i < 6; i++) {
var barPart:CustomSprite = new CustomSprite();
barPart.x = i * (30);
barPart.y = 0;
barPart.graphics.beginFill(0x000000, 0.2);
barPart.graphics.drawRect(0, 0, 10, 10);
barPart.graphics.endFill();
barPart.i = i;
barPart.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent):void {
trace(_event.currentTarget.i);
});
}
:)

How to swap bitmap in a symbol use jsfl

I want to swap a bitmap in symbol with another bitmap,and I found the the function
swapElement
This is what I have tried
var elements = item.timeline.layers[0].frames[0].elements;//item is the symbol
for (var j = 0; j < elements.length; j++) {
var el = elements[j];
if (el.instanceType == "bitmap") {
el.selected = true;//this line not work, so I want a way to make the element selected
dom.swapElement(targetName);//targetName is another bitmap name that I wanted
}
}
Setting selected to true of an element, will only select the element if the element is on screen (and the layer is unlocked and visible). So before selected is set to true library.editItem(item.name) should be called. If the element is in frame x, frame x has to be made the current frame with document.getTimeline().setSelectedFrames(parseInt(x), parseInt(x) + 1, true). (I use parseInt(x) as a cast because of a bug in setSelectedFrames). To be sure the element is the only element that is selected document.selectNone() should be called before setting selected to true.
Every instance has a libraryItem so maybe replacing the libraryItem is easier.
The code here can be adapted for a more selective replace.
From library? Then following snippet could help you
var libItems = fl.getDocumentDOM().library.items;
for (i = 0; i < libItems.length; i++){
if(libItems[i].itemType == “bitmap”){
//found bitmap :)
}
OK, what about:
fl.selectElement(el); //instead of el.selected = true;
dom.swapElement(targetName);//assuming you have targetName
This works if there is anything (one item) selected that is bitmap it will replace it with library item named "image4":
var dom = fl.getDocumentDOM();
var selection = dom.selection;
if(selection.length == 1 && selection[0].instanceType == "bitmap")
{
dom.swapElement("image4");
}