Форум 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);*/

                }
        }
}

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

ramshteks 02.07.2008 16:38

ну дружок...) а у тя свойство angle есть?) судя по всему нет))
если ты имел ввиду свойство мувика отвечающее за поворот то нужно использовать rotation вместо angle ))

а еще... код вызывает сомнение :
Код:

masker.cacheAsBitmap = ref.cacheAsBitmap = true;
ref.mask = masker;

не понятно где ты обьявляешь masker'а и ref'а

N1ka 02.07.2008 17:26

Цитата:

Сообщение от ramshteks (Сообщение 749536)
ну дружок...) а у тя свойство angle есть?) судя по всему нет))
если ты имел ввиду свойство мувика отвечающее за поворот то нужно использовать rotation вместо angle ))

а еще... код вызывает сомнение :
Код:

masker.cacheAsBitmap = ref.cacheAsBitmap = true;
ref.mask = masker;

не понятно где ты обьявляешь masker'а и ref'а

Действительно, спасибо, rotation какраз подходит. ;)
А этот код:
Код:

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
                                addChild(menuItem);
                                menuItem.rotation = i * ((Math.PI*2)/numOfItems);
                                menuItem.addEventListener(Event.ENTER_FRAME, mover);
                        }
                }
                private function mover(){
                        this.x = Math.cos(this.rotation) * radiusX + centerX;
                        this.y = Math.sin(this.rotation) * radiusY + centerY;
                        //var s = this.y /(centerY+radiusY); //Должно работать и без этой строки
                        //this.scaleX = this.scaleY = s; //Должно работать и без этой строки

                        this.rotation += this(parent).speed;
                        //this.swapChildrenAt(Math.round(this.scaleX) + 100); //Должно работать и без этой строки
                }
        }
}

...но при компиляции в Output пишет:
ArgumentError: Error #1063: Argument count mismatch on main::Carousel/::mover(). Expected 0, got 1.
и не работает. В чем трабл?

ramshteks 02.07.2008 18:14

Код:

private function mover(evt:Event){
                        this.x = Math.cos(this.rotation) * radiusX + centerX;
                        this.y = Math.sin(this.rotation) * radiusY + centerY;
                        //var s = this.y /(centerY+radiusY); //Должно работать и без этой строки
                        //this.scaleX = this.scaleY = s; //Должно работать и без этой строки
                        this.rotation += this(parent).speed;
                        //this.swapChildrenAt(Math.round(this.scaleX) + 100); //Должно работать и без этой строки
                }

думаю так заработает)

N1ka 02.07.2008 18:32

Цитата:

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

private function mover(evt:Event){
                        this.x = Math.cos(this.rotation) * radiusX + centerX;
                        this.y = Math.sin(this.rotation) * radiusY + centerY;
                        //var s = this.y /(centerY+radiusY); //Должно работать и без этой строки
                        //this.scaleX = this.scaleY = s; //Должно работать и без этой строки
                        this.rotation += this(parent).speed;
                        //this.swapChildrenAt(Math.round(this.scaleX) + 100); //Должно работать и без этой строки
                }

думаю так заработает)

Не заработало:
TypeError: Error #1006: value is not a function.
at main::Carousel/::mover()

Но зато на экране наконец-то появился один menuItem, такой красивый, с отражением. Ура!

ПС. А какая разница между (e:Event), (evt:Event), (event:Event)? А если нет разницы, то зачем писать "e" или "evt" или "event"?

etc 02.07.2008 18:34

Цитата:

Сообщение от N1ka (Сообщение 749575)
ПС. А какая разница между (e:Event), (evt:Event), (event:Event)?

Никакой.

ramshteks 02.07.2008 18:46

слушай проблема может быть в обработчике событий...
сделай одну вещь... перенеси фун-цию мувер в Item и там же прикрепляй событие к мувику...

а в карусели только создавай и аттач мувики, но не работай с событиями

N1ka 02.07.2008 18:58

Цитата:

Сообщение от N1ka (Сообщение 749575)
Не заработало:
TypeError: Error #1006: value is not a function.
at main::Carousel/::mover()

Но зато на экране наконец-то появился один menuItem, такой красивый, с отражением. Ура!

Итак, дебаггер показал в какой строке ошибка и я ее ликвилировал, но...
Код:

