2015-01-21 7 views
0

배열 대신 객체로 작업하는 것을 배우기 위해 거의 1 주일을 보냈습니다. 나는 그것들을 불러내 어 어떤 물건을 만들고 그것들의 특성을 설정하는 것이 쉽다고 생각했다. 내가 지금에 액세스 할 수 없습니다 그러나, 나는이 시도 :를 사용하는 목적의 다른 어떤 객체를 처리하는 실용적인 방법이 있는지배열 대신 객체 사용

function onBoxClick(event:MouseEvent):void { 
    var str:String = event.currentTarget.name; 
    trace(str); 
    str = str.substring(str.indexOf("_") + 1); 
    trace(getChildByName("copy_" + str)); // trying to trace an object by name 
} 

내 질문입니다.

편집 :

function addBoxes(isUpdate:Boolean):void { 
    var copyOne:Object = getReadOnlyValues(); 
    copyOne.name = "copy_" + num; 

    // Set default mc1 settings 
    var settings1:Object = copyOne.mc1Settings; 
    for(var num2:String in settings1) { 
     copyOne.mc1[num2] = settings1[num2]; 
    } 

    // Set default mc1text settings 
    var settings2:Object = copyOne.mc1TextSettings; 
    for(var num3:String in settings2) { 
     copyOne.mc1Text[num3] = settings2[num3]; 
    } 

    copyOne.mc1.x = nextXpos; 
    copyOne.mc1.name = "captionBox_" + num; 

    addChild(copyOne.mc1); 
    copyOne.mc1.addEventListener(MouseEvent.CLICK, onCaptionClick); 

    copyOne.mc1Text.name = "captionBoxText_" + num; 
    copyOne.mc1.addChild(copyOne.mc1Text); 

    // --------------------------------------------------------------- 
    // Set default mc2 settings 
    var settings4:Object = copyOne.mc2Settings; 
    for(var num4:String in settings4) { 
     copyOne.mc2[num4] = settings4[num4]; 
    } 

    // Set default mc2text settings 
    var settings5:Object = copyOne.mc2TextSettings; 
    for(var num5:String in settings5) { 
     copyOne.mc2Text[num5] = settings5[num5]; 
    } 

    copyOne.mc2.x = nextXpos; 
    copyOne.mc2.y = copyOne.mc1.height; 
    copyOne.mc2.name = "box2_" + num; 

    addChild(copyOne.mc2); 

    copyOne.mc2Text.name = "box2BoxText_" + num; 
    copyOne.mc2.addChild(copyOne.mc2Text); 

    copyOne.mc2.addEventListener(MouseEvent.CLICK, onBoxClick); 

    if (num/subunits is int) { 
     trace (num); 

     // createMc("normalBox", true); 
    } 

    nextXpos = nextXpos + copyOne.mc2.width; 

    // traceObj(copyOne); 
    // traceObj(getReadOnlyValues()); 
} 

내가 루프에서이 기능 그래서 많은 동영상 클립을 만들라고 : 여기 동영상 클립 및 기타 물건을 만드는 데 사용하는 내 기능입니다. 이제 개체의 속성과 자녀 (예 : 텍스트 필드)에 액세스 할 수 없습니다.

무대에서 내가 가진 객체 : 무비 클립 및 텍스트 필드 그들이에서 온

: 내가 그들과 함께 할 노력하고있어 무엇

위의 기능 : (개체에 의해 만들었 었지된다) 추적 무비 클립 및 텍스트 필드 대신 내가 기대의 어떻게됩니까 (텍스트 필드) 텍스트

자녀 변경 : 추적 코드를 출력하는 대신 내가 형에게 trace(getChildByName("copy_" + str)); // trying to trace an object by name

객체주는 정의되지 accessi의 실제적인 방법이 있나요 이름이 "copy_1"이고 이름이 "box2_1"인 객체 (movieclip)?

+0

질문은 너무 일반적이며 철학적입니다. 해당 코드에서 정확히 작동하지 않는 것은 무엇인지 다시 말해보십시오. 당신은 그것에서 무엇을 기대하고 대신에 무엇을 얻고 있습니까? – evilpenguin

+0

