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

시도 : 당신은 Flex 프레임 워크를 사용 여부, 두 번째는 무엇이 최선인지 될 경우 당신이 일을 처리해야

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

이 꽤 많은 요인에 따라 달라집니다, 내 목록에 번호 하나가 될 것이다 주어진 응용 프로그램에 대해. 귀하의 경우에는 그냥 플래시 IDE를 사용하는 것 같습니다.

당신은 디스플레이 트리에 추가하는 꽃 개체의 컬렉션을 갖고 싶어합니다. 그런 다음 클릭시 임의로 꽃을 제거하는 대신 클릭 한 대상을 사용하여 선택한 "꽃"을 알 수 있습니다.

꽃 컬렉션을 가지고있는 다른 좋은 점은 실제로 가시성을 전환 할 수 있다는 것입니다 (이 또한 터치/클릭이 개체와 상호 작용할 수있는 기능을 토글합니다). 그런 다음 한 번에 생성 된 모든 꽃 개체를 가비지 수집 및 톤 이상 개체 생성 (대신 개체 풀링이라는 용어 아래의 Daniel이 지적한) 대신 재사용 할 수 있습니다.

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로 선언하고 해당 var (Flower)에 저장된 객체의 유형을 지정했기 때문에 범위는 해당 함수의 여는 중괄호와 중괄호로 제한됩니다. 필자가 정의한 변수의 경우 코드가 포함 된 객체를 사용할 수있는 한 사용할 수 있어야합니다.

AS3의 클래스에서 변수 또는 함수를 선언 할 때 사용할 수있는 세 가지 기본 "범위 수정 자"(public, protected 또는 private)가 있습니다. public을 사용한다는 것은 클래스 정의 (일반적으로 파일, something.as)뿐만 아니라 다른 것으로도 속성/메소드 (멤버)에 액세스 할 수 있다는 것을 의미합니다. 변수를 public으로 만들면 코드를 사용하는 모든 것으로 수정할 수 있습니다. 외부로부터의 변경이 의도하지 않은 경우 응용 프로그램의 예측할 수없는 동작을 초래할 수 있습니다. 보호 된 방법을 사용하면 클래스를 상속하거나 확장하는 모든 요소가 보호 된 멤버에 액세스하거나 사용할 수 있지만 개체 인스턴스 만있는 요소 만 이러한 멤버에 액세스 할 수 있습니다 (따라서 액세스 한정자라는 용어). 세 번째 수준은 private이며 모든 클래스에서 클래스에있는 코드 만 멤버에 액세스 할 수 있지만 클래스의 상속/하위 클래스는 멤버에 액세스 할 수 없습니다. 이것은 본질적으로 컴퓨터 과학에서 일반적으로 캡슐화라고하는 개념의 구현입니다. 더 많은 세부 사항이 있지만, 실제로 그것은 괜찮은 SO 게시에 대해 이미 너무 길어지고 있습니다.

+1

객체 풀링이라고합니다. – Daniel

+0

@Daniel right,이 글을 쓸 때 용어가 내 마음을 어지럽게했습니다. – shaunhusain