0

云、鸭子、分数显示和波浪都应该有一个类来管理它们的运动和行为。

当鸭子被点击时,它们会被“射击”,鸭子会从数组和舞台上移除(为此使用 arrayName.splice())。发生这种情况时,分数显示应该倒计时。

剩下的鸭子数量应该是 Score Display 类中的一个属性,并在射击鸭子时由 Main 调整。

当所有的鸭子都被“射中”时,游戏应该以动画形式显示“你赢了”的信息。这可以通过添加和删除将 ENTER FRAME 事件与动画函数相关联的事件侦听器来完成。(这只是值得的,所以留到最后)。

当鸭子被“射击”时,波浪和云也应该从视图和它们各自的阵列中移除。

玩家多次获胜或失败后,游戏应该重置。(不止一次)

我已经完成了大部分工作,我只是在记分牌上遇到了麻烦。任何有关如何重置所有内容以及编写您获胜标志的提示也会有所帮助。

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;

[SWF(width="800", height="600", backgroundColor="#E6FCFF")]

public class Main extends Sprite
{
    private var _sittingDucks:Array = []; //always set your arrays with [] at the top
    public var _scoreDisplay:TextField


    public function Main()
    {
        //adding the background, and positioning it
        var background:Background = new Background();
        this.addChild(background);
        background.x = 30;
        background.y = 100;

        for(var i:uint = 0; i < 5; i++)
        {
            //adding the first cloud, and positioning it
            var clouds:Clouds = new Clouds();
            this.addChild(clouds);
            clouds.x = 130 + Math.random() * 600; //130 to 730
            clouds.y = 230;
            clouds.speedX = Math.random() * 3;
            clouds.width = clouds.height = 200 * Math.random()//randomly changes the clouds demensions
        }   

        var waves:Waves = new Waves();
        this.addChild(waves);
        waves.x = 0;
        waves.y = 510;
        waves.speedX = Math.random() * 3;


        for(var j:uint = 0; j < 8; j++)
        {
            var ducks:Ducks = new Ducks();
            this.addChild(ducks);
            ducks.x = 100 + j * 100;
            ducks.y = 475;
            _sittingDucks.push(ducks);
            ducks.addEventListener(MouseEvent.CLICK, ducksDestroy);
        }

        var waves2:Waves = new Waves();
        this.addChild(waves2);
        waves2.x = 0;
        waves2.y = 520;
        waves2.speedX = Math.random() * 3;

        var setting:ForeGround = new ForeGround();
        this.addChild(setting);
        setting.x = 0;
        setting.y = 50;
        setting.width = 920;

        var board:ScoreDisplay = new ScoreDisplay();
        this.addChild(board);
        board.x = 570;
        board.y = 35;

    }
    private function ducksDestroy(event:MouseEvent):void
    {
        //store the crow we clicked on in a new array
        var clickedDuck:Ducks = Ducks(event.currentTarget);

        //remove it from the crows array
        //find the address of the crow we are removing
        var index:uint = _sittingDucks.indexOf(clickedDuck);

        //remove it from the array with splice
        _sittingDucks.splice(index, 1);

        //remove it from my document's display list
        this.removeChild(clickedDuck);
    }
}


import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import ScoreDisplayBase; // always import the classes you are using

public class ScoreDisplay extends ScoreDisplayBase
{
    private var txt:TextField; // where is it initialized?
    private var score:uint = 0;

    public function ScoreDisplay()
    {
        super(); // do you init txt here?
    }

    public function scoreUpdate():void
    {
        score += 10; // ok, so I suppose that your score does not represent the remaining ducks as you said, just only a score
        txt.text = score.toString();
    }
}
4

1 回答 1

2

好吧:

  1. 您确实想在 ScoreDisplay 的构造函数中创建 TextField txt。实例化它,将其文本设置为初始分数 (0),然后addChild(txt).

  2. 为了稍后设置分数,我们需要一种引用显示的方法。

    //you want a reference to the ScoreDisplay, not this
    public var _scoreDisplay:TextField //no
    public var _scoreDisplay:ScoreDisplay //yes
    

    当您在 Main 构造函数中创建它时,我们需要保留一个引用。

    _scoreDisplay = :ScoreDisplay = new ScoreDisplay();
    this.addChild(_scoreDisplay );
    _scoreDisplay .x = 570;
    _scoreDisplay .y = 35;
    
  3. 如果您希望能够重置游戏,我建议您创建鸭子并将其放置在 Main 类的构造函数之外的方法中。您还应该创建一个“重置”函数,在 ScoreDisplay 中将分数(和显示)设置为 0。

    private function spawnDucks() {
        for(var j:uint = 0; j < 8; j++)
        {
            var ducks:Ducks = new Ducks();
            this.addChild(ducks);
            ducks.x = 100 + j * 100;
            ducks.y = 475;
            _sittingDucks.push(ducks);
            ducks.addEventListener(MouseEvent.CLICK, ducksDestroy);
        }
    }
    

    然后你在构造函数中调用它,当你需要重置游戏时可以再次调用它。

  4. ducksDestroy(event:MouseEvent)将是您要重新计算分数、检查您是否赢了、显示消息并重置游戏的地方。您将需要某种弹出窗口来显示,如果您不知道从哪里开始,这是一个不错的弹出窗口。

    private function ducksDestroy(event:MouseEvent):void
    {
        //store the crow we clicked on in a new array
        var clickedDuck:Ducks = Ducks(event.currentTarget);
    
        //remove it from the crows array
        //find the address of the crow we are removing
        var index:uint = _sittingDucks.indexOf(clickedDuck);
    
        //remove it from the array with splice
        _sittingDucks.splice(index, 1);
    
        //remove it from my document's display list
        this.removeChild(clickedDuck);
    
        //update the score
        _scoreDisplay.scoreUpdate();
    
        //Check if all the ducks are gone
        if (_sittingDucks.length == 0) {
            //All the ducks are dead, we've won the game!
    
            //create some kind of popup to display.
            //add it to the screen, have some form
            //of button (or a timer) take it away
    
            //whatever takes the popup away, have it call 'reset'
    
        }
    }
    
    private function reset():void
    {
        //write a reset method to clear the score
        _scoreDisplay.reset(); 
    
        //create some ducks and you're ready to go!
        spawnDucks();
    }
    
于 2012-04-26T20:24:58.183 回答