private function mover(event:Event){
                        this.x = Math.cos(this.rotation) * radiusX + centerX;
                        this.y = Math.sin(this.rotation) * radiusY + centerY;
                        var s = this.y /(centerY+radiusY);
                        this.scaleX = this.scaleY = s;
                        this.rotation += this.speed; //Тут должно быть то же что и "this.angle += this._parent.speed;", и вот ошибка была в "this.rotation += this(parent).speed;", но удалив "(parent)" все заработало, только вот незнаю хорошо ли это.
                        //this.swapChildrenAt(Math.round(this.scaleX) + 100); //Пока без этого должно работать
                }

Результат радует но не очень. Все как есть работает отлично, по кругу бегает menuItem удаляясь и приближаясь, но. Именно не радует то что когда я в
Код:

var numOfItems:Number = 1;
сделал не 1 а 10 итемов:
Код:

var numOfItems:Number = 10;
то вместо десяти menuItems бегает всего лишь один, быстрее чем нужно и мало того, еще и боком, тоесть сам menuItem перекручен на несколько градусов.

ramshteks 02.07.2008 19:05

так проблемка та наверное в том, что ты и не создаешь их... вернее создаешь, но каждый раз перезаписываешь...

Код:

function Carousel(){
var menuItemArray:Array=new Array;
                        for (var i=0; i<numOfItems; i++){
                                menuItemArray[i] = new Item();
                                menuItemArray[i].name = "item"+i
                                addChild(menuItemArray[i]);
                                menuItemArray[i].rotation = i * ((Math.PI*2)/numOfItems);
                                menuItemArray[i].addEventListener(Event.ENTER_FRAME, mover);
                        }
                }

вот такую карусель попробуй...)

N1ka 03.07.2008 00:23

Цитата:

Сообщение от ramshteks (Сообщение 749592)
так проблемка та наверное в том, что ты и не создаешь их... вернее создаешь, но каждый раз перезаписываешь...

Код:

function Carousel(){
var menuItemArray:Array=new Array;
                        for (var i=0; i<numOfItems; i++){
                                menuItemArray[i] = new Item();
                                menuItemArray[i].name = "item"+i
                                addChild(menuItemArray[i]);
                                menuItemArray[i].rotation = i * ((Math.PI*2)/numOfItems);
                                menuItemArray[i].addEventListener(Event.ENTER_FRAME, mover);
                        }
                }

вот такую карусель попробуй...)

Сделал так и вот результат:
Как я и говорил ранее "вместо десяти menuItem бегает всего лишь один, быстрее чем нужно и мало того, еще и боком, тоесть сам menuItem перекручен на несколько градусов".

Удивительно, результат тот же что и предыдущий несмотря на то что main.Carousel.as с измененным кодом я сохранил. :away:

И еще одно наблюдение, menuItem когда бегает по кругу, он бегает не стабильно перекручена несколько градусов, а бегает по кругу и постепенно перекручивается что аж верхногами кружиться и т.д...

И еще наблюдение, что я пропустил, даже если создать один menuItem
Код:

var numOfItems:Number = 1;
он хоть и бегает по кругу с нормальной скоростью, но оказуется тоже переворачуется просто очень медленно, т.е. со временем становиться верхногами и т.д. От скорости беганья зависит скорость переворачивания, это написано у нас тут:
Код:

this.rotation += this.speed;
Смотря на эту строку можно задуматься зачем нам в карусели чтобы menuItem переворачивался? Это уже не карусель а центрифуга получается, а достижением такой цели мы не занимаемся.

Исходя из этого приходит мысль о том что старый
Код:

menuItem.angle
не равняется новому
Код:

menuItem.rotation
Значит вместо angle должно быть не rotation, а что-то другое. Что? Чем заменить в AS3 строку
Код:

menuItem.angle = i * ((Math.PI*2)/numOfItems);
или если это и в AS3 должно работать, то почему у меня не хочет. В чем ошибка?

ramshteks 03.07.2008 01:14

то что переворачивается... это у тя дело просто в геометрии...
задавать угол поворота тока через rotation, задавать надо в градусах
angle вообще первый раз слышу такое свойство, скажи где ты его взял?)
кинь сюда свой проект как он есть плиз! хочу посмотреть воочую!

D12 03.07.2008 01:41

Вложений: 1
Привет

вот на вскидку =)
Код:

