• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Передать массив из js в as3

Contributor ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

I have 3 symbol movie clips (Ant 11, Ant 20, Ant 30). They have to appear on stage. Instances of 3 symbols are written in an array. If the array is written to AS, then everything works well. If the array is written to JS, then the array in AS is transmitted incorrectly and the movie clip scene (And 11, And 20, And 30) does not appear. How to fix it? The array must always be in the JS file. I hope I explained it clearly, I attach the source code and a video demonstrating the problem

JS Code:

 

function callMyPanel(panelName, arg) 
{	
    if (fl.swfPanels.length > 0)
	{ 
        for (i = 0; i < fl.swfPanels.length; i++)
		{ 
			if (fl.swfPanels[i].name == panelName)
			{
				fl.swfPanels[i].call("callSWF", arg); 
				break; 
			} 
        } 
    } 
    else 
        fl.trace("no panels"); 
}


images = ['Ant11', 'Ant20', 'Ant30'];


callMyPanel("ABCD", images.join(", "));

 

 

 AS Code: 

 

stage.scaleMode = StageScaleMode.NO_SCALE

function fromJSFL(arg: String): void {
	
	/*var images:Array = [Ant11, Ant20, Ant30];*/
	var images:Array = arg.split(",");
	
	

 
makeGrid();
 
function makeGrid():void {
    var gridContainer:Sprite = new Sprite();
    // numObjects is the number of objects in the array
    var numObjects:int = images.length;
    var numCols:int = 5;
    var column:int = 0;
    var row:int = 0;
    var gap:Number = 2;
    var cell:DisplayObject;
    for (var i:int = 0; i < numObjects; i++) {
        column = i % numCols;
        row = int(i / numCols);
        // get corresponding object from the array
        cell = images[i];
        cell.x = (cell.width + gap) * column;
        cell.y = (cell.height + gap) * row;
        gridContainer.addChild(cell);
        trace(i, "\tcolumn =", column, "row =", row);
    }
    gridContainer.x = gridContainer.y = 20;
    addChild(gridContainer);
}
	
}

ExternalInterface.addCallback('callSWF', fromJSFL);
MMExecute('fl.runScript(fl.configURI + "/WindowSWF/ABCD.jsfl");');

 

 Video demonstrating the problem:

https://drive.google.com/file/d/1rjlKbxSwpJptQlmgF4hz2e4sTP0Uu67s/view?usp=sharing

 

Source file:

https://drive.google.com/file/d/1ivwrsV2DLnqaNCUSHsxj9FEEcVv6FSuV/view?usp=sharing

TOPICS
ActionScript , Code , Error , Exchange extensions

Views

557

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Nov 20, 2022 Nov 20, 2022

well, i certainly helped you.  you'll need to unnest those anonymous functions.

 

however, fixing that error won't fix other errors.

 

to that end, use array notation to coerce strings to objects:

 

addChild(this["Ant11"]);

 

or

 

addChild(this[images_primer[0]]);

Votes

Translate

Translate
Community Expert ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

don't nest anonymous functions and be carefully about making variables local to functions:

 

 

stage.scaleMode = StageScaleMode.NO_SCALE;

var images:Array;

 

function fromJSFL(arg: String): void {
/*var images:Array = [Ant11, Ant20, Ant30];*/
images = arg.split(",");
makeGrid();

}

function makeGrid():void {
var gridContainer:Sprite = new Sprite();
// numObjects is the number of objects in the array
var numObjects:int = images.length;
var numCols:int = 5;
var column:int = 0;
var row:int = 0;
var gap:Number = 2;
var cell:DisplayObject;
for (var i:int = 0; i < numObjects; i++) {
column = i % numCols;
row = int(i / numCols);
// get corresponding object from the array
cell = images[i];
cell.x = (cell.width + gap) * column;
cell.y = (cell.height + gap) * row;
gridContainer.addChild(cell);
trace(i, "\tcolumn =", column, "row =", row);
}
gridContainer.x = gridContainer.y = 20;
addChild(gridContainer);
}


Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

The array(images) is located in another file (JS). During operation, it is assumed that the array will change. I need it to be imported into the AS file without changes (As I understand now it is imported with string values, this is wrong, so the code does not work). How do I fix this?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

use the same code as you were using before in your jsfl (not js) file and the same code to call your jsfl file.

 

i just showed how to fix the problem you're seeing by unnesting makeGrid() from fromJSFL().

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

Unfortunately, it didn't help me. Maybe I asked the wrong question. When trying to add symbol MC (Ant 11) to the scene, an error occurs. All elements in the array must be a string (This is the main condition!). How do I convert a string to a property (I don't know exactly how it is called correctly, it is written in the instance name (Shown in the picture))?

var images_primer: Array = ['Ant11', 'Ant20', 'Ant30'];
addChild(images_primer[0]);

1111.PNG

 An error is issued:  TypeError: Error #1034: Type Coercion failed: cannot convert "Ant11" to flash.display.DisplayObject.
at ABCD_fla::MainTimeline/frame1()

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

well, i certainly helped you.  you'll need to unnest those anonymous functions.

 

however, fixing that error won't fix other errors.

 

to that end, use array notation to coerce strings to objects:

 

addChild(this["Ant11"]);

 

or

 

addChild(this[images_primer[0]]);

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

Yes, that's what I need! Thanks

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 20, 2022 Nov 20, 2022

Copy link to clipboard

Copied

LATEST

you're welcome.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines