2010-02-07 60 views
0

我创建一个使用瓷砖和XML文件的游戏。我试图从外部服务器检索这些文件。当我在本地机器上以调试模式运行程序时,它工作得很好。但是当我上传到服务器。我得到这个错误的SecurityError:错误#2122:安全沙箱冲突:LoaderInfo.content:

SecurityError: Error #2122: Security sandbox violation: LoaderInfo.content: 
A policy file is required, but the checkPolicyFile flag was not set when this media was loaded. 

下面是我的代码

private function init():void 
     { 
      game = new EngineApi(); 
      gameObject.eApi = game; 
      gameObject.EG = this; 
      game.Tiling(true,800,640,80,80); 
      game.tileEg.offsY = 7000; 
      game.tileEg.ScrollLoop(true,0,1,true);//0,1 
      context.checkPolicyFile = true; 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/tileSheet.png"); 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world.xml");//map 0 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world1.xml");//map 1 

      flash.system.Security.loadPolicyFile("http://mysite.com/images/world7.xml");//world 7 and 8 are train track maps. map 2 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world8.xml");//map 3 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world9.xml");//Ending of 8 //map 4 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world10spaceInvader.xml");//Beginning of tracks being centered //map 5 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world11LoopBoss.xml");//Tracks loop (you fight boss) //map 6 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world12toDesert.xml");//map 7 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world2.xml");//map 8 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world3.xml");//map 9 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world13DesertDoubleTrain.xml");//map 10 
      flash.system.Security.loadPolicyFile("http://mysite.com/images/world14DoubleTrain.xml");//map 11 



      game.AddTileSheet("http://mysite.com/images/tileSheet.png"); 
      game.tw = 80; 
      game.th = 80; 
      game.LoadTileSheets(); 

      game.addEventListener("tileLoadComplete", prePareTiles); 
      //anything labeled with map (i.e. map 1) is the order of how the game see's it 

      game.addXml("http://mysite.com/images/world.xml");//map 0 
      game.addXml("http://mysite.com/images/world1.xml");//map 1 

      game.addXml("http://mysite.com/images/world7.xml");//world 7 and 8 are train track maps. map 2 
      game.addXml("http://mysite.com/images/world8.xml");//map 3 
      game.addXml("http://mysite.com/images/world9.xml");//Ending of 8 //map 4 
      game.addXml("http://mysite.com/images/world10spaceInvader.xml");//Beginning of tracks being centered //map 5 
      game.addXml("http://mysite.com/images/world11LoopBoss.xml");//Tracks loop (you fight boss) //map 6 
      game.addXml("http://mysite.com/images/world12toDesert.xml");//map 7 
      game.addXml("http://mysite.com/images/world2.xml");//map 8 
      game.addXml("http://mysite.com/images/world3.xml");//map 9 
      game.addXml("http://mysite.com/images/world13DesertDoubleTrain.xml");//map 10 
      game.addXml("http://mysite.com/images/world14DoubleTrain.xml");//map 11 
      game.loadXmlMaps(); 


      clouds = new CloudManager(5); 
      clouds.minSpeed = 25; 
      clouds.maxSpeed = 35; 
      game.addGameChild(clouds); 

     } 

下面是我的EngineApi()类

public function addXml(path:String):void 
      { 
       xmlDatas.push(path); 
      } 


public function loadXmlMaps():void 
     { 
      var gLoader = new gameLoader(); 
      gLoader.xmlToArray(xmlDatas.shift(),10,100); 
      gLoader.addEventListener("xmlComplete", FinishXmlMaps); 
     } 

     public function FinishXmlMaps(e:Event) 
     { 
      if(useTiles) 
      { 
       tileEg.mapHolder.push(gameLoader(e.currentTarget).tileArray); 
      } 

      if(xmlDatas.length > 0) 
      { 
       loadXmlMaps();    
      }else 
      { 
       dispatchEvent(new Event("XMLSCOMPLETE")); 
      } 
     } 

这是我gameLoader类代码

public function xmlToArray(s:String, cols:Number, rows:Number):void 
     { 
      this.cols = cols; 
      this.rows = rows; 

      //load in tile sheet image 
      var xmlLoader; 
      xmlLoader = new URLLoader(); 
      xmlLoader.addEventListener(Event.COMPLETE, xmlLoadComplete); 
      xmlLoader.load(new URLRequest(s)); 
     } 

     private function xmlLoadComplete(e:Event):void 
     { 
      var mazeData = new XML(e.currentTarget.data) as XML; 
      //loop through xml and add rows and columns to aTileMap array 
      for (var rowCtr=0;rowCtr<rows;rowCtr++) { 
       var tempArray:Array=new Array(); 

       for (var colCtr=0;colCtr<cols;colCtr++) { 
        tempArray.push(mazeData.tilerow[rowCtr].tilecol[colCtr]); 
       }    
       tileArray.push(tempArray); 
      } 
      trace("xml done"); 
      dispatchEvent(new Event("xmlComplete")); 
     }//END XMLLOAD 

下面的代码几乎是数据通过检索并将xml转换为数组的过程。这一切都有效。我只是得到一个错误,因为我猜想它是一个跨域问题。我的问题是我如何解决它。

回答

3

它就像你正在使用错误的方法调用Security.loadPolicyFile功能似乎给我。它用于读取控制服务器如何允许Flash Player从中获取数据的特殊XML文件,而不是用于加载图像或其他文件(如在您的loadPolicyFile(“http://mysite.com/images/tileSheet.png”)调用中)。

下面是Security.loadPolicyFile的文档:

http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/system/Security.html#loadPolicyFile()

这里是策略文件的信息:

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08.html

关于如何解决跨域问题,最简单的方法是把一个crossdomain.xml文件放在服务器的根目录下。其中,您可以指定允许哪些域从服务器获取数据。您可以使用*来允许任何域。这里是允许任何域的crossdomain.xml的例子:

http://api.flickr.com/crossdomain.xml

Flash Player将自动查找该文件,在必要的时候,你的ActionScript代码不需要采取任何进一步的行动了拥有。

使用对Security.loadPolicyFile()主要用于哪里有需要更多的控制和/或细粒度跨域比政策的情况。

+0

这整个政策文件仍然是相当混乱给我,但阅读链接后,你给现在我可以看到,为什么你的答案显得更加扑朔迷离......所以,我感觉compeled要么在这里或大量添加其他的答案编辑你的。你说什么? – cregox 2011-07-06 09:44:48

+0

请添加另一个答案。 – 2011-07-06 10:15:38

相关问题