Flash AS3:如何更改构造图形的Z索引?

时间:2014-02-01 04:09:46

标签: actionscript-3 flash z-index waveform

我正在尝试制作一个脉冲到一首歌的节拍的节目,顶部有波浪图案,但波浪模式似乎落后于一切。我知道如何更改添加到舞台的子项的索引,但我不知道如何设置图形的索引值。这是我的代码(如果相关):

import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.text.TextField;

var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("SuperHexagonMusic.mp3");
var channel:SoundChannel;

stage.addEventListener(Event.ENTER_FRAME, everyFrame);

snd.load(req);
channel = snd.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

function everyFrame(event:Event):void
{
    pulse.alpha = channel.leftPeak * 3;
    var bytes:ByteArray = new ByteArray();
    const PLOT_HEIGHT:int = 200;
    const CHANNEL_LENGTH:int = 256;

    SoundMixer.computeSpectrum(bytes, false, 0);

    var g:Graphics = this.graphics;

    g.clear();

    g.lineStyle(0, 0x000000);
    g.beginFill(0x000000);
    g.moveTo(0, PLOT_HEIGHT);

    var n:Number = 0;

    for (var i:int = 0; i < CHANNEL_LENGTH; i++)
    {
        n = (bytes.readFloat() * PLOT_HEIGHT);
        g.lineTo(i * 2.5, PLOT_HEIGHT - n);
    }

    g.lineTo(CHANNEL_LENGTH * 2.5, PLOT_HEIGHT);
    g.endFill();

    g.lineStyle(0, 0xFFFFFF);
    g.beginFill(0xFFFFFF, 0.5);
    g.moveTo(CHANNEL_LENGTH * 2.5, PLOT_HEIGHT);

    for (i = CHANNEL_LENGTH; i > 0; i--)
    {
        n = (bytes.readFloat() * PLOT_HEIGHT);
        g.lineTo(i * 2.5, PLOT_HEIGHT - n);
    }  

    g.lineTo(0, PLOT_HEIGHT);
    g.endFill();
}

function onPlaybackComplete(event:Event):void
{
    stage.removeEventListener(Event.ENTER_FRAME, everyFrame);
}

我所希望的是构造的波形图案位于脉冲之上,但是当前的代码会产生这样的结果:

在图像中,您可以看到波形图案的末端在脉冲后面突出。

简而言之:我如何将波浪模式带到前面?

1 个答案:

答案 0 :(得分:0)

父母的Graphics总是落后于所有父母的孩子。您应该自己创建另一个SpriteShape对象,将其放在显示列表的顶部,然后在其图形上绘制。

var spectrum:Shape=new Shape();
addChild(spectrum); // if last added, will be on top
function everyFrame(e:Event):void {
     var g:Graphics=spectrum.graphics; // that's all you need to change!
     // the rest of code follows
}