Actionscript 3 AS3:如何实现动态径向alpha渐变来模糊舞台?

Actionscript 3 AS3:如何实现动态径向alpha渐变来模糊舞台?,actionscript-3,flash,dynamic,gradient,alpha,Actionscript 3,Flash,Dynamic,Gradient,Alpha,我有一个可以在舞台上走动的球员 我希望在玩家周围的舞台上有一个小的照明,这样敌人和环境越远就越难看到。通过在这里使用这些答案,我在一定程度上做到了这一点 此外,我希望能够动态地控制alpha,这样当玩家按下指定的键时,舞台上的更多部分就会发光。我也在一定程度上做到了这一点 这是迄今为止的SWF 箭头键用于移动,Z键用于增加照明 我的问题是 a) 坡度太大,太小 b) 按Z键可以显示整个舞台,而我只想增加照明半径 下面是我的代码 var circle:Shape = new Shape;

我有一个可以在舞台上走动的球员

我希望在玩家周围的舞台上有一个小的照明,这样敌人和环境越远就越难看到。通过在这里使用这些答案,我在一定程度上做到了这一点

此外,我希望能够动态地控制alpha,这样当玩家按下指定的键时,舞台上的更多部分就会发光。我也在一定程度上做到了这一点

这是迄今为止的SWF

箭头键用于移动,Z键用于增加照明

我的问题是

a) 坡度太大,太小

b) 按Z键可以显示整个舞台,而我只想增加照明半径

下面是我的代码

    var circle:Shape = new Shape;

    public function player():void
    {
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(1000, 1000)            
        circle.graphics.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0, 1], [0, 255])
        circle.graphics.drawCircle(0, 0, stage.stageWidth)
        circle.graphics.endFill()
        addChild(circle);
为了控制阿尔法,我只是简单地使用:

    private function lux():void
    {
        circle.alpha = 0
    }

    private function onFrame(event:Event):void
    {
        if(circle.alpha < 1)
        {
            circle.alpha += 0.005
        }
private function lux():void
{
圈α=0
}
私有函数onFrame(事件:事件):void
{
如果(圆圈α<1)
{
圆α+=0.005
}
为了解决b),我能否以某种方式动态控制beginGradientFill()函数中的alpha参数

我也一直在看,但不知道如何掩盖舞台而不是剪辑

救救我吧,三个神


谢谢。

只是一个关于手动设置覆盖层的快速指南:

  • 首先,您需要一个容器(MovieClip),其blendmode设置为“LAYER”(在Property Inspector面板中[如果您不知道图像在哪里,我可以提供一个图像])。为了使以下子MovieClip的blendmode一起工作,这一步很重要
  • 接下来,您可以创建一个子Movieclip,完全舞台大小,带有所需alpha值的黑色矩形(对于阴影,项目将完全不发光)。这可以是一个简单的矩形,即#000000纯黑色,几乎没有透明度(例如…95%alpha)。创建该Movieclip后,将其blendmode设置为LAYER(或者乘法也可以)
  • 对于灯光,您可以创建另一个子Movieclip(放置在上面的“阴影”覆盖的顶部)。创建一个具有径向渐变的圆(比如白色,从纯不透明的100%alpha到完全透明的0%alpha)。将其设置为游戏中默认灯光范围所需的大小。然后,将Movieclip的blendmode设置为擦除
  • 如果所有操作都正确(我希望我正确描述了所有步骤!),当您导航回容器保存整个设置的时间线时,您应该会看到灯光的blendmode“遮罩”阴影层之外的部分(与闪光层中的传统遮罩相比,考虑到渐变的alpha,只有这样才能使其更加平滑)

    您仍然需要代码来告诉light Movieclip跟随您的播放器/光源,这可以通过两种方式实现:

    • 只移动灯光渐变。 或 -移动整个容器,但是,确保将阴影剪辑进一步拉伸到舞台大小,这样,如果玩家靠近舞台的任何边缘,阴影不会突然在屏幕的另一侧被切断

    毕竟,传统的Flash矢量渲染中的大屏幕变化往往表现缓慢。我可以给你的唯一建议是考虑使用Stave3D引擎(StaldIn,GeNeM2D等),但是这将是对你的游戏的一个巨大的改变,而且超出了这个问题的范围。

    编辑:为了更好地回答显示对象的层次结构,这里有一个图形
    (尽管是用难看的ASCII字符制作的)

    您也可以在此处查看屏幕广播教程:

    编辑2021
    很抱歉,伙计们,自从ScreenR录音被Clearing收购后,它似乎从互联网上消失了。在它上面尝试了短链接
    /6MJN
    ,但没有骰子。考虑到Flash现在几乎到处都被完全消灭了,这个录音可能不再重要了。

    我喜欢你使用code t的想法o动态创建播放器周围的照明渐变-但是使用暗覆盖(阴影)+亮覆盖(在Flash或Photoshop中创建)不是更简单吗,然后根据你的Z键条件调整灯光覆盖的比例以适应口味?或者你需要完全控制渐变衰减的开始和结束位置吗?嗯,是的,我不太确定我该怎么做,但听起来确实更简单。我会试试。非常感谢你的详细回答。不过我有一些困难。对于第一步,这个容器就是我的播放器吗?如果不是的话,它的形状基本上和你在第二步中描述的一样吗?还有,作为容器的一个子,我该如何创建这些电影嘴唇?最后,我该如何给这个圆一个径向渐变alpha?添加了场景图和screencast教程(用Screenr制作),希望这能澄清所有问题。效果很好!非常感谢你花这么多精力帮助我。不客气!(我承认我在这个问题上花的时间可能比以前任何一个问题都多)
    + Root
    |
    |- Your HUD / UI elements (if applicable)
    |
    |--+ Container, set to "LAYER" (MovieClip, follows player position)
    |  |
    |  |-Erasing Light, set to "ERASE" (MovieClip)
    |  |-Shadow Rect, set to "LAYER" or "MULTIPLY" (MovieClip)
    |
    |- Your Player
    |- Enemies, Items, Background Etc.