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
类也可以简单地重构为
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很陌生,希望不是太多。:)不,这太棒了。有两个例子是过分的。非常感谢你。