2013-02-21 105 views
0

我想通过我的数组中的3个图像循环并将其添加到舞台(使用easelJS)。我也想定位它。当我尝试访问数组中的图像时,出现错误,说我无法设置未定义的x。为什么不能访问easeljs位图的x变量?为什么我不能访问位图的x变量? (javascript)

function displayPosters() { 

    getPosters(); //get all images and assign it to designated array 

      console.log(frontPosters); 
      console.log(frontPosters.length); 

    if(currentCat == Category.HOME) { //if current category is HOME 

     for(var i = 0; i < frontPosters.length; i++) { //loop through posters 

      frontPosters[i].x = 40; //set x position for testing, also where error occurs 
      stage.addChild(frontPosters[i]); //add poster to stage 

     } 

    } 

} 

这里是加载和推送这些图像到frontPosters arrray的代码。

var frontPosters = new Array(3); 

function getPosters() { 

    var games = new Image(); //create 3 images 
    var apps = new Image(); 
    var aboutme = new Image(); 

    games.onload = function() { //add image to frontImages array on load 

     var gamesPost = new createjs.Bitmap(games); 
     frontPosters[0] = gamesPost; 

    }; 

    apps.onload = function() { 

     var appPost = new createjs.Bitmap(apps); 
     frontPosters[1] = appPost; 

    }; 

    aboutme.onload = function() { 

     var amPost = new createjs.Bitmap(aboutme); 
     frontPosters[2] = amPost; 

    }; 

    games.src = "images/assets/posters/games_poster.jpg"; 
    apps.src = "images/assets/posters/apps_poster.jpg"; 
    aboutme.src = "images/assets/posters/aboutme_poster.jpg"; 

} 

回答

1

使用for(poster in frontPosters)是不好的做法,因为你实际上遍历数组对象,而不是值(又称为数组本身)。改为使用for(var i=0; i<frontPosters.length; i++)。这是最简单的解决方案,IMO。

for(var i = 0; i < frontPosters.length; i++) { //loop through posters 
    frontPosters[i].x = 40; //set x position for testing, also where error occurs 
    stage.addChild(frontPosters[i]); //add poster to stage 
} 

编辑

我认为你正在处理一个竞争条件。您将在之前加载您的阵列所有图像都已加载。通过设置var frontPosters = new Array(3);,您可以自动将三个值设置为undefined,这些值将被推入到新阵列中。

在继续处理脚本之前,您应该检查是否加载了所有图像。

这里有一个想法给你。设置一个回调,只有在加载第三张图片后才能运行。

var frontPosters = new Array(3); 

function getPosters(callback) { 

    var games = new Image(), 
     apps = new Image(), 
     aboutme = new Image(), 
     loaded = 0; 

    games.onload = function() { 
     frontPosters[0] = new createjs.Bitmap(this); 
     if (++loaded === 3) callback(); 
    }; 

    apps.onload = function() { 
     frontPosters[1] = new createjs.Bitmap(this); 
     if (++loaded === 3) callback(); 
    }; 

    aboutme.onload = function() { 
     frontPosters[2] = new createjs.Bitmap(this); 
     if (++loaded === 3) callback(); 
    }; 

    games.src = "images/assets/posters/games_poster.jpg"; 
    apps.src = "images/assets/posters/apps_poster.jpg"; 
    aboutme.src = "images/assets/posters/aboutme_poster.jpg"; 

} 

function displayPosters() { 

    getPosters(function() { 
     if(currentCat == Category.HOME) { //if current category is HOME 
      for(var i = 0; i < frontPosters.length; i++) { //loop through posters 
       frontPosters[i].x = 40; //set x position for testing, also where error occurs 
       stage.addChild(frontPosters[i]); //add poster to stage 
      } 
     } 
    }); //get all images and assign it to designated array, only after all images were loaded 

} 
+0

问题是,当我做“frontPosters [0] .x = 40;”或类似的东西,错误仍然发生。 – kag359six 2013-02-21 23:50:14

+0

那么只要我们不知道'frontPosters'包含什么,恐怕不可能帮助你。您可以尝试在'for'循环之前添加'console.log(frontPosters);'然后打开您的开发工具(或萤火虫)控制台并查看该数组包含的内容。如果它没有澄清事情,请将它添加到您原来的帖子中,至少我们会知道我们正在处理的是什么。 – iMoses 2013-02-21 23:51:29

+0

我说它包含3张图片。但如果有帮助,我会发布处理这些图像的代码。 – kag359six 2013-02-21 23:53:26

相关问题