0

好的,所以我正在製作一個小遊戲,用戶隨機挑選一些隨機產生的花朵。當一朵花摘下時,它會消失,用戶可以獲得積分。在AS3中產卵和摧毀東西

下面是我的一些代碼:(?我將如何得到它在範圍內,順便)

import flash.events.MouseEvent; 

function makeFlower() { 

    var flower:Flower = new Flower(); 

    addChild(flower); 
    flower.x = Math.random() * 500; 
    flower.y = Math.random() * 400; 
} 

function removeFlower(event:MouseEvent):void { 
    flower.pick(); 
} 


setInterval(makeFlower, 2500); 
addEventListener(MouseEvent.CLICK, removeFlower); 

所以在上面的代碼中,flower.pick()不起作用,因爲它超出了範圍。 ..這是一個問題。但是這個問題讓我質疑花的創造應該發生在哪裏。將addChild()放在我的構造函數方法中會更好嗎?

然後破壞的一部分......檢測被點擊的花朵的事件監聽器......這應該是分開的(就像我擁有它一樣)還是應該將它放入花類中?我是ActionScript新手,想知道應該將事情放在哪裏。

謝謝!

回答

3

嘗試:

import flash.events.MouseEvent; 

var flower:Flower; 

function makeFlower() { 
    flower = new Flower(); 
    addChild(flower); 
    flower.x = Math.random() * 500; 
    flower.y = Math.random() * 400; 

    flower.addEventListener(MouseEvent.CLICK, removeFlower); 
} 

function removeFlower(event:MouseEvent):void { 
    event.target.pick(); 
    //removeChild(event.target); // active this to remove the clicked flower 
} 

setInterval(makeFlower, 2500); 
+0

喜歡它這是更簡單的版本 – shaunhusain

2

您應該在哪裏處理事情取決於好幾個因素,我的名單上的頭號會,如果你使用Flex框架與否,排名第二的將是什麼,最好是對於給定的應用程序。你的情況看起來你只是使用Flash IDE。

您將想要添加到顯示樹的花對象的集合。然後點擊你想使用點擊的目標來知道他們選擇了哪一朵「花朵」,而不是隨意去掉一朵花。

收集鮮花的另一個好處是,您實際上可以切換可見性(這也切換觸摸/點擊與對象交互的能力)。然後你可以一次性創建Flower對象,或者至少重新使用,而不必被垃圾收集,並創造更多的對象(正如丹尼爾指出的,術語是對象池)。

import flash.events.MouseEvent; 

var allFlowers:Array = []; 
var oldFlowers:Array = []; 

function makeFlower() { 
    var flower:Flower; 

    if(oldFlowers.length>0) //if there's stale ones, already created but since picked 
    { 
     flower = oldFlowers.pop();//grab the last one from the list 
     flower.visible=true;//show it, update to position below should happen fast enough so you won't see it move 
    } 
    else 
     flower = new Flower(); 

    allFlowers.push(flower); 

    addChild(flower); 

    flower.addEventListener(MouseEvent.CLICK, removeFlower); //Adding the listener directly to the Flower object, assuming it's a Sprite/MovieClip/InteractiveObject of some sort 

    flower.x = Math.random() * 500; 
    flower.y = Math.random() * 400; 
} 

function removeFlower(event:MouseEvent):void { 
    var clickedFlower:Flower = (event.target as Flower); //this is a local reference 
    clickedFlower.pick(); //assuming this toggles the visibility 
    oldFlowers.push(allFlowers.splice(clickedFlower,1)); //removing it from the "active array" putting it in the "stale array" 
} 


setInterval(makeFlower, 2500); 

理想的應該都可以用一種類包裹起來,真的作用域變量只是讓方式更有意義,我在一個類中不僅僅是在一些代碼塊晃來晃去的地方的情況下。

由於在你的原始代碼中,你聲明瞭這個花是一個var,並賦予它存儲在該var(Flower)中的對象的類型,它的作用域僅限於該函數的打開和關閉花括號。在我定義的變量的情況下,只要包含代碼的對象可用,它們應該可用。

在AS3中的類(即public,protected或private)中聲明變量或函數時,可以使用三種主要的「範圍修飾符」。使用公共方法可以在類定義(通常是文件some.as)內訪問屬性/方法(成員),也可以通過其他任何方法訪問,如果您將變量設爲public,則可以使用代碼進行修改,可能會導致您的應用程序的不可預測的行爲,如果從外部的變化是意想不到的。使用受保護的手段任何從類繼承或擴展類可以訪問/使用受保護的成員,但沒有任何只有對象的實例可以訪問這些成員(因此稱爲訪問修飾符)。第三個級別是私有的,這意味着只有該類中的代碼(跨所有方法)才能訪問該成員,但該類的繼承/子類不能訪問該成員。這實質上是計算機科學中通常稱爲封裝的概念的實現。還有更多的細節,但是對於一個體面的SO帖子來說它已經太長了。

+1

它被稱爲對象池 – Daniel

+0

@丹尼爾,當我寫這篇文章時, – shaunhusain