답변 해 주셔서 감사합니다. 나는 그 질문을 편집했다. (일종의 철학적 :)) – nikel

+0

이 질문이 객체/배열과 표시 객체에 액세스하기위한 이벤트 리스너에 어떻게 관계가 있는지 모르겠습니다. 귀하의 코드에서 MovieClip이나 뭔가를 얻기 위해 문자열의 일부에 액세스하는 것처럼 보이지만 나에게 연결 해제는 "배열 대신 객체로 작업하는 것을 배우기 위해 거의 1 주일을 보냈습니다." –

답변

1

"copyOne"개체가 "addBoxes"의 범위 내에서 만들어 졌기 때문에 더 이상이 함수 외부에 존재하지 않습니다.

또 다른 하나는 호출하는 displayObjectContainer의 displayObjects를 처리하는 getChildByName을 통해 Object에 액세스하려고하는 것입니다.

Object 또는 MovieClips (둘 다 원하는대로 속성을 추가 할 수있는 동적 스타일 객체)로 변수를 느슨하게 추적하려면 MovieClip을 사용하여 값을 저장하면됩니다. 스테이지에있는 무비 클립은 displayList (스테이지)에서 제거 될 때까지 메모리에 유지됩니다.

또한 개체 컬렉션을 저장하는 키/값 기반 정렬의 일종 인 사전 (Dictionary)을 확인하십시오.

강력한 유형의 사용자 정의 객체 (자신의 클래스를 만들어 MC를 확장하고 공용 또는 개인 메서드와 값을 추가하는 경우)를 사용하면 벡터 (공상적이고 빠른 배열 선택한 모든 Object 유형과 호환 가능).

+0

답변 해 주셔서 감사합니다. 그래서 코딩을 해치고 커스텀 클래스를 사용하는 법을 배워야합니다. – nikel

0

귀하의 질문을 이해했는지 여부는 알 수 없지만 @ozmachine은 그의 answer에서 getChildByName을 사용할 수 없다고 생각합니다. 대신이 문제를 살펴보고 도움이 될 수 있다고 생각합니다. :

var container:DisplayObjectContainer = this; 

function getReadOnlyValues():Object { 
    return { 
     mc1: new box(), 
     mc1: { 
      name: 'mc1_', 
      alpha: 1, 
      x: 0, 
      y: 0, 
      width: 30, 
      height: 25 
     }, 
     mc1Text: new TextField(), 
     mc1Text: { 
      text: 'test', 
      x: 0, 
      y: 0, 
      selectable: false, 
      multiline: false, 
      wordWrap: false 
     } 
    } 
}; 

// create 5 objects 
for(var i=0; i<5; i++){ 

    container['copy_'+i] = getReadOnlyValues(); 

    var obj:Object = getObjectByName('copy_'+i); 
     obj.mc1.alpha = 1; 
     obj.mc1.x = 0; 
     obj.mc1.y = 50 * i; 
     obj.mc1.width = 100; 

     obj.mc1.addChild(obj.mc1Text); 
     obj.mc1Text.text = 'test_' + i; 

    addChild(obj.mc1); 
} 
// get object by name 
function getObjectByName(name:String):Object { 
    return container[name]; 
} 

// change the text of the 4th button 
stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void { 
    var obj:Object = getObjectByName('copy_3'); 
     obj.mc1Text.text = 'new text'; 
}) 
0

배열과 개체는 모두 데이터 구조입니다. 데이터는 어떤 형태의 정보를 의미합니다. 데이터 구조 란 특정 형태로 저장된 정보를 의미합니다.

정보를 저장하는 두 가지 방법으로 Array와 Object가 있습니다.

배열은 정수로 데이터를 식별합니다. 어레이의 각 요소를 식별 정수 번호

어레이는 서로에 속하는 유사한 것들의 목록을 나타내는 이상적인 인덱스라고한다.

var names:Array = ["John", "Paul", "George", "Ringo"]; 

이것은 종종 배열의 요소는 위의 예에서와 같이, 동일한 유형의 것을 의미한다. 그러나 그들은 필요가 없습니다에 : "네 비틀즈의 이름은 무엇인가"당신이 중 우연히 않은 숫자의 다른 어떤 표현이 질문에 대답하기 쉽고 위의 예 "를 들면

