MovieClip,计数器几乎工作AS3

时间:2010-03-10 20:26:46

标签: flash actionscript-3

如何让我的计数器工作?请包含说明,并随时发表评论。

混乱:我对as3中的MovieClip容器感到困惑。公共课 NumbersView扩展了MovieClip,所以这似乎 是一个容器。 这可能不是问题,但是 那就是我迷路的地方。

此代码的工作版本非常棒。我的 代号吼叫试图修改它。来源 已经改编自各种聪明人。这是一项正在进行中的工作

LIBRARY OBJECT
'垂直数字列' 名称:mc-NumberImage
分类:NumberImage

输出错误'当我取消注释代码时“
1023:不兼容的覆盖。 NumbersView ...
1021:重复的功能定义。 NumbersView ...

                         //NUMBER DOCUMENT CLASS
                         //IMPORT
import flash.display.Sprite; 
import flash.events.Event; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 
import flash.display.DisplayObject; 
import flash.display.MovieClip; 
import flash.utils.Dictionary; 
import caurina.transitions.Tweener;

                         //COUNTER
    var timer:Timer = new Timer(1000);

    var count:int = 0;  
    var fcount:int = 0; 


    timer.addEventListener(TimerEvent.TIMER, incrementCounter);   
    timer.start();  

    function incrementCounter(event:TimerEvent) {   
      count++;   
      fcount=int(count*count/1000);

    } 
    function formatCount(i:int):String {  
         var fraction:int = i % 100;  
         var whole:int = i / 100;   
      return ("000000000" + i).substr(-9, 9);  
    }  


//------------------------------------------------------------------------
                         //PROBLEM AREA

       function enterFrameHandler(e:Event):void  
        { 
//          numbers.setTime(formatCount(fcount)); 
       } 


   var _listItems:Array = new Array(); 
     var previousNums:Array; 
    const numHeight:int = 120; 


     var NumbersView:Sprite = new Sprite();
  //var numbers:NumbersView = new NumbersView;

                         //NUMBERSVIEW
//   function NumbersView($n:int):void {

       _listItems = new Array(); 
       previousNums = new Array(); 
        var item:NumberImage; 
        var offset:int = _listItems.length;  
     for (var i:Number = 0; i < 9; i++) { 
           item = new NumberImage();
//  }//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//------------------------------------------------------------------------
                         //PUSH ARRAY
addChild(item);  
        item.x = i * item.width;  
           _listItems.push(item);  
      }
                         //TWEENER 'Y SCROLLING'
function setTime($number:String):void { 
            var nums:Array = $number.split(""); 

            for (var i:Number = 0; i < nums.length; i++) { 
                if (nums[i] == previousNums[i]) continue; 
                Tweener.removeTweens(_listItems[i]); 

                var newY:int = int(nums[i]) * -numHeight; 
                if (_listItems[i].y < 0) _listItems[i].y = numHeight; 
                Tweener.addTween(_listItems[i], { y:newY, time:3 } ); 
            } 
            previousNums = nums; 
        }  

D E S C R I P T I O N

COUNTER: formatCount需要传递给Tweener

STAGE: for循环,设置要添加到舞台的子项 NumbersView成为项目,项目数组将子项添加到阶段

TWEENER:每次都会提升垂直数列 count fires添加和删除

WHY
- 学习
- Benifit简化课程并将其放入一个FLA中

alt text http://www.ashcraftband.com/myspace/videodnd/bobnums.jpg


关于文档类的更多信息
http://www.rubenswieringa.com/blog/class-syntax-in-actionscript30
http://www.heaveninteractive.com/weblog/2008/03/04/introduction-to-the-document-class-in-actionscript-30-tutorial


在DEBU的例子之后

.FLA '在库中有符号,Class:NumberImage'

import flash.display.Sprite; 
import flash.events.Event; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 

var timer:Timer; 
var count:int = 0; 
var fcount:int = 0; 
var numbers:NumbersView; 

trace("-----new NumberDocument created");
timer = new Timer(10); 
timer.addEventListener(TimerEvent.TIMER, incrementCounter);     
timer.start();    
numbers = new NumbersView(); 
addChild(numbers); 

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
//addEventListener(Event.ADDED_TO_STAGE, traceMeOut);


function incrementCounter(event:TimerEvent) 
{     
    count++;     
    fcount=int(count*count/1000);//starts out slow... then speeds up 
} 

function formatCount(i:int):String 
{    
    return ("000000000" + i).substr(-9, 9); 
} 

