2012-04-12 2 views
1

Flex를 배우고 간단한 RPG를 연습하려고합니다. 뷰 상태를 사용하여 화면 간을 전환합니다. 지금 나는 내 캐릭터 정보를 보여주는 HomeView.mxml, 내 인벤토리 아이템을 보여주는 InventoryView.mxml, 장비 아이템을 보여주는 EquipmentView.mxml을 가지고있다. 각각은 각각의 뷰 상태를가집니다.Flex에서 뷰 상태가 변경 될 때 함수 실행

을 주 mxml 파일에 넣으면 게임의 항목 및 ArrayCollection에 대한 전역 변수를 만듭니다. 그것은 재고 및 장비에 대한 mxml에 2 개의 라벨을 생성합니다. 라벨을 클릭하면 currentState = "EquipmentView"또는 "InventoryView"를 설정하는 클릭 핸들러가 호출됩니다.

이 상태가 변경되고 각각의 뷰가 올바르게 표시됩니다 .

내 EquipmentView 상태에 문제가 있습니다. 처음 상태에 들어갈 때, 장비에 이미지를 표시하고 클릭 핸들러를 설정하는 creationComplete 함수가 있습니다. 항목을 클릭하면 장비를 "정리 해제"하고 장비 목록에서 제거하고 이미지를 제거합니다. 이 또한 잘 작동하지만 재고보기 및 항목을 "장비"및 EquipmentView 돌아갈 때 이미지가 표시되지 않습니다. 내 equipmentList 변수의 길이를 계산하고보기를 전환 할 때 정확한 레이블을 가지고 있지만 이미지를 다시 표시 할 수 없습니다.

보기가 변경되면 내 displayEquippedItems() 함수 (원래 creationComplete에서 호출 됨)를 호출 할 수 있습니까?

protected function displayEquippedItems():void 
     { 
      Alert.show("Displaying Items"); 
      for (var i:int = 0; i<c.equippedItems.length; i++) 
      { 

       var item:Item = c.equippedItems.getItemAt(i) as Item; 
       switch (item.type) 
       {      
        case 'Weapon': 
         var il:ItemImage = new ItemImage(item); 
         il.source = "../assets/sword.gif"; 
         il.scaleX=.25; 
         il.scaleY=.25; 
         il.horizontalCenter=-80; 
         il.verticalCenter=-30; 
         il.addEventListener(MouseEvent.CLICK, equippedItemClicked); 
         equipGroup.addElement(il);       
         break; 
        default: 
         Alert.show("Didnt find a weapon"); 
         break; 
       } 
      } 
     } 

ItemImage 내가 그 이미지 구성 요소를 확장하고 단지 그렇게 내가 이름을 얻을 수 표시되는 항목 입력에 변수 "항목을"설정 정의 된 클래스 (이다 : 여기

내 기능입니다 결국 또한 equipGroup 내가 당신이 원하는 무엇을 믿는 달성하기 위해 몇 가지 방법이 있습니다

답변

3

난 장비 아이템

어떤 도움이 좋을 것를 유지하기 위해 MXML에 정의 된 단지 그룹, 덕분에) 이미지 소스를 변경 에.

첫 번째는 updateComplete event입니다. creationComplete는 구성 요소의 생성주기가 완료된 후 한 번만 실행되지만, updateComplete 이벤트는 구성 요소가 다시 그릴 때마다 실행됩니다. 나는 의심의 여지가 없다.이 행사는 당신이 원하는 것을 할 것이다. 그러나 코드를 너무 자주 실행하는 것에주의해야합니다. 많은 요소로 인해 구성 요소가 다시 그리도록 할 수 있으며 매우 구체적인 사용 사례가있는 것처럼 들립니다.

두 번째로 살펴볼 것은 show 이벤트입니다. 구성 요소가 표시 될 때마다 실행됩니다. 상태가이 구성 요소를 나타내는 상태로 변경되면 실행되어야합니다.

귀하의 특정 질문에 답변하십시오; stageChangeComplete 이벤트를 사용하여 상태 변경이 완료 될 때마다 코드를 실행할 수 있습니다. 귀하의 경우에는 쇼 이벤트와 유사하게 작동 할 수 있다고 생각합니다. 그러나 당신은 다른 곳에서 그것을 듣고있을 것입니다. stateChangeComplete 이벤트는 상태를 포함하는 구성 요소에서 수신 대기하는 이벤트입니다. show 이벤트는 인벤토리가 포함 된 구성 요소에서 수신 대기하는 이벤트입니다. 나는 상태를 제어하는 ​​구성 요소의 하위라고 가정합니다.

+0

updateComplete 완벽를 입력 할 때 enterState 이벤트 핸들러를 사용하여

, 당신의 코드는 정말 감사 실행합니다! stateChangeComplete를 사용했지만 제대로 된 장소에서 듣지 않아 couldnt이 작동하도록했습니다. updateComplete는 내가 원하는 것을 정확하게 수행하고있는 것처럼 보입니다. 나는 쇼도 시도 할 것입니다. – Aheinlein

3

State 개체로 전달되는 enterState 이벤트를 사용할 수도 있습니다.이 같은 MXML에서 이벤트 리스너를 추가 할 수 있습니다

<s:states> 
    <s:State name="myState" enterState="myEventHandler()"/> 
</s:states> 

무엇 'updateComplete'이벤트는 다음이에 대한 더 나은 것은 때마다 파견 얻을 것이다 FlexEvent.UPDATE_COMPLETE 구성 요소가 완전한 "플렉스 컴포넌트 생명주기"의 실행을 완료한다는 것입니다 . 그래서, 당신이하는 일에 따라, 당신이 필요로하는 것보다 더 많은 시간 동안이 이벤트가 전달되고 이벤트 핸들러가 트리거된다는 것을 알 수 있습니다. 특정 상태 :

+0

저는이 답변을 생각하고 있었고 그것을 보았습니다. 그리고 내가 돌아와서 +1해야한다고 결정했다. 좋은 대답. – JeffryHouser

+0

답장을 보내 주셔서 감사합니다. Sunil D. 불행히도 enterState가 제 특정 상황에서 제대로 작동하지 않습니다 (잘못 입력했을 수도 있습니다). 내 문제는 내 이벤트 처리기가 내 mxml보기 파일의