Форум 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=182736)

barcelona92 01.08.2012 18:00

Простой регулятор
 
Ребят,нужна помощь,мучаюсь уже долго(
Нужен простой ползунковый регулятор громкости(когда ползунок полностью довели в лево громкость пропадает,в право - есть,никаких промежуточных значений(тише,громче)Off или on)и все нужно через класс
может уже есть тут такая тема(дайте ссылку)
помогите решить задачу

Jewelz 01.08.2012 19:26

используйте любой из готовых компонентов, например fl.controls.Slider

и при изменении его ползунка, у soundTransform вашего звука меняйте св-во volume

Wolsh 01.08.2012 19:57

Вложений: 1
Я так понял речь о свитчере, типа такого
Вложение 28273

barcelona92 01.08.2012 19:59

да,да
я бы сказал точно такой же)
есть пример?

Krusty 01.08.2012 20:10

Код AS3:

var volumeTransform:SoundTransform = new SoundTransform(1, 0);        
var slider:Slider = new Slider();
slider.liveDragging = true;
slider.maximum = 1;
slider.minimum = 0;
slider.tickInterval = 1;
slider.addEventListener(SliderEvent.CHANGE, on_SliderEvent_CHANGE );
private function on_SliderEvent_CHANGE (event:SliderEvent):void{
volumeTransform.volume = (event.target.value);
}

вроде того.

Wolsh 01.08.2012 20:13

Нет, это просто картинка с Dribbble. Там этих свитчей тысячи.
Я так понял Вы сами делать не желаете. Тогда, может, перенесем тему в раздел Вакансии? Просто здесь помогают тем у кого не получается, а делают для заказчика — там.

gagaga 01.08.2012 20:35

http://www.minimalcomps.com/?page_id=5 там смотрите компонент ХУИслайдер.... исходники там же

barcelona92 01.08.2012 20:50

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

Цитата:

Сообщение от gagaga (Сообщение 1090607)
http://www.minimalcomps.com/?page_id=5 там смотрите компонент ХУИслайдер.... исходники там же

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

Wolsh 02.08.2012 00:50

Вложений: 1
Вот как-то так например (проект для FlashDevelop, надеюсь это не станет проблемой).

Wolsh 02.08.2012 02:30

Ахха, в функции upHandler надо одно из условий (< или >) поменять на <= или >=, а то получилась игра "найди середину"))

barcelona92 02.08.2012 11:21

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

gagaga 02.08.2012 13:16

Цитата:

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



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

https://github.com/minimalcomps/mini...zipball/master проект опенсорсный

barcelona92 02.08.2012 19:45

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.media.Sound;
        import flash.net.URLRequest;
 
/* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

        public class Main extends Sprite
        {
                [Embed(source = "../lib/pimp.png")] private var pimpImage:Class;
                [Embed(source = "../lib/back.png")] private var backImage:Class;
                private var _eventTextField:TextField;
                public static var sound:Sound = new Sound();
                soundbtn.load (new URLRequest ("sound.MP3"));
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                load.sound();
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _eventTextField = new TextField();
                        addChild(_eventTextField);
                        _eventTextField.defaultTextFormat = new TextFormat("Arial", 18, 0xFFFFFF, true);
                        _eventTextField.x = 200;
                        _eventTextField.y = 300;
 
                        var switcher:Switcher = new Switcher(new backImage(), new pimpImage(), new Rectangle(2, 2, 69, 0));
                        switcher.addEventListener(Switcher.ON, handlerSoundON);
                        switcher.addEventListener(Switcher.OFF, handlerSoundOFF);
                        switcher.setState(Switcher.ON);
                        this.addChild(switcher);
                        switcher.x = 200;
                        switcher.y = 200;
                }
 
                private function handlerSoundON(event:Event):void
                {
                        _eventTextField.text = "Sound ON";
                }
 
                private function handlerSoundOFF(event:Event):void
                {
                        _eventTextField.text = "Sound OFF";
                }
 
        }
 
}

функция load.sound(); не сработает(вроде бы нужно писать наоборот,однако ошибку тоже выбивает
функция soundbtn.load (new URLRequest ("sound.MP3")); тоже не понятно откуда взялся soundbtn
у меня только ползунок бегает,ну и я сделал чтоб играла музыка,но тогда у меня проблемы с ее воспроизведением

Wolsh 02.08.2012 20:24

Не надо писать вызовы функций в теле класса. Это же не код в кадре.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.media.SoundTransform;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import flash.text.TextFormat;
 
/* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

        public class Main extends Sprite
        {
                [Embed(source = "../lib/pimp.png")] private var pimpImage:Class;
                [Embed(source = "../lib/back.png")] private var backImage:Class;
                private var _eventTextField:TextField;
                private var _sound:Sound;
                private var _soundChannel:SoundChannel;
                private var _soundTransform:SoundTransform;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _eventTextField = new TextField();
                        addChild(_eventTextField);
                        _eventTextField.defaultTextFormat = new TextFormat("Arial", 18, 0xFFFFFF, true);
                        _eventTextField.x = 200;
                        _eventTextField.y = 300;
 
                        _sound = new Sound();
                        _sound.load(new URLRequest("Sound.mp3"));
                        _soundTransform = new SoundTransform(1);
                        _soundChannel = _sound.play(0, 0, _soundTransform);
 
                        var switcher:Switcher = new Switcher(new backImage(), new pimpImage(), new Rectangle(2, 2, 69, 0));
                        switcher.addEventListener(Switcher.ON, handlerSoundON);
                        switcher.addEventListener(Switcher.OFF, handlerSoundOFF);
                        switcher.setState(Switcher.ON);
                        this.addChild(switcher);
                        switcher.x = 200;
                        switcher.y = 200;
                }
 
                private function handlerSoundON(event:Event):void
                {
                        _eventTextField.text = "Sound ON";
                        _soundTransform.volume = 1;
                        _soundChannel.soundTransform = _soundTransform;
                }
 
                private function handlerSoundOFF(event:Event):void
                {
                        _eventTextField.text = "Sound OFF";
                        _soundTransform.volume = 0;
                        _soundChannel.soundTransform = _soundTransform;
                }
 
        }
 
}


barcelona92 03.08.2012 16:14

хм,а если у меня звуковой файл подгружается в другом классе,как мне обратиться чтоб vol = 0 ?

Wolsh 03.08.2012 17:13

получить у него ссылку на SoundChannel

barcelona92 03.08.2012 17:45

я не использую в нем SoundChannel
Код AS3:

public class Sound_Volume {
 
                var sound:MP3Loader  = new MP3Loader("game music mix.mp3",  {volume:1, repeat:+1});
 
                public function Sound_Volume() {
 
                        sound.load();


Wolsh 03.08.2012 20:37

Я не знаю, что эти буквы означают. Спросите у автора MP3Loader, как получить ссылку на канал. Потому что нет канала — нет управления громкостью.

fish_r 03.08.2012 21:55

Звуком можно управлять также через soundTransform - свойство объекта SoundMixer

Wolsh 03.08.2012 22:50

Ну если ВСЕМ звуком, то да. Вот только...
Цитата:

Класс SoundMixer управляет встроенными потоковыми звуками в SWF; он не управляет динамическими созданными объектами Sound (то есть, объектами Sound созданными в ActionScript).

barcelona92 06.08.2012 11:45

Код AS3:

public class Sound_Volume {
                var someSound:Soundnew Sound(new URLRequest("game music mix.mp3"));
                var someChannel:SoundChannel = new SoundChannel();
                public function Sound_Volume() {
                        someChannel = someSound.play();
                                        }

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

Wolsh 06.08.2012 13:20

У Вас же есть свойство someChannel, к нему и обращайтесь.
Как я могу более подробно ответить, не понимая иерархию Ваших классов?
Я например совершенно не понимаю, зачем нужен этот класс, в чем его уникальность (его абстракция), почему он называется Sound_Volume, если никак не влияет на громкость звука, и чем он превосходит собственно базовый класс Sound. Другими словами, почему эти три строчки нельзя было написать там, где они нужны, зачем создавать упаковку для обертки.
Классы должны исполнять четко определенный уникальный функционал. Этот класс делает абсолютно то же самое, что и класс Sound. Все его отличие в том, что путь к файлу звука в нем захардкоден. То есть функционал класса Sound был не расширен, а заужен. В чем смысл этой "новой" сущности?

barcelona92 06.08.2012 13:50

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

Wolsh 06.08.2012 14:40

ОК. Кто стартует музыку? Кто создает экземпляр Sound_Volume? Кому свитчер должен сообщать, что его переключили?
Очевидно, что подписаться на события от свитчера Вы сможете только тогда, когда он будет создан.
Тот, кто создает свитчер, должен иметь ссылку на того, кто создал Ваш лоадер звука, затем получить от него ссылку на лоадер звука и от него — ссылку на канал.
Классический вариант выглядел бы иначе: свитчер посылает событие что его переключили тому, кто его создал и подписался на это событие. В Вашем случае, вероятно, это окно меню Настроек. Настройки, вообще-то, должны где-то сохраняться и применяться. То есть окно настроек должно что-то менять в некоей базе настроек, к которой есть доступ всем, кто интересуется настройками — менеджеру звуков в частности. База настроек должна извещать заинтересованных лиц при изменении настроек. То есть менеджер звука (возможно, до него вырастет Ваш Sound_Volume) получит сообщение от БазыНастроек, что громкость звука поменялась, и тогда применит soundTransform к каналу воспроизведения (или каналАМ, если будут другие).

barcelona92 06.08.2012 14:53

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

Wolsh 06.08.2012 15:17

Ну во-первых SoundVolume (давайте все же называть сущности по конвенции) не должен находиться в меню, если отвечает за музыку во всей игре.
Во-вторых, надо сделать в нем метод, управляющий звуком, что наконец-то и название его оправдает))
Канал нам известен в этом классе, и нет смысла отдавать его кому-то. Можно менять громкость прямо на месте, так ведь? Вот и будет и "Sound", и "Volume" при делах.
Далее, у Preferences должна быть ссылка на экземпляр SoundVolume, чтобы он мог приказать изменить громкость при изменении настроек.
Как всего этого достигнуть? Ну обычно созданием объектов по порядку. То есть звук у Вас создается, очевидно, сразу при запуске игры. То есть в Мейне или другом из старших классов. Если там же будет создаваться и Preferences, то Вы сможете передать ему ссылку на звук прямо на месте, не протаскивая ее через другие сущности. Еще вариант (который я обычно не рекомендую))) это завести публичную переменную в Мейне, до которой можно достучаться из любого места (в чем, собственно, и порочность этого метода). А там, где Вы создаете экземпляр свитчера, у Вас обязана быть ссылка на Preferences, ведь свитчер вносит изменения в настройки.
Вот как бы все и связалось. Звук играет все время в любом месте ("расположен" в Мейне), а когда дергаете свитчер в окне настроек, тот посылает событие, окошко настроек звука его ловит и сообщает Preferences, а Preferences дергает метод изменитьГромкость в экземпляре SoundVolume.

barcelona92 07.08.2012 11:52

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

Wolsh 07.08.2012 14:39

Допустим создадим класс GameSound:
Код AS3:

package {
        // импорты опускаю
        public class GameSound {
                private var _sound:Soundnew Sound(new URLRequest("game music mix.mp3"));
                private var _channel:SoundChannel;
                public function GameSound() {
                        _channel = _sound.play();
                }
                //// метод для изменения громкости
                public function set volume(value:uint):void {
                        _channel.soundTransform = new SoundTransform(value);
                }
        }
}

Далее, в экземпляр Preferences надо передать ссылку на экземпляр этого GameSound.
Если создаете их в одной области видимости, то можно передать ссылку например в конструктор Preferences
Код AS3:

private var _gameSound:GameSound;
public function Preferences(sound:GameSound){
        _gameSound = sound;
        //....прочий код
}

(Либо, если Preferences не создает экземпляров, а используется как статический класс, завести в нем статическую переменную для хранения ссылки на экземпляр GameSound).

Далее, в классе Preferences должен быть метод, устанавливающий громкость (в Вашем случае это true или false):
Код AS3:

private var _backgroundMusic:Boolean = true;
public function set backgroundMusic(value:Boolean):void {
        _backgroundMusic = value;
        if(_backgroundMusic) {
                _gameSound.volume = 1;
        } else {
                _gameSound.volume = 0;
        }
}

Окно, в котором создается свитчер, должно иметь ссылку на Preferences, ведь это окно настроек. Тут уж я не знаю, как у Вас все устроено. Создаете свитчер и подписываетесь на события переключения, как в моем примере в классе Мейн. Только содержимое хендлеров будет другим:
Код AS3:

                private function handlerSoundON(event:Event):void 
                {
                        _preferences.backgroundMusic = true;
                }
 
                private function handlerSoundOFF(event:Event):void
                {
                        _preferences.backgroundMusic = false;
                }

Вот и всё. Удачи))

barcelona92 07.08.2012 15:42

Код AS3:

package  {
 
        import flash.media.Sound;
        import flash.display.Sprite;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.net.*;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.media.SoundChannel;
        import flash.media.SoundTransform;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.events.MouseEvent;
        import flash.events.*;
        import flash.utils.*;
    import flash.events.IOErrorEvent;
 
 
        public class Preference extends MovieClip {
                [Embed(source = "pimp.png")] private var pimpImage:Class;
                [Embed(source = "back.png")] private var backImage:Class;
                public var _eventTextField:TextField;
                public var _sound:Sound;
                public var _soundChannel:SoundChannel;
                public var _soundTransform:SoundTransform;
                public static var sound = new GameSound();
                private var _gameSound:GameSound;
                private var _backgroundMusic:Boolean = true;
                public function set backgroundMusic(value:Boolean):void {
        _backgroundMusic = value;
        if(_backgroundMusic) {
                _gameSound.volume = 1;
        } else {
                _gameSound.volume = 0;
        }
}
                public function Preference() {
 
                                if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
 
 
 
 
                        // constructor code
                        //Go_Home_Preference
                        //Go_Info_Preference
                        //Go_App_Preference
                        Game.GG =false;
 
                        //Go_Home_Preference.buttonMode = true;
                        //Go_Home_Preference.mouseChildren = false;
                        Go_Home_Preference.addEventListener(MouseEvent.CLICK,PlayHome);       
 
                        //Go_Info_Preference.buttonMode = true;
                        //Go_Info_Preference.mouseChildren = false;
                        Go_Info_Preference.addEventListener(MouseEvent.CLICK,PlayInfo);       
 
                        //Go_App_Preference.buttonMode = true;
                        //Go_App_Preference.mouseChildren = false;
                        Go_App_Preference.addEventListener(MouseEvent.CLICK,PlayApp);       
 
 
                        //Go_To_Preference.buttonMode = true;
                        //Go_To_Preference.mouseChildren = false;
                        Go_To_Preference.addEventListener(MouseEvent.CLICK,PlayPreference);       
 
                        go_pref_stars.addEventListener(MouseEvent.CLICK,PlayStars);       
 
                        User_Name_Preference.text = String(Main_Game.User);                       
                }
 
 
                public function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _eventTextField = new TextField();
                        addChild(_eventTextField);
                        _eventTextField.defaultTextFormat = new TextFormat("Arial", 18, 0xFFFFFF, true);
                        _eventTextField.x = 700;
                        _eventTextField.y = 300;
 
 
                        var switcher:Switcher = new Switcher(new backImage(), new pimpImage(), new Rectangle(2, 2, 69, 0));
                        switcher.addEventListener(Switcher.ON, handlerSoundON);
                        switcher.addEventListener(Switcher.OFF, handlerSoundOFF);
                        switcher.setState(Switcher.ON);
                        this.addChild(switcher);
                        switcher.x = 700;
                        switcher.y = 400;
                }
 
                private function handlerSoundON(event:Event):void
                {
                        _eventTextField.text = "Sound ON";
                        backgroundMusic = true;
                }
 
                private function handlerSoundOFF(event:Event):void
                {
                        _eventTextField.text = "Sound OFF";
                        backgroundMusic = false;
                }
 
 
                public function PlayInfo(e:MouseEvent):void{
 
                        Main_Game.screens.switchTo("Info");
 
                        }
                public function PlayHome(e:MouseEvent):void{
 
                        Main_Game.screens.switchTo("Start");
 
                        }
                public function PlayApp(e:MouseEvent):void{
 
                        Main_Game.screens.switchTo("App");
 
                        }
                public function PlayPreference(e:MouseEvent):void{
 
                        Main_Game.screens.switchTo("Configuration");
                        }
 
                public function PlayStars(e:MouseEvent):void{
 
                        Main_Game.screens.switchTo("all_stars");
 
                }
 
                        }
 
}

когда перехожу на Preference дает такую ошибку

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Preference/set backgroundMusic()
at Preference/handlerSoundON()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Switcher/setPimpPosition()
at Switcher/init()
at flash.display::DisplayObjectContainer/addChild()
at Preference/init()
at flash.display::DisplayObjectContainer/addChild()
at ScreenHand/switchTo()
at Start/PlayPreference()


вот мой преференс,там вставлен свитчер а soundGame это я решил создать новый и вставил ваш код,
я уже заколебался,надеюсь это последняя ошибка



а,кстати,такой вопрос
Я же могу кинуть музыку просто на сцену и поставить Loop только как мне обратиться чтоб vol уменьшить только этого звука?или это невозможно?

NikolyA 07.08.2012 16:07

ну обрати внимание на ошибку, на что ругается, все ж понятно

barcelona92 07.08.2012 16:16

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

NikolyA 07.08.2012 17:19

так ошибка говорит совесем о другом, музыка тут не причем, до музыки дойдем позже

barcelona92 07.08.2012 17:21

странно,остальное у меня работает,а музыка нет

NikolyA 07.08.2012 17:34

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

barcelona92 07.08.2012 17:36

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

я сделал,большое всем спасибо)

Добавлено через 18 часов 50 минут

Добавлено через 49 часов 58 минут
как можно иначе записать эту строчку
Код AS3:

public function Preferences(sound:GameSound){

то что в скобках


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

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