package
{
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.display.DisplayObject;
    import flash.events.Event;
    import flash.ui.Mouse;
       
    [SWF(width='500', height='400', backgroundColor='#669999', frameRate='31')]
/*____________________________________________________*/
       
       
    public class Rotations extends Sprite
    {
        private var spriteQuantity: Number = 7;
        private var spritePlayer: Sprite;
        private var widthParabola: Number = 150;
        private var heightParabola: Number = 36;
        private var positionParabolaSpriteX: Number = 250;
        private var positionParabolaSpriteY: Number = 200;
        private var reductionScale: Number = 1.4;
        private var speedRotations: Number = 40;
        private var oneRadian: Number = Math.PI/180;
        private var degreeParabola: Number = 0;
        private var degreeParabolaOneRadian: Number = degreeParabola*oneRadian;
        private var spriteSectorParabola: Number = Math.floor(360/spriteQuantity);
        private var workArray: Array = new Array();
        private var positionArrayX: Array = new Array();
       

        public function Rotations()
        {
            drawPlayer();
                       
            numX();
        }
               
               
        private function drawPlayer(): void
        {
            for (var i:int = 0; i < spriteQuantity; i++)
            {
                spritePlayer = new Sprite;
                               
                spritePlayer.graphics.beginFill(0xFFFF00);
                spritePlayer.graphics.drawCircle(0, 0, 10);
                spritePlayer.graphics.endFill();
                               
                spritePlayer.name = "spritePlayer" + i;
                               
                addChild(spritePlayer);
                               
                workArray.push(i * spriteSectorParabola);
                               
                spritePlayer.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                               
                trace(workArray);
            }
        }
               
               
        private function numX(): void
        {
            for (var z:int = 0; z < spriteQuantity; z++)
            {
              positionArrayX.push(z);
            }
                       
            trace(positionArrayX);
        }

       
        private function enterFrameHandler(event:Event): void
        {
            if (stage.mouseX < positionParabolaSpriteX)
            {
              workArray[positionArrayX[parseInt(event.target.name.substr(12))]] += (stage.mouseX - positionParabolaSpriteX) / speedRotations;
            }
            else if (stage.mouseX > positionParabolaSpriteX)
            {
              workArray[positionArrayX[parseInt(event.target.name.substr(12))]] -= (positionParabolaSpriteX - stage.mouseX) / speedRotations;
            }
                       
            var thisParabolaX: Number = new Number;
            thisParabolaX = widthParabola * Math.cos(workArray[positionArrayX[parseInt(event.target.name.substr(12))]] * oneRadian);
                       
            var thisParabolaY: Number = new Number;
            thisParabolaY = heightParabola * Math.sin(workArray[positionArrayX[parseInt(event.target.name.substr(12))]] * oneRadian);
                       
            event.target.x = positionParabolaSpriteX + thisParabolaX * Math.cos(degreeParabolaOneRadian) - thisParabolaY * Math.sin(degreeParabolaOneRadian);
            event.target.y = positionParabolaSpriteY + thisParabolaX * Math.sin(degreeParabolaOneRadian) + thisParabolaY * Math.cos(degreeParabolaOneRadian);
        }
    }
}

правда перекрытие по уровням глубин не делал и уменьшение тоже, как не будь после :)

N1ka 03.07.2008 11:03

Вложений: 2
Цитата:

Сообщение от D12 (Сообщение 749677)
Привет

вот на вскидку =)

Здравствуй. Спасибо, будем разбиратся, только вот вижу код в два раза больше. Но спасибо и на этом, попробую для своего взять из твоего немного ума, думаю там есть чему поучится.

Цитата:

Сообщение от ramshteks (Сообщение 749675)
то что переворачивается... это у тя дело просто в геометрии...
задавать угол поворота тока через rotation, задавать надо в градусах
angle вообще первый раз слышу такое свойство, скажи где ты его взял?)
кинь сюда свой проект как он есть плиз! хочу посмотреть воочую!

Я этого ждал...:rolleyes:

Вот даю рабочий пример карусели на AS1/AS2, там видно что за angle и еще многое видно.
И вот еще даю ту карусель что у нас получилась на AS3, чтоб увидеть наглядно что и как. Кстати уже скорость карусели указывает положение курсора мышки.

ramshteks 03.07.2008 15:34

ИЗУЧАЙ!!)
 
Вложений: 1
изучай студент ) оба класса подробно изучи :cool:

Удачи в начинаиях)
а проблема именно в геометрии у тебя была)

и обрати внимание на то что такое angle!
я блин до этого не вдовался в подробности)
англе отвечает за расстановку по круга итемов) а я думал те надо сам итем повернуть )))

