2013-05-28 42 views
1

我將如何更改actionscript代碼以使測驗能夠從更長的列表中呈現一組隨機答案?例如,我可以將測驗僅包含來自包含12個答案的XML文件的4個隨機答案作爲標記嗎?如何從更大的答案陣列添加到第四階段的數學隨機答案?

我可以把所有的12個答案放在所有的標誌出來,並在問題文本字段中只有一個問題女巫是其中一個標誌的名稱,但不知道如何隨機得到只有四個標誌並把它們在舞臺上,並在文本字段

XML示例名稱之一:

<flags> 
    <flag path="../assets/flags/flag1.png">        
     <country> 
      Aeland    
     </country> 
    </flag> 

    <flag path="../assets/flags/AmSamoa.png">        
     <country> 
      AmSamoa   
     </country> 
    </flag> 

    <flag path="../assets/flags/Bahamas.png">        
     <country> 
      Bahamas    
     </country> 
    </flag> 
    <flag path="../assets/flags/CostaRica.png">        
     <country> 
      Costa Rica    
     </country> 
    </flag> 
    <flag path="../assets/flags/CotedIvorie.png">        
     <country> 
      Cotedivoire   
     </country> 
    </flag> 
    <flag path="../assets/flags/Croatia.png">        
     <country> 
      Croatia    
     </country> 
    </flag> 

我的AS3代碼:

private function onXMLLoad(event:Event):void 
{   
    _xml = new XML(event.target.data); //create XML document_xmlLoader.removeEventListener(Event.COMPLETE, onXMLLoad); 
    _myFlagList = new XMLList(_xml.flag); 

    _xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    // _xml.ignoreWhitespace = false;   
    // trace("MyFlag: _answers: ",_answers);   
    //trace(_loader);   
    //trace(targetBtn); 
    //trace(_myFlagList); 


    for each (var flagPath:XML in [email protected]) 
    { 
     trace("MyFlag: flagaths: ",flagPath); 
     _flagPaths.push(flagPath); 
    } 


    for each (var flag:XML in _xml.flag.country) 
    {  //trace("MyFlag: flagaths: ",flag);  
     _allFlags.push(flag); 
    } 

    createButtons(); 

} 


private function onIOError(event:IOErrorEvent):void 
{ 
    _xmlLoader.removeEventListener(Event.COMPLETE, onXMLLoad); 
    _xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    trace('IO Error:', event.text); 

} 

private function createButtons():void 
{ 


    var col:int; 
    var row:int;  
    flagContainer = new Sprite(); 


    trace("Number of flags",_allFlags.length); 


    for (var i:int = 0; i < NUMBER_OF_BTNS; i++) 
    { 
     _answers.push(_allFlags[i]); 

     targetBtn = new FlagButton(_allFlags[i],_flagPaths[i]);    
     targetBtn.x = col * (targetBtn.width + 10)+20; 
     targetBtn.y = row * (targetBtn.height+ 10)+20; 
     flagContainer.addChild(targetBtn); 
     addChild(flagContainer); 



     col++; 

     if(col == 3) 
     { 
      col = 0; 
      row++; 
     } 
    } 



    randomOption(); 
} 
private function randomOption():void 
{ 


    trace("MyFlag: all flags: ", _allFlags);   

    flagToFind = _allFlags[Math.floor(Math.random() * _allFlags.length)]; 
    trace("MyFlag: flag to find: ", flagToFind);   

    _bk.text.text=flagToFind; 

} 

回答

0

你基本上要一個A對象的掠奪。或許,這將是更好,如果你安排你的XML標記爲這樣:

<flag> 
    <path>../assets/flags/flag1.png</path> 
    <country>Aeland</country> 
</flag> 

有了這個,你將最終的flag在XML對象數組,可以重複。

關於從數組中隨機選擇 - 這是一個更容易的任務,只要確保您沒有選擇您之前選擇的索引。

var selected:Array=[]; 
while (selected.length<4) { 
    var si:int=Math.floor(Math.random()*flags.length); 
    if (selected.indexOf(si)==-1) selected.push(si); 
} 
trace(flags[selected[0]]); // first selected flag 
trace(flags[selected[3]]); // fourth selected flag 
+0

非常感謝您的開關輸入, – Herbert3009

+0

謝謝你的回答,它幫助了很多,一個問題,它給我的只有兩個對象,但如果我想有四個對象所有的時間?你怎麼做,同時我想顯示他們在一個invosoble按鈕,預先感謝您的時間 – Herbert3009

+0

好吧,我已經展示瞭如何訪問一個單一的對象中選出的四個,使用這種技術來訪問所有其中。關於這個按鈕,你需要在其中創建四個地方,以便每個地方都可以接受這種類型的對象,然後分配或者使用addChild()或chenge文本或任何你認爲合適的東西。 – Vesper