var numbers:Array = [42, "twenty-five", "XIIV"]; 

당신의 역사적인 마을 여행? " 다른 질문은 대답하기가 어렵거나 불가능합니다. "역사적인 도시에서 어떤 로마 숫자가 우연히 발견 되었습니까?"

개체는 이름이있는 데이터를 식별합니다. 객체의 단일 요소를 식별하기위한 이름

객체가 서로에 속하는 서로 다른 것들의 목록을 제시하는 이상적인되는 특성이라고합니다.

var paula:Object = {age:37, name:"Paula", hairColor:0x123456}; 

이것은 종종 대상의 요소가 상기 예에서와 같은 다른 유형의 것을 의미한다.

var car:Object = {manufacturer:"Porsche", color:"red", sound:"wroooooom", soundOfDriver:"weeeeeeeeeeee"}; 

이 고려,의 당신의 코드를 살펴보고 그것이 어떻게 적용되는지 살펴 보자 : 은 그러나 그들은 필요가 없습니다. 큰 그림은 여러 번 호출하는 addBoxes 함수가 있다는 것입니다. 하나의 함수가 하나의 목적을 가져야하므로 이 함수는 실행될 때마다과 비슷한 기능을 수행합니다. 어 - 오 : "비슷한". 이 함수의 결과가 무엇이든 관계없이 배열로 이동해야합니다. 해당 함수를 호출 할 때마다 배열의 요소가됩니다. "num"을 사용하면이 기능을 명확하게 볼 수 있으며 현재 실행중인 기능을 식별 할 수 있습니다.

기능에 어떤 데이터가 있습니까?

  • copyOne
  • MC1
  • mc1Text
  • mc2는
  • mc2Text

copyOne 여기 말썽이고 무엇이 당신의 혼란을 야기한다. 모든 것을 한꺼번에 처리하려고하므로 Array를 사용할시기와 Object를 명확하게 생각할 수 없습니다. 하나는 신 개체라고 부릅니다. 그리고 그 주위에 가지고 좋은 개체가 아닙니다.

변수 이름에 대한 선택이 매우 잘못되었습니다. 나중에 "mcX"와 같은 수퍼 일반 이름을 선택하여 나중에 실제로 이름이 무엇인지 설명하는 이름 속성을 추가 할 수 있습니다. 그러나 "Box2"가 무엇이든지간에 그것은 사실 일 수 없습니다. 코드의 내용을 이해하기 쉽도록 이름을 선택하십시오. 이 질문에 대해이 구조체 jsut의 전부 또는 일부를 만든 것처럼 보이므로 의미있는 이름이 없습니다. 작성한 프로젝트로 배우지 않는 것이 좋습니다. 하지만 현실 세계에서.

그래서 저는 다음과 같은 목표 부과됩니다 MC1을 내가 다시 물어 mc1Text 캡션 MC2를 대표하고 mc2Text이 모든으로 콘텐츠

을 나타냅니다 어떤 데이터 것은에 존재

당신의 기능?

  • captionBox
  • captionText
  • contentBox
  • contentText

모두 자막과 내용은 상자와 텍스트로 구성되어 있습니다. 이것들은 다른 것이므로 캡션과 내용은 각각 "box"와 "text"속성을 가진 객체입니다 이 유사성으로 인해 둘 다 배열로 생각해야합니다. 하지만 나는 달랐다. 캡션과 텍스트는 같은 것이 아닙니다. 캡션과 텍스트를 다르게 처리합니다. 길거리를 걷다 보면 뉴스 속의 큰 캡션을 빨리 잡을 수 있지만 긴 텍스트는 볼 수 없습니다. 이것이 각각이 함수에서 생성 된 객체의 속성이어야하는 이유입니다.

여기에 다소 결론의이다 : 이것은

var allBoxes:Array = []; // array to store the similar results of every function call 

function createBoxes():void 
{ 
    var boxes:Object = {}; 

    //the box consists of caption & content, both bying of the same type, but are containing different data 

    boxes.caption = {box:{}, text:{}}; //caption 
    boxes.content = {box:{}, text:{}}; //content 

    allBoxes.push(boxes); 
} 