D12 03.07.2008 18:20

вот есть не большой еще пример

В подобных карусельках весь принцип базируется на следующей формуле:
почитай

N1ka 03.07.2008 20:29

О, спасибо вам, друзья. Буду стараться так, чтобы больше не задавать вопросов, а самому быть способным отвечать на них, но у меня впереди еще много планов... :victory:

ramshteks 03.07.2008 20:37

Дерзай)
Удачи )

N1ka 04.07.2008 20:42

Вложений: 1
Вернулся все-таки. :rolleyes:
Но тут уже аномалия для меня, смотрите сами:
Есть 10 итемов, все сидят на своих местах кроме одного, т.е. если дергать мышкой туда-сюда чтобы итемы дергались также в одну сторону и потом резко в другую, то выделяется один итем, он со старта поясвляется самый правый. Так вот, если дергать туда-сюда, то он будто по льду ездит, т.е. не сидит на своем месте, все дергаются резко, а этого одного итема заносит.

Этой проблемы небыло когда к мувиклипе item в присвоенном классе main.Item была написана функция с просчетом движения этих итемов. Но когда я эту функцию перенес по причине в класс Carousel который присвоен Document class, то вот появилась такая проблема.

Это не должно быть, почему оно так и как его устранить?

Вот мувик:

ramshteks 04.07.2008 20:47

такой своего рода разрыв цепи.. кидай проект, ща посмотрю, все равно делать нефик)

N1ka 04.07.2008 20:51

Вложений: 1
Цитата:

Сообщение от ramshteks (Сообщение 750123)
такой своего рода разрыв цепи.. кидай проект, ща посмотрю, все равно делать нефик)

Вот, там уже немного изменений. :)

ramshteks 04.07.2008 20:58

честно говоря проблемы не увидел! все вроде норм...

Слушай хочешь бесплатный совет! он тебе потом оч поможет)

N1ka 04.07.2008 21:06

Цитата:

Сообщение от ramshteks (Сообщение 750126)
честно говоря проблемы не увидел! все вроде норм...

Слушай хочешь бесплатный совет! он тебе потом оч поможет)

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

А совет да еще и даром... Хочу!:)

ramshteks 04.07.2008 21:10

Почитай про ооп. Ты не используешь потенциала этой прекрасной вещи )

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

если есть вещи которые должны упрявляться из вне создается интерфейс, для доступа к данным класса используются сеттеры и геттеры, для чего тебе методы?)
настоятельно рекомендую изучить три главных столпа ооп: наследование, полиморфизм и инкапсуляция

Я ручаюсь что тебе это пригодится)

а так получается что ты чуть ли не на первом скрипте кодишь... не гут это

N1ka 04.07.2008 21:16

Цитата:

Сообщение от ramshteks (Сообщение 750128)
Почитай про ооп. Ты не используешь потенциала этой прекрасной вещи )

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

если есть вещи которые должны упрявляться из вне создается интерфейс, для доступа к данным класса используются сеттеры и геттеры, для чего тебе методы?)
настоятельно рекомендую изучить три главных столпа ооп: наследование, полиморфизм и инкапсуляция

Я ручаюсь что тебе это пригодится)

а так получается что ты чуть ли не на первом скрипте кодишь... не гут это

Когда-то учил ООП, но я немного прогульщиком был, а учительница молодая и тоже прогульщица, так что вот результат.

А так, спасибо за совет, попробою сделать как советуешь, и возможно немного код переделать по законам ООП и тогда может и эта проблема с одним итемом пропадет.

ramshteks 04.07.2008 21:20

советую почитать книгу макконела называется "Совершенный код"

хорошая книга для программиста на любом языке, есть про все)
твой код станет гораздо лучше)

N1ka 04.07.2008 21:24

Спасибо.

N1ka 09.07.2008 13:30

Хотел сделать код таким как советовал ramshteks, сделал, и проблема с тем итемом что велял исчезла. Но, но я никак не могу сделать чтобы работало перекрытие (функция sortBySize) после того как немного изменил код. Я так понимаю что или в Item вызывать ее нужно из Carousel, или если ее поместить в Item, тогда нужно как-то найти там itemArray что в Carousel, что мне кажеться странным. Короче говоря, я незнаю как такое реализовать, искал - не нашел, может потому что незнал что толком искать.

Вот, посмотрите сами:

Document class: main.Carousel
Код:

package main {
        import flash.display.MovieClip;
        public class Carousel extends MovieClip {
                private var numOfItems:uint = 10;
                private var itemArray:Array = new Array;
                public function Carousel() {
                        for (var i:uint = 0; i < numOfItems; i++) {
                                var item:Item = new Item();
                                item.angl = i * ((Math.PI * 2) / numOfItems);
                                itemArray.push(item);
                                addChild(item);
                        }
                }
                //Работало когда тут стояла функция enterFrameHandler
                /*public function sortBySize():void {
                        itemArray.sortOn("scaleX", Array.DESCENDING | Array.NUMERIC);
                        itemArray.reverse();
                        for(var i:uint = 0; i < itemArray.length; i++) {
                                var item:Item = itemArray[i];
                                setChildIndex(item, i);
                        }
                }*/

        }
}

main.Item
Код:

package main {
        import flash.display.MovieClip;
        import flash.events.Event;
        public class Item extends MovieClip {
                public var angl:Number;
                static var radiusX:uint = 250;
                static var radiusY:uint = 75;
                private var centerX:Number = 400;
                private var centerY:Number = 300;
                private var speed:Number = 0.05;
                public function Item() {
                        masker.cacheAsBitmap = reflection.cacheAsBitmap = true;
                        reflection.mask = masker;
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
                private function enterFrameHandler(event:Event):void {
                        x = Math.cos(angl) * radiusX + centerX;
                        y = Math.sin(angl) * radiusY + centerY;
                        var scale:Number = y / (centerY + radiusY);
                        scaleX = scaleY = scale;
                        angl += speed;
                        speed = (stage.mouseX - centerX) / 6000;
                        //Нужно как-то сюда, чтобы работало
                        //sortBySize();

                }
        }
}

Ну и еще второй вопрос: как в main.Item найти stage.stageWidth и stage.stageHeight?

ramshteks 09.07.2008 14:56

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

N1ka 15.07.2008 13:21

Вложений: 1
Нашлось время и я опять взялся за карусельку.
Итак, увидел красивую карусельку с подсказками (AS1/AS2), захотел, сделал, но. Но вот у меня компилируется и работает роде как надо, но каждый кадр выдает ошибку, дебаг мод показал в каких строчках:
Код:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at main::Carousel/main:Carousel::moveTip()[D:\Works\Flash\Nika\Learn AS3\Carousel\MyCarousel\main\Carousel.as:94]
        at main::Carousel/main:Carousel::enterFrameHandler()[D:\Works\Flash\Nika\Learn AS3\Carousel\MyCarousel\main\Carousel.as:56]

И действительно, эта ошибка появилась ровно тогда когда я добавил эти строки, то что карусель компилится не смотря на ошибку меня не удовлетворяет, нужно избавится от ошибки.
Вот main.Carousel.as:
Код:

package main {
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
        public class Carousel extends MovieClip {
                private var numOfItems:uint = 10;
                static var radiusX:uint = 250;
                static var radiusY:uint = 75;
                private var centerX:Number = stage.stageWidth/2;
                private var centerY:Number = stage.stageHeight/2;
                private var speed:Number = 0.05;
                private var itemArray:Array = new Array;
                private var tooltip:MovieClip = new tip;
                private var rollOverTarget:MovieClip;
                private var itemTextM:itemTextMovie = new itemTextMovie();
                private var myXML:XML =
                        <info>
                                <itemm tooltip="0" />
                                <itemm tooltip="1" />
                                <itemm tooltip="2" />
                                <itemm tooltip="3" />
                                <itemm tooltip="4"/>
                                <itemm tooltip="5" />
                                <itemm tooltip="6" />
                                <itemm tooltip="7" />
                                <itemm tooltip="8" />
                                <itemm tooltip="9" />
                        </info>;
                public function Carousel() {
                        for (var i:uint = 0; i < numOfItems; i++) {
                                var item:Item = new Item();
                                item.angl = i * ((Math.PI * 2) / numOfItems);
                                item.toolText = myXML.itemm[i].@tooltip;
                                item.masker.cacheAsBitmap = item.reflection.cacheAsBitmap = true;
                                item.reflection.mask = item.masker;
                                itemArray.push(item);
                                addChild(item);
                                item.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                                item.icon.addEventListener(MouseEvent.CLICK, clickHandler);
                                item.icon.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
                        item.icon.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
                                buttonBack.buttonMode = false;
                                buttonBack.alpha  = 0;
                                buttonBack.addEventListener(MouseEvent.CLICK, newCarousel);
                        }
                }
                private function enterFrameHandler(event:Event):void {
                        event.target.x = Math.cos(event.target.angl) * radiusX + centerX;
                        event.target.y = Math.sin(event.target.angl) * radiusY + centerY;
                        var scale:Number = event.target.y / (centerY + radiusY);
                        event.target.scaleX = event.target.scaleY = scale;
                        event.target.angl += speed;
                        speed = (mouseX - centerX) / 6000;
                        sortBySize();
                        moveTip();
                }
                private function sortBySize():void {
                        itemArray.sortOn("scaleX", Array.DESCENDING | Array.NUMERIC);
                        itemArray.reverse();
                        for(var i:uint = 0; i < itemArray.length; i++) {
                                var item:Item = itemArray[i];
                                setChildIndex(item, i);
                        }
                }
                private function clickHandler(event:MouseEvent):void {
                        for(var i:uint = 0; i < itemArray.length; i++) {
                                var item:Item = itemArray[i];
                                item.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                                item.icon.removeEventListener(MouseEvent.CLICK, clickHandler);
                                item.icon.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
                                item.icon.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
                                removeChild(item);
                        }
                        removeChild(tooltip);
                        itemTextM.x = centerX;
                        itemTextM.y = centerY;
                        itemTextM.itemText.text = rollOverTarget.toolText;
                        addChild(itemTextM);
                        buttonBack.buttonMode = true;
                        buttonBack.alpha  = 1;
                }
                private function rollOverHandler(event:MouseEvent):void {
                        addChild(tooltip);
                        tooltip.tipText.text = event.target.parent.toolText;
                        tooltip.x = event.target.parent.x;
                        tooltip.y = event.target.parent.y - event.target.parent.height/2;
                        rollOverTarget = event.target.parent;
                }
                private function rollOutHandler(event:MouseEvent):void {
                        removeChild(tooltip);
                }
                private function moveTip():void {
                        tooltip.x = rollOverTarget.x;
                        tooltip.y = rollOverTarget.y - rollOverTarget.height/2;
                }
                private function newCarousel(event:MouseEvent):void {
                        for(var i:uint = 0; i < itemArray.length; i++) {
                                var item:Item = itemArray[i];
                                addChild(item);
                                item.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                                item.icon.addEventListener(MouseEvent.CLICK, clickHandler);
                                item.icon.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
                                item.icon.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
                        }
                        removeChild(itemTextM);
                        buttonBack.buttonMode = false;
                        buttonBack.alpha  = 0;
                }
        }
}

main.Item.as:
Код:

package main {
        import flash.display.MovieClip;
        public class Item extends MovieClip {
                public var angl:Number;
                public var toolText;
                public function Item() {
                }
        }
}

И еще. Я постами выше говорил за глюк что заметил только я, что один итем не такой как все, он не твердо стоит на своем месте, а плавает туда-сюда. Итак, благодаря сделанным подсказкам я смогу показать этот итем и вам. Итак, над каждым итемом при наведении мыши появляется подсказка с номером от 0 до 9. Тот самый итем что выделяется под номером "0", т.е. как только запустить мувик с каруселью и поводить мышью по итемах, то попробуйте найти итем под номером "0" и тогда смотрите на него и дводите мышью так чтобы карусель крутилась то в одну то в другую сторону, и тогда увидите как этот итем будет заносить, он будет отставать немного от движения. Хотелось бы чтобы и здесь исправить, этого глюка нет когда писать весь код в кадре, и его нет когда писать немного кода в main.Carousel.as и немного в main.Item.as, но у меня так не получается. А сейчас почти весь код в main.Carousel.as. И кстати, я реализовал нажатие на итемы, так когда нажать на любой итем и потом вернуться назад к карусели, то уже этот глючный итем что был под номером "0", он уже не будет под этим номером.

Может кто поймет что я хотел обьяснить и поможет, надеюсь... Но спасибо что и так уже много помогли, надеюсь это не конец вашей милости. :rolleyes:

Вот проект:

ramshteks 15.07.2008 13:46

сорри поторопился с выводом!

ramshteks 15.07.2008 13:53

вот так должна выглядеть 14ая строка

Код:

private var rollOverTarget:MovieClip=new Item;


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

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