добавление спрайтов в контейнер из flash - PullRequest
0 голосов
/ 07 января 2011

В настоящее время я работаю в flashbuilder и импортировал SWC, содержащий контейнер рейтинга.Этот контейнер содержит 5 рейтингов, они помечены как «Рейтинг1», «Рейтинг2», «Рейтинг3», «Рейтинг4», «Рейтинг5». Они находятся на сцене. У меня также есть спрайт под названием «Звезда», и когда я, например, нажимаюна «Rating4», то каждый рейтинг от 1 до 4 должен получить Stah Star Sprite, добавленный к ним, когда я снова нажимаю на Rating 3 или что-то, тогда только 3 первые 3 должны добавить звезду. Я попробовал следующее:

    detailContent.RatingContainer.addEventListener(MouseEvent.CLICK, ratingClickHandler);

    private function ratingClickHandler(e:MouseEvent):void{
                rating = e.target.name;
                rating = rating.replace("Rating","");
                for (var i:uint = 1; i==uint(rating); i++){
                    star = new Rated();
                    detailContent.RatingContainer.getDefinitionByName("Rating"+e.target.name).addChild(star);
}

но это вообще не работает. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 07 января 2011

Похоже, довольно сложный способ сделать это.

Один из вариантов - иметь рейтинг.Класс Rating будет иметь выбранную & индексную переменную.Когда выбрано, символ Звезды будет виден, если нет, то видимость Звезд будет ложной.

Свойство index будет указывать позицию рейтинга и будет установлено при добавлении экземпляра на сцену.

В вашем классе RatingContainer у вас будут объекты Vector of Rating, каждый объект прослушиваетна событие клика.

    private var ratings:Vector.<Rating> = new Vector.<Rating>();

    private function addRatings():void
    {
        for( var i:int ; i < 5 ; ++i )
        {
            var r:Rating = new Rating();

            r.index = i;
            r.addEventListener( MouseEvent.CLICK , ratingClickHandler );
            ratings.push( r);

            //set the rating position
            r.x = 10 * i;
            addChild( r );
        }
     }



     private function ratingClickHandler( event:MouseEvent ):void
     {
          var rating:Rating = event.currentTarget as Rating;

          for( var i:int ; i < ratings.length ; ++i )
             if( ratings[i].index <= rating.index )
                ratings[i].selected = true
              else
                ratings[i].selected = false;
     }

В вашем рейтинге класса

     private var _selected:Boolean;
     private var star:Sprite = new Star();

     public function set selected(value:Boolean ):void
     {
         star.visible = value;
         _selected = value;
     }
0 голосов
/ 07 января 2011

Прежде всего, вам действительно нужно ввести переменные, например:

var rating:String = e.target.name;

Это делает код намного проще для чтения и понимания. Во-вторых, я не уверен, что вам нужен getDefinitionByName, если Content.RatingContainer является DisplayObject, вы можете получить доступ к спрайту рейтинга следующим образом:

Content.RatingContainer["Rating" + e.target.name]

Проблема с кодом заключается в том, что вы объединяете e.target.name в «Rating», поэтому вы действительно ищете спрайт с именем «RatingRating0», например. Похоже, что должно быть:

detailContent.RatingContainer.getDefinitionByName("Rating"+rating).addChild(star);

, поскольку рейтинг - это идентификатор, который вы добавили в конце имен спрайтов на сцене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...