AS3 Поворот текста вокруг изображения - PullRequest
1 голос
/ 30 декабря 2011

Я нашел этот код в сети, и он достиг определенного движения, которое я хочу использовать.К сожалению, он использует числовые значения вместо текста.Я следовал всем его инструкциям, но попытался заменить Vector массивом, и получил ошибку.Я получаю сообщение об ошибке: «1199: параметры типа с параметризованным типом».Это потому, что я добавил значение массива вместо вектора, что сделал этот парень.То, что он имеет в своем уроке, правильно с числовыми значениями.Также он создал класс .as с именем Item.as.Вот код AS, который находится на основной временной шкале в новом слое, называемом действиями моего .fla файла с именем rotate.fla:

   //Save the center coordinates of the stage
   var centerX:Number=stage.stageWidth/2;
   var centerY:Number=stage.stageHeight/2;

   //The number of items we will have (feel free to change!)
   var NUMBER_OF_ITEMS:uint=6;

   //Radius of the menu circle (horizontal and vertical)
   var radiusX:Number=200;
   var radiusY:Number=100;

   //Angle difference between the items (in radians)
   var angleDifference:Number = Math.PI * (360 / NUMBER_OF_ITEMS) / 180;

   //How fast a single circle moves (we calculate the speed
   //according to the mouse position later on...)
   var angleSpeed:Number=0;

   //Scaling speed of a single circle
   var scaleSpeed:Number=0.0002;

   //This vector holds all the items
   //(this could also be an array...)
   var itemVector:Array.<Item>=new Array('1', '2', '3', '4', '5').<Item>;

   //This loop creates the items and positions them
   //on the stage
   for (var i:uint = 0; i < NUMBER_OF_ITEMS; i++) {

//Create a new menu item
var item:Item = new Item();

//Get the angle for the item (we space the items evenly)
var startingAngle:Number=angleDifference*i;

//Set the x and y coordinates
item.x=centerX+radiusX*Math.cos(startingAngle);
item.y=centerY+radiusY*Math.sin(startingAngle);

//Save the starting angle of the item.
//(We have declared the Item class to be dymamic. Therefore,
//we can create new properties dynamically.)
item.angle=startingAngle;

//Add an item number to the item's text field
item.itemText.text=i.toString();

//Allow no mouse children
item.mouseChildren=false;

//Add the item to the vector
itemVector.push(item);

//Add the item to the stage
addChild(item);
 }

  //We use ENTER_FRAME to animate the items
  addEventListener(Event.ENTER_FRAME, enterFrameHandler);

 //This function is called in each frame
 function enterFrameHandler(e:Event):void {

 //Calculate the angle speed according to mouse position
angleSpeed = (mouseX - centerX) / 5000;

//Loop through the vector
for (var i:uint = 0; i < NUMBER_OF_ITEMS; i++) {

    //Save the item to a local variable
    var item:Item=itemVector[i];

    //Update the angle
    item.angle+=angleSpeed;

    //Set the new coordinates
    item.x=centerX+radiusX*Math.cos(item.angle);
    item.y=centerY+radiusY*Math.sin(item.angle);

    //Calculate the vertical distance from centerY to the item
    var dy:Number=centerY-item.y;

    //Scale the item according to vertical distance
    item.scaleY = (dy / radiusY);

    //If we are above centerY, double the y scale
    if (item.y<centerY) {
        item.scaleY*=2;
    }

    //Set the x scale to be the same as y scale
    item.scaleX=item.scaleY;

    //Adjust the alpha according to y scale
    item.alpha=item.scaleY+1.1;

     }



       }

  }

Также, как указано, есть класс .as с именем Item.as.Это в отдельном файле.Код выглядит следующим образом:

package {
import flash.display.MovieClip;
public dynamic class Item extends MovieClip {
    public function Item() {
       }
      }
     }

Если вы следуете его указаниям, оно будет работать для числового значения, но я хочу использовать массив и поместить строковые значения из массива в фильм «Предмет».клип, где вы все увидите, числовые значения находятся внутри формы круга.У меня есть ссылка на его учебник «Вращающееся меню», где он состоит из 9 шаговВот ссылка:

Вращающееся меню

Спасибо всем за помощь.Я только что вернулся в ActionScript / Flash

1 Ответ

0 голосов
/ 01 января 2012

Эрк, просто прочитайте учебник, на который вы ссылаетесь, и изменение с Vector на Array (которое я не рекомендую), кажется, меньше всего вас беспокоит. Я предлагаю вам оставить его как Vector (это более эффективно, и статическая типизация ничего не дает, но помогает в этом случае) и оставить большую часть кода как есть. Код, который нужно изменить, таков:

//Add an item number to the item's text field
item.itemText.text=i.toString();

item.itemText.text на самом деле содержит String, так что вы там в чистом виде. Происходит то, что вы конвертируете i (индекс этого Item в векторе) в String, чтобы его можно было отобразить. Теперь вы должны изменить это так, чтобы оно показывало то, что вы хотите.

Существует множество способов сделать это - поскольку вы используете программу Flash, вы можете использовать встроенные функции! Поскольку Item расширяет MovieClip, вы можете заменить строку ранее на:

//Changes the item's frame to the same as its index
item.gotoAndStop(i);

Затем в среде разработки (Flash) сделайте так, чтобы у каждого элемента меню была отдельная рамка.

Надеюсь, это поможет!

Я оставил в своем описании, как изменить Вектор на Массив ниже, на случай, если у вас есть причина для этого. Примечание: то, что я сказал выше, предполагает, что вы НЕ внесли эту модификацию.


Я не прочитал весь этот код, но похоже, что проблема здесь:

//This vector holds all the items
//(this could also be an array...)
var itemVector:Array.<Item>=new Array('1', '2', '3', '4', '5').<Item>;

Синтаксис .<Item> работает только для векторов, поэтому вам нужно от него избавиться. Эта строка будет выглядеть так для массива:

var itemVector:Array = new Array('1', '2', '3', '4', '5');

Код может иметь больше проблем, но это конкретно относится к указанной вами ошибке.

...