Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Меню-карусель (http://www.flasher.ru/forum/showthread.php?t=113544)

N1ka 01.07.2008 22:29

Меню-карусель
 
Вложений: 1
Доброго времени суток.
Только учусь AS но загорелся я таким меню и незнаю как его реализовать. Нашел на AS1/AS2 простенький пример карусели, думаю его немного модернизовать и сделать из него меню, но сначала нужно написать то же на AS3. Пробовал я перевести его но не получается по незнанию. Прошу о помощи.

Вот код на AS1/AS2:
Код:

var numOfBalls:Number = 10;
var radiusX:Number = 250;
var radiusY:Number = 75;
var centerX:Number = Stage.width / 2;
var centerY:Number = Stage.height / 2;
var speed:Number = 0.05;

for(var i=0;i<numOfBalls;i++)
{
        var t = this.attachMovie("ball","b"+i,i+1);
        t.angle = i * ((Math.PI*2)/numOfBalls);
        t.onEnterFrame = mover;
}

function mover()
{
        this._x = Math.cos(this.angle) * radiusX + centerX;
        this._y = Math.sin(this.angle) * radiusY + centerY;
        var s = this._y /(centerY+radiusY);
        this._xscale = this._yscale = s*100;
        this.angle += this._parent.speed;
        this.swapDepths(Math.round(this._xscale) + 100);
}

this.onMouseMove = function()
{
        speed = (this._xmouse-centerX)/1500;
}

Если нужно, вот исходник:

BlooDHounD 01.07.2008 23:16

тоесть вы хотите, что бы за Вас полностью написали класс? раздел работы тут недалеко.

П.С.: обычно в этом разделе спрашивают о проблемах, а не просят сделать всё за них.

wvxvw 01.07.2008 23:53

Если вы код, как есть перенесете в класс-файл, оформите его в класс, привяжете его к клипу в библиотеке, замените свойства с подчерком на аналогичные из АС3, swapDepth() на swapChildrenAt(), attachMovie() на addChild(new SomeMyMenuItem()), замените обработчики событий на функции слушающие соответствующие события - по идее будет работать.
Из недостатков этого: кода - t лучше было объявить вне функции. Использовать обращения к свойствам там, где нужно быстро посчитать - не продуктивно. Нет никакой необходимости динамически создавать свойства. Нет типизации.

N1ka 02.07.2008 13:00

Цитата:

Сообщение от BlooDHounD (Сообщение 749358)
П.С.: обычно в этом разделе спрашивают о проблемах, а не просят сделать всё за них.

Я подумал что проще будет сделать все, чем обьяснять мне каждую проблему. Но в таком случае, я выложу до чего дошел.

Цитата:

Сообщение от wvxvw (Сообщение 749363)
Если вы код, как есть перенесете в класс-файл, оформите его в класс, привяжете его к клипу в библиотеке, замените свойства с подчерком на аналогичные из АС3, swapDepth() на swapChildrenAt(), attachMovie() на addChild(new SomeMyMenuItem()), замените обработчики событий на функции слушающие соответствующие события - по идее будет работать.
Из недостатков этого: кода - t лучше было объявить вне функции. Использовать обращения к свойствам там, где нужно быстро посчитать - не продуктивно. Нет никакой необходимости динамически создавать свойства. Нет типизации.

Спасибо за совет. Пробовал еще до создания этой темы, но не получалось. Не мог из
Код:

var t = this.attachMovie("ball","b"+i,i+1);
сделать такое же с addChild(), ибо я так понял что по цыклу создается несколько "ball" только каждому дается имя "b"+i. Так вот думал я, искал, читал, придумал как такое сделать, но незнал правильно ли, потому что компилить не мог из-за еще ошибок. Но теперь исходя из подсказки "attachMovie() на addChild(new SomeMyMenuItem())" вижу что не то делал.

Вот что я сделал: На таймлайне пусто, в библиотеке есть мувиклип "item" которому присвоен несуществующий класс main.Item, Document class: main.Carousel.
Вот сам main.Carousel, но он сделан до той степени до какой смог:
Код:

package main{
        import flash.display.MovieClip;
        import flash.events.*;
        public class Carousel extends MovieClip{
                var numOfItems:Number = 1;
                var radiusX:Number = 250;
                var radiusY:Number = 75;
                var centerX:Number = stage.stageWidth/2;
                var centerY:Number = stage.stageHeight/2;
                var speed:Number = 0.05;
                function Carousel(){
                        for (var i=0; i<numOfItems; i++){
                                var t = this.addChild(new Item()); //Скорей всего это неправильно, но незнаю как правильно
                                t.angle = i * ((Math.PI*2)/numOfItems);
                                t.addEventListener(Event.ENTER_FRAME, mover);
                        }
                }
                private function mover(){
                        //Тут нечто изменил, но пока незнаю правильно ли, ибо еще не дошел. Пробовал компилить, ошибки выдает по поводу angle.
                        /*this.x = Math.cos(this.angle) * radiusX + centerX;
                        this.y = Math.sin(this.angle) * radiusY + centerY;
                        var s = this.y /(centerY+radiusY);
                        this.xscale = this.yscale = s*100;
                        this.angle += this(parent).speed;
                        this.swapChildrenAt(Math.round(this._xscale) + 100);*/

                }
        }
}

Ну вот, теперь все за меня делать не придется, остается только поправить. ;)
Помогите пожалуйста разобратся.