function enterFrameHandler(e:Event):void  
{ 
    numbers.setTime(formatCount(fcount)); 
} 
function traceMeOut()
{
    trace("-----Im here on stage!");
}

NumbersView.as

package   
{ 
    import flash.display.DisplayObject; 
    import flash.display.MovieClip; 
    import flash.utils.Dictionary; 
    import flash.events.Event; 
    import caurina.transitions.Tweener; 

    public class NumbersView extends MovieClip 
    { 
        private var _listItems:Array; 
        private var previousNums:Array; 
        private const numHeight:int = 120; 

        public function NumbersView()  
        { 
            _listItems = new Array(); 
            previousNums = new Array(); 

            var item:NumberImage; 
            for (var i:Number = 0; i < 9; i++) { 
                item = new NumberImage(); 
                addChild(item); 
                item.x = i * item.width; 
                _listItems.push(item); 
            } 
        } 

        public function setTime($number:String):void { 
            var nums:Array = $number.split(""); 

            for (var i:Number = 0; i < nums.length; i++) { 
                if (nums[i] == previousNums[i]) continue; 
                Tweener.removeTweens(_listItems[i]); 

                var newY:int = int(nums[i]) * -numHeight; 
                if (_listItems[i].y < 0) _listItems[i].y = numHeight; 
                Tweener.addTween(_listItems[i], { y:newY, time:3 } ); 
            } 
            previousNums = nums; 
        } 
    } 
} 

1 个答案:

答案 0 :(得分:0)

我对你要做的事情感到有些困惑,但我想你想在你自己的文件numbers_broke中重新创建numbers_works中发生的事情。为此,请将此代码放在第一帧:

import flash.display.Sprite; 
import flash.events.Event; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 

var timer:Timer; 
var count:int = 0; 
var fcount:int = 0; 
var numbers:NumbersView; 

trace("-----new NumberDocument created");
timer = new Timer(10); 
timer.addEventListener(TimerEvent.TIMER, incrementCounter);     
timer.start();    
numbers = new NumbersView(); 
addChild(numbers); 

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
//addEventListener(Event.ADDED_TO_STAGE, traceMeOut);


function incrementCounter(event:TimerEvent) 
{     
    count++;     
    fcount=int(count*count/1000);//starts out slow... then speeds up 
} 

function formatCount(i:int):String 
{    
    return ("000000000" + i).substr(-9, 9); 
} 

function enterFrameHandler(e:Event):void  
{ 
    numbers.setTime(formatCount(fcount)); 
} 
function traceMeOut()
{
    trace("-----Im here on stage!");
}

现在,您尝试重新创建的示例使用外部类文件。其中一个叫做'NumbersView.as'。这需要与fla文件位于同一目录中。如果你在代码中复制它,并将NumbersView.as放在正确的位置,你的文件应该做另外做的事情 - 我只能假设你正在尝试做的事情......这引出了我的一些其他指针:

你的问题,特别是这个,往往难以破译。就像这样,你甚至想做什么,问题出在哪里?其次,你的代码糟糕,我的意思是在视觉上。编写结构良好,格式清晰的代码非常重要。你会发现它更容易使用,更容易回归,而其他人会发现它首先更容易理解。现在你的格式化到处都是。第三,当你说你遇到错误时,粘贴整个错误,而不仅仅是开头 - 没人知道真正的问题是什么:

  

1023:不兼容的覆盖。   NumbersView ...

所以,如果你想要有用的答案,我会说从那些对你真正有用的基础开始。

最后,在number_broken中的原始代码中,您在顶部写道,这是Document Class。 Flash中的文档类是一个特定的类,它是在您提供的数字文件的正确版本中实现的。它在fla文件的属性面板中指定,您可以在其中看到“Class:”。它需要以大写字母开头,一旦你指定它,你需要在外部创建该文件,使用与该框相同的名称,但附加.as(ActionScript)文件类型。然后,您需要某些元素,如类声明和构造函数;通用Document类可能如下所示:

package
{
    public class Main extends Sprite
    {
    //Property variables go here, eg:
    var someVariable:String = "Hello";

         //This is the constructor
         public function Main()
         {
              //Code goes here, which will be the first execution of your Flash file.
         }
}

从你回答的帖子中,我得到的印象是你还没有完全掌握面向对象编程的概念,以及类进入编码的地方。如果你愿意,我可以给你一个更彻底的解释。与此同时,我希望这能解决您当前的问题。