#flash #actionscript-3 #this
#flash #actionscript-3 #это
Вопрос:
AS3 новичок здесь!
У меня на сцене есть видеоролик (thePlayer) с классом ‘ThePlayer’, а внутри этого видеоролика находится простая кнопка с классом StopBtn. Оба класса сохраняются в папке с именем ‘classes’.
Класс ‘ThePlayer’ загружает звук в soundchannel и затем воспроизводится, из класса ‘StopBtn’ я добавляю прослушиватель событий для кнопки, которая уже находится на сцене внутри видеоролика, а затем останавливаю переменную soundchannel, установленную в ‘ThePlayer’ из класса ‘StopBtn’.
Для этого я передаю ‘this’ функции StopBtn (), чтобы иметь возможность управлять переменной soundchannel, установленной в ‘ThePlayer’
Кнопка, кажется, работает отлично, но я получаю эту ошибку на панели вывода:
ArgumentError: Error #1063: Argument count mismatch on classes::StopBtn(). Expected 1, got 0.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at classes::ThePlayer()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
Я полагаю, что он считает, что в функцию StopBtn () в классе StopBtn ничего не передается, но когда я запускаю файл и нажимаю кнопку stop на рабочей панели, это работает…
Бьюсь головой об стену с этим уже 4 дня : (
Вот мой код для обоих классов:
ThePlayer.as
package classes
{
import flash.display.*;
import flash.media.*;
import flash.net.*;
import flash.events.*;
public class ThePlayer extends MovieClip
{
//Link vars to classes for accessing vars here in different classes
public var _stopBtn:StopBtn;
// Public and private Vars
public var mySound:Sound = new Sound();
public var mySoundChannel:SoundChannel = new SoundChannel();
public var trackPosition:Number = 0;
public var isPlaying:Boolean = false;
//Constructor function
public function ThePlayer()
{
_stopBtn = new StopBtn(this);
mySound.load(new URLRequest("mp3_files/song.mp3"));
mySoundChannel = mySound.play();
isPlaying = true;
}
}
}
StopBtn.as
package classes
{
import flash.display.*;
import flash.media.*;
import flash.net.*;
import flash.events.*;
public class StopBtn extends SimpleButton
{
var playerClass:ThePlayer;
public function StopBtn(recivedPlayerClass:ThePlayer)
{
playerClass = recivedPlayerClass;
playerClass.addEventListener(MouseEvent.CLICK, stopButtonFunction);
}
function stopButtonFunction(event:MouseEvent):void
{
playerClass.trackPosition = 0;
playerClass.mySoundChannel.stop();
playerClass.isPlaying = false;
//playerClass.pauseBtn.visible = false;
//playerClass.playPause.playBtn.visible = true;
}
}
}
Спасибо за вашу помощь!
Комментарии:
1. Я полагаю, что вы создаете два
StopBtn
файла, первый — это тот, который вы определили на сцене внутри видеоролика — он создается, а конструктор не получает параметров, отсюда и ошибка. Второй экземпляр создается с вашимnew
ключевым словом, но никогда не добавляется как дочерний. Если вы хотите устранить ошибку, а не исправлять код, вы могли бы сделатьrecivedPlayerClass
необязательный параметр с помощью:public function StopBtn(recivedPlayerClass:ThePlayer = null)
, затем проверить наличие null иreturn;
Ответ №1:
Я предполагаю, что StopBtn создается во Flash IDE, или IDE не имеет способа узнать, какой параметр должен быть передан конструктору StopBtn, отсюда и ошибка.
Что вы можете сделать, например, создать аргумент по умолчанию для конструктора или аргумент без параметра, но с дополнительным методом инициализации:
public class StopBtn extends SimpleButton {
var playerClass:ThePlayer;
public function StopBtn(recivedPlayerClass:ThePlayer = null) // default constuctor
{
if (recivedPlayerClass!=null) {
playerClass = recivedPlayerClass;
playerClass.addEventListener(MouseEvent.CLICK, stopButtonFunction);
}
}
//...
или
public class StopBtn extends SimpleButton {
var playerClass:ThePlayer;
public function StopBtn() {
}
public function init(recivedPlayerClass:ThePlayer):void {
playerClass = recivedPlayerClass;
playerClass.addEventListener(MouseEvent.CLICK, stopButtonFunction);
}
//...
Комментарии:
1. Спасибо, Патрик, первое решение работает! Я пробовал второй способ, но получаю ошибку от ThePlayer.as то же, что и исходная ошибка, но не на панели вывода, в ошибках компилятора. Хотя верхний работает отлично! спасибо 🙂