Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3中更新变量_Actionscript 3_Flash_Flashdevelop - Fatal编程技术网

Actionscript 3 在AS3中更新变量

Actionscript 3 在AS3中更新变量,actionscript-3,flash,flashdevelop,Actionscript 3,Flash,Flashdevelop,我正在遵循一个回避游戏教程,似乎无法在我的课程的所有部分获得更新的值 package { import flash.display.Sprite; import flash.text.TextField import flash.text.TextFormat public class Score extends Sprite { public var scoreDisplay:String; public var currentValue:int; p

我正在遵循一个回避游戏教程,似乎无法在我的课程的所有部分获得更新的值

package  
{
import flash.display.Sprite;    
import flash.text.TextField
import flash.text.TextFormat


public class Score extends Sprite
{
    public var scoreDisplay:String;
    public var currentValue:int;

    public function Score() 
    {
        updateDisplay()
    }

    public function updateDisplay():void
    {

        scoreDisplay = currentValue.toString();

        var format:TextFormat = new TextFormat();
            format.size = 25;
            format.font = "Verdana"

        var myText:TextField = new TextField();
            myText.defaultTextFormat = format;
            myText.text = scoreDisplay;
            myText.background = true;
            myText.autoSize
            myText.width = 50;
            myText.height = 35;

        addChild(myText)
            myText.x = 340
            myText.y = 10
            myText.mouseEnabled = false
    }

    public function addToValue( amountToAdd:Number ):void
    {
        currentValue = currentValue + amountToAdd;
    }
}
}
每当我运行'addToValue'中'currentValue'的跟踪时,它都会以10的增量进行更新,但'updateDisplay'中'currentValue'的跟踪始终具有0的值。我绝对不明白为什么一个“currentValue”不更新另一个

编辑1:

package  
{
import flash.display.Sprite;

public class Start extends Sprite
{
    public var game:Game;
    public var gameover:GameOver;
    public var background:Sprite;


    public function Start() 
    {
        background = new Sprite
        background.graphics.beginFill(0xC0C0C0)
        background.graphics.drawRect(0, 0, 400, 300)
        background.graphics.endFill();
        addChild(background)


        var score:Score = new Score()
        addChild(score)

        game = new Game();
        game.addEventListener(AvatarEvent.DEAD, startOver);
        addChild(game);
    }

    public function startOver(avatarEvent:AvatarEvent):void
    {
        game.removeEventListener(AvatarEvent.DEAD, startOver);
        gameover = new GameOver();
        gameover.addEventListener(NavigationEvent.RESTART, requestRestart);
        removeChild(game)
        addChild(gameover);
    }

    private function requestRestart(e:NavigationEvent):void 
    {
        restartGame();
    }

    public function restartGame():void
    {
        gameover.removeEventListener(NavigationEvent.RESTART, requestRestart);
        game = new Game();
        game.addEventListener(AvatarEvent.DEAD, startOver);
        addChild(game);

        removeChild(gameover);
    }
}

}
编辑2

package  
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;

import Score;

public class Game extends Sprite
{
    public var army:Array;
    public var gameTimer:Timer;
    public var player:Player;
    public var background:Sprite;
    private var instanceScore:Score

    public function Game() 
    {           
        army = new Array();
        var newenemy:Enemy = new Enemy(100, -15);
        army.push(newenemy);
        addChild(newenemy);

        player = new Player();
        addChild(player);
        player.x = mouseX;
        player.y = mouseY;

        gameTimer = new Timer(20);
        gameTimer.addEventListener(TimerEvent.TIMER, move);
        gameTimer.addEventListener(TimerEvent.TIMER, onTick);
        gameTimer.start();

        instanceScore = new Score();
    }

    private function move(timerEvent:TimerEvent):void
    {

        player.x = mouseX;
        player.y = mouseY;

        for each (var enemy:Enemy in army)
        {
            enemy.moveDownABit();

            if (player.hitTestObject(enemy))
            {
                gameTimer.stop();

                dispatchEvent( new AvatarEvent( AvatarEvent.DEAD));

            }
        }
    }

    public function onTick(e:Event):void
    {
        if (Math.random() < .1)
        {
            var randomX:Number = Math.random() * 400;
            var newEnemy:Enemy = new Enemy(randomX, -15);
            army.push(newEnemy);
            addChild(newEnemy);

            instanceScore.addToValue(10)

            var score:Score = new Score()
            addChild(score)

        }
    }


}

}
包
{
导入flash.display.Sprite;
导入flash.events.Event;
导入flash.events.TimerEvent;
导入flash.text.TextField;
导入flash.text.TextFormat;
导入flash.utils.Timer;
导入分数;
公共类游戏扩展精灵
{
公共军队:阵列;
公共变量gameTimer:计时器;
公共玩家:玩家;
公共背景:雪碧;
private-var-instanceScore:Score
公共功能游戏()
{           
陆军=新阵列();
var new敌军:敌军=新敌军(100,-15);
军队。推(新敌人);
addChild(新敌人);
player=新玩家();
addChild(玩家);
player.x=mouseX;
player.y=mouseY;
游戏计时器=新计时器(20);
gameTimer.addEventListener(TimerEvent.TIMER,move);
gameTimer.addEventListener(TimerEvent.TIMER,onTick);
gameTimer.start();
instanceScore=新分数();
}
私有函数移动(timerEvent:timerEvent):无效
{
player.x=mouseX;
player.y=mouseY;
每个(var敌人:军队中的敌人)
{
敌人。移动可移动();
如果(玩家.命中测试对象(敌人))
{
gameTimer.stop();
dispatchEvent(新化身(化身死亡));
}
}
}
公共功能点击(e:事件):无效
{
if(Math.random()<.1)
{
var randomX:Number=Math.random()*400;
var new敌军:敌军=新敌军(随机X,-15);
军队。推(新敌人);
addChild(新敌人);
instanceScore.addToValue(10)
变量分数:分数=新分数()
addChild(分数)
}
}
}
}

addToValue
调用
updateDisplay
,但也要将
TextFields
提取到实例变量中,并将它们添加到
init
方法中。必须显式设置值。您需要一个隐式数据流。。。这在ActionScript 3中没有给出。另一种方式是事件。。。但这也只是使用方法

首先,我要为通知创建一个专用事件。只要您更熟悉ActionScript中的架构思想,这就很有用了。这可能是非常规的概括,但出于访问器(
get score
)和变异器(
set score
)的演示目的,这可能是一个好主意

package {

  import flash.events.Event;

  public class ScoreChangeEvent extends Event {

    public static const SCORE_CHANGED:String = 'scoreChanged';

    private var _score:int;

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

    public function ScoreChangeEvent(score:int) {
      super(SCORE_CHANGED, true, false);
      this._score = score;
    }

    override public function clone():Event {
      return new ScoreChangeEvent(_score);
    }
  }
}
然后我重构了代码的一些部分,使得应该可以访问的部分可以访问,应该可以扩展和不可访问的部分可以扩展,外部世界不应该访问的部分可以访问

package {

  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.text.TextFormat;

  [Event(name="scoreChanged", type="ScoreChangeEvent")]

  public class ScoreDisplay extends Sprite {

    /** The text field displaying the score. */
    protected var _scoreTextField:TextField;

    /** The internal storage variable for score to display. */
    private var _score:int;

    /**
     * The score to be displayed. When the score changes,
     * a ScoreChangeEvent will be dispatched.
     *
     * @see ScoreChangeEvent#SCORE_CHANGED
     */
    public function get score():int {
      return _score;
    }

    public function set score(value:int):void {
      if (_score == value) {
        return;
      }
      _score = value;
      updateDisplayList();
      this.dispatchEvent(new ScoreChangeEvent(_score));
    }

    public function ScoreDisplay() {
      init();
    }

    /** Creation of children and initial rendering. */
    private function init():void {
      this.createChildren();
      this.updateDisplayList();
    }

    /**
     * DisplayObjects, which are one created once should be
     * created in a dedicated method.
     */
    protected function createChildren():void {

      if (!_scoreTextField) {
        const format:TextFormat = new TextFormat();
        format.size = 25;
        format.font = "Verdana";

        _scoreTextField = new TextField();
        _scoreTextField.defaultTextFormat = format;
        _scoreTextField.background = true;
        _scoreTextField.autoSize;
        _scoreTextField.width = 50;
        _scoreTextField.height = 35;
        _scoreTextField.x = 340;
        _scoreTextField.y = 10;
        _scoreTextField.mouseEnabled = false;

        addChild(_scoreTextField);
      }
    }

    /** Reset the display. */
    public function reset():void {
      this.score = 0;
    }

    /**
     * Adds a certain value to the current score.
     * @param value The calue to be added.
     */
    public function addToScore(value:int):void {
      score += value;
    }

    /**
     * Update the display when ever needed.
     * 
     * This method should never be triggered by an
     * different class, only be the instance itself
     * when a value changed.
     */
    protected function updateDisplayList() {
      this._scoreTextField.text = this.score.toString();
    }
  }
}
  • 只有通过get/set方法才能访问
    score
    ,这使得通过日志记录或调试器更改值时易于理解
  • \u scoreTextField
    受保护,这意味着可以通过扩展子类来修改它
  • addToScore
    将修改
    score
    属性,该属性将更新显示
  • updateDisplayList
    仅在
    score
    更改时才会调用。这使得人们很容易理解发生了什么
我的代码是Flex组件生命周期的廉价副本,只是为了说明某些模式在Flash中98%的用户界面相关编程中可能非常方便

相反,您的
类也可以简单地重构为

package {

  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.text.TextFormat;

  public class ScoreDisplay extends Sprite {

    protected var scoreTextField:TextField;

    private var _score:int;

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

    public function set score(value:int):void {
      if (_score == value) {
        return;
      }
      _score = value;
      scoreTextField.text = _score.toString();
    }

    public function ScoreDisplay() {
      const format:TextFormat = new TextFormat();
      format.size = 25;
      format.font = "Verdana";

      scoreTextField = new TextField();
      scoreTextField.defaultTextFormat = format;
      scoreTextField.background = true;
      scoreTextField.autoSize;
      scoreTextField.width = 50;
      scoreTextField.height = 35;
      scoreTextField.x = 340;
      scoreTextField.y = 10;
      scoreTextField.mouseEnabled = false;

      addChild(scoreTextField);
    }

    public function addToScore(value:int):void {
      score += value;
    }
  }
}
但是,这些代码并不是真正可扩展的,当游戏变得更加复杂时,需要进行更多的更改,更重要的是,在扩展组件时,需要您进行更多的思考


我希望这有点帮助。

发布使用此
分数的代码。
class.Updated。代码运行,当前在右上角
分数处显示“0”。在您发布的代码中从未调用addToValue
。我误解了您的意思,并对我的帖子进行了进一步编辑。您是否介意解释更多关于提取文本文件并显式设置它们的内容?对不起,我对AS3很陌生,希望不是太多。:)不,这太棒了。有两个例子是过分的。非常感谢你。