입니다. 그것이 왜 객체와 배열을 사용하여 데이터를 모델링 할 것인가와 그 이유입니다.

하지만 여기서 끝나지 않습니다. 내 결론에는 게시 한 코드가 많지 않습니다. 위 코드는 대부분 언어에 독립적이지만 누락 된 코드는 데이터를 모델링하는 방법뿐만 아니라 Actionscript에만 해당됩니다. 다음과 같습니다 ...

As3은 객체 지향입니다. 위의 결론에 많은 개체가 포함되어 있기 때문에 좋습니다. 어떤 객체가/do/moves/farts/etc 인 방법을 정의하려면 클래스를 만듭니다.

다음과 같이 변경 (이 답변의 범위를 벗어난 이유로) 개최 :

(이전 addBoxes라고도 함)
  • createBoxes이 스프라이트를 확장하는 클래스 "CaptionAndContent"의 생성자를 호출합니다.
  • 생성자가 정확하게 수행 할 때 명시 적으로 객체 "상자"를 만들 필요가 없습니다.
  • content은 상자 자체 일 수 있기 때문에 "상자"속성을 갖지 않습니다. 이것은 질문의 코드에서 정확히 완료된 것입니다. 기본 설정은 해당 클래스의 생성자에서 설정됩니다.여기

희망 어떻게 클래스 모습처럼 보여 코드 조각을 감소시켰다. 각 클래스는 필요한 가져 오기, 패키지 블록 및 질문에서 지정하지 않은 추가 기능을 포함하는 자체 파일에 있어야합니다. 다음과 같이 보일 것을 사용

public class CaptionAndContent extends Sprite 
{ 
    private var caption:Caption; 
    private var content:Content; 

    public function CaptionAndContent(captionText:String = "", contentText:String = "") 
    { 
     caption = new Caption(captionText); 
     addChild(caption); 

     content = new Content(contentText); 
     content.y = caption.height; 
     addChild(content); 
    } 
} 

public class ClickableBoxWithText extends Sprite 
{ 
    protected var textField:TextField; 
    public function ClickableBoxWithText(text:String = "") 
    { 
     textField = new TextField(); 
     textField.text = text; 
     addChild(textField); 

     addEventListener(MouseEvent.CLICK, onClick); 
    } 

    protected function onClick(mouseEvent:MouseEvent):void 
    { 
     //override this in a sublclass 
    } 
} 

public class Caption extends ClickableBoxWithText 
{ 
    public function Caption(text:String = "") 
    { 
     super(text); 

     // apply all the default settings of caption here. 
    } 
} 

public class Content extends ClickableBoxWithText 
{ 
    public function Content(text:String = "") 
    { 
     super(text); 

     // apply all the default settings of content here. 
    } 
} 

:

var allBoxes:Array = []; // array to store the similar results of every function call 

function createBoxes():void 
{ 
    var captionAndContent:CaptionAndContent = new CaptionAndContent("This is the caption...", "...for this content"); 
    captionAndContent.x = nextXpos; 
    addChild(captionAndContent); 

    allBoxes.push(captionAndContent); 
} 

마지막으로, 클릭 처리기에서 식별 문제. 귀하의 질문에 이미 답이 포함되어에서 클릭 된 객체에 대한 참조입니다

event.currentTarget 

합니다. 내 코드에서는이 이미 개체를 식별

mouseEvent.currentTarget 

될 것이다. 이름을 얻기 위해 이미 이름을 밝히지 않은 동일한 객체를 식별하기 위해 이름에 대한 모든 객체를 검색하기 위해 속성 (예 : 이름) 중 하나를 조회하는 것은 의미가 없습니다.

어쨌든 이름으로 개체를 식별하지 않습니다. 이름 사이에 어떤 점이 다르며 그 이름이 고유하게 보이는 것은 결국에는 숫자입니다. 이 대답에서 지적한 바와 같이, 이것이 인덱스라고 불리는 것으로, 인덱스로 식별하려고하는 것은 배열에 있어야합니다. 예제 코드에서는 allBoxes입니다.

관련 문제