ramshteks 02.07.2008 14:51

Код:

var t = this.addChild(new Item());
не верна эта строка, я думаю вернее будет так
Код:

addChild(new Item())
правда не знаю как отреагирует флеш на то что этот класс не существует, но вроде как н автоматом создает его, просто пустой, наверное будет все норм)

etc 02.07.2008 15:32

Цитата:

Сообщение от ramshteks (Сообщение 749486)
Код:

var t = this.addChild(new Item());
не верна эта строка, я думаю вернее будет так
Код:

addChild(new Item())
правда не знаю как отреагирует флеш на то что этот класс не существует, но вроде как н автоматом создает его, просто пустой, наверное будет все норм)

Какой класс не существует?

N1ka 02.07.2008 16:05

Цитата:

Сообщение от ramshteks (Сообщение 749486)
Код:

var t = this.addChild(new Item());
не верна эта строка, я думаю вернее будет так
Код:

addChild(new Item())

А как тогда t обьявить, чему должно равнятся?
Я пробовал раньше так:
Код:

var t:Item = new Item();
addChild(t);

Но у меня не компилилось потому что это несуществующий класс, да еще и подсказка wvxvw была "attachMovie() на addChild(new SomeMyMenuItem())", то я решил что мой вариант не правильный.
Цитата:

Сообщение от __etc (Сообщение 749497)
Какой класс не существует?

main.Item

Может я вообще должен Document class оставить пустым, а main.Carousel присвоить мувиклипу "item", но тогда там тоже с этим addChild незнаю как поступить. Потому не делал так, да еще и в оригинале весь код писался не на мувиклип, а в первом кадре.

Эхх, и как же мне поступить с этим addChild и переменной t? И правильно ли я присвоил классы? Не совсем понял wvxvw и ramshteks.:wacko:

ramshteks 02.07.2008 16:05

ну как я понял класс Item это пустой класс прилепленный к мувику...

ramshteks 02.07.2008 16:10

нет... ты напиши сам класс Item запихни туда все обработчики событий. Как я понял Item это мувик в будущем? знач все что этот мувик сам с собой сделать может запихни в этот класс.

а создавай так:

Код:

var menuItem:Item=new Item();
addChild(menuItem);


N1ka 02.07.2008 16:27

Цитата:

Сообщение от ramshteks (Сообщение 749516)
нет... ты напиши сам класс Item запихни туда все обработчики событий. Как я понял Item это мувик в будущем? знач все что этот мувик сам с собой сделать может запихни в этот класс.

а создавай так:

Код:

var menuItem:Item=new Item();
addChild(menuItem);


Ок. Так я и делал. Вот что в main.Item:
Код:

package main{
        import flash.display.MovieClip;
        public class Item extends MovieClip{
                function Item(){
                        //Cоздается отражение
                        masker.cacheAsBitmap = ref.cacheAsBitmap = true;
                        ref.mask = masker;
                }
        }
}

Но тут в main.Carousel:
Код:

package main{
        import flash.display.MovieClip;
        import flash.events.*;
        public class Carousel extends MovieClip{
                var numOfItems:Number = 1;
                var radiusX:Number = 250;
                var radiusY:Number = 75;
                var centerX:Number = stage.stageWidth/2;
                var centerY:Number = stage.stageHeight/2;
                var speed:Number = 0.05;
                function Carousel(){
                        for (var i=0; i<numOfItems; i++){
                                var menuItem:Item = new Item();
                                menuItem.name = "item"+i //Это чтобы было похоже на var t = this.attachMovie("ball","b"+i,i+1);, тоесть чтобы каждый item имел название +i, незнаю правильно ли
                                addChild(menuItem);
                                menuItem.angle = i * ((Math.PI*2)/numOfItems); //А вот тут ошибка, из-за нее я и решил обратится на форум, потому что думал что наблудил с Item и addChild. Ошибка вот такая: 1119: Access of possibly undefined property angle through a reference with static type main:Item.
                                menuItem.addEventListener(Event.ENTER_FRAME, mover);
                        }
                }
                private function mover(){
                        /*this.x = Math.cos(this.angle) * radiusX + centerX;
                        this.y = Math.sin(this.angle) * radiusY + centerY;
                        var s = this.y /(centerY+radiusY);
                        this.xscale = this.yscale = s*100;
                        this.angle += this(parent).speed;
                        this.swapChildrenAt(Math.round(this._xscale) + 100);*/

                }
        }
}

С этого я и начинал... Как тут поступить? Может опять не так понял..


Часовой пояс GMT +4, время: 22:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.