AS3 — Выдает ошибку # 1063, ожидаемый 1, получил 0, хотя это работает?

#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 то же, что и исходная ошибка, но не на панели вывода, в ошибках компилятора. Хотя верхний работает отлично! спасибо 🙂