如何从movieclip类中更改动画片段文本字段?

时间:2011-12-23 06:08:35

标签: flash actionscript-3 actionscript

我的库中有一个名为mcLeaderboarditem的movieclip。我为它生成了一个类来管理文本字段。

最简单的方法是创建类的子节点并使用像这样的点语法管理内容属性(documentclass):

var leaderItem:mcLeaderboardItem = new mcLeaderboardItem();
leaderItem.lblRank.text = "2nd";
addChild(leaderItem);

这对我来说很容易,但我想管理类中的数据,这样我就可以添加aditional文本(前缀/后缀/操作)。 我创建了几个私有属性:rank,displayname和score,并使用mcLeaderboardItem中的getter和setter将documentClass更改为。 如果我修改了类中的lblRank.text并对其进行了跟踪,我发现它确实修改了lblRankt.text但是从编译器退出类的那一刻起它再次采用了动画片段中标签的默认值。 除非我选择上面的代码块中的解决方案。 类mcLeaderboardItem的代码:

package com.cleversprite.memorygame.ui 
{

import flash.display.MovieClip;

public class mcLeaderboardItem extends MovieClip 
{

    //VARIABLES
    //------------------------------------------------
    private var _rank:int;
    private var _displayname:String;
    private var _score:int;


    //PROPERTIES
    //------------------------------------------------
    public function get rank():int
    {
        return _rank;
    }

    public function set rank(v:int):void
    {
        _rank = v;
    }

    public function get displayname():String
    {
        return _displayname;
    }

    public function set displayname(v:String):void
    {
        _displayname = v;
    }

    public function get score():int
    {
        return _score;
    }

    public function set score(v:int):void
    {
        _score = v;
    }


    //CONSTRUCTOR
    //------------------------------------------------
    public function mcLeaderboardItem() 
    {
        super();
        init();
    }

    public function init():void
    {

        lblRank.text = String(_rank);
        lblDisplayname.text= _displayname;
        lblScore.text= String(_score);

    }
}

有人看到我做错了什么吗? 可能因为疲倦而会变得愚蠢。 或者还有其他方法可以做我想做的事情吗?

提前完成。

2 个答案:

答案 0 :(得分:0)

您正在从类构造函数中调用init,这意味着它会在您的任何数据变量有机会设置之前运行并设置所有文本字段(通过从父类调用setter)。所以它只是将所有文本字段的文本设置为null。

所以,
您可以为该项目的setter中的相应文本字段设置文本,或者只需在mcLeaderboardItem上设置数据后从父类调用init。

这样的事情:

var leaderBoard:mcLeaderboardItem = new mcLeaderboardItem();
leaderBoard.rank = someRank;
leaderBoard.displayname = someName;
leaderBoard.init();
addChild(leaderBoard);

答案 1 :(得分:0)

如果您希望设置者在每次调用时更改文本字段,仅在init内设置文本一次是不够的。您必须在每个setter中设置文本。像这样重写你的课应该有效:

public class mcLeaderboardItem extends MovieClip 
{
    public function mcLeaderboardItem() 
    {
       // These will set the initial text of the text fields now.
       rank = 0;
       displayname = "Default";
       score = 0;
    }

    public function get rank():int
    {
        return (lblRank.text as int);
    }

    public function set rank(v:int):void
    {
        lblRank.text = v;
    }

    public function get displayname():String
    {
        return lblDisplayname.text;
    }

    public function set displayname(v:String):void
    {
        lblDisplayname.text = v;
    }

    public function get score():int
    {
        return (lblScore.text as int);
    }

    public function set score(v:int):void
    {
        lblScore.text = v;
    }
}