AS3:如何实现动态径向alpha渐变来混淆舞台?

时间:2015-04-07 04:12:06

标签: actionscript-3 flash dynamic gradient alpha

我有一个可以在舞台上移动的玩家。

我希望对玩家周围的舞台有一点点照明,这样敌人和环境就越难以看到他们越远。通过在AS3: beginGradientFIll() doesn't make me a gradient!

使用这些答案,我已经在一定程度上实现了这一目标

此外,我希望能够动态控制alpha,以便当玩家按下指定的键时,更多的舞台会变亮。我也能在一定程度上实现这一目标。

到目前为止,这是SWF。 http://www.fastswf.com/9cOxDwo

箭头键移动,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);

控制alpha我只是简单地使用:

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

    private function onFrame(event:Event):void
    {
        if(circle.alpha < 1)
        {
            circle.alpha += 0.005
        }

要解决b),我可以以某种方式动态控制beginGradientFill()函数中的alpha参数吗?

我也一直在关注this,但无法弄清楚如何屏蔽舞台而不是剪辑。

救救我AS3众神。

感谢。

1 个答案:

答案 0 :(得分:1)

以手动方式设置叠加层的快速指南:

1)首先,你需要一个容器(MovieClip),其blendmode设置为&#34; LAYER&#34; (在Property Inspector面板中[如果你不知道它在哪里,我可以提供图像])。这一步很重要,以便让以下儿童MovieClips&#39; blendmode一起工作。 2)接下来,您可以创建一个子Movieclip,全舞台大小,带有所需alpha值的暗矩形(对于您的阴影,项目将完全不亮)。这可以是简单的矩形形状,#000000纯黑色,几乎没有任何透明度(比如说... 95%alpha)。一旦创建了Movieclip,将其blendmode设置为LAYER(或者MULTIPLY也可以)。 3)对于灯光,您可以创建另一个儿童Movieclip(放置在上面的#34;阴影&#34;叠加)。创建一个具有径向渐变的圆圈(比如白色,从纯不透明的100%alpha到完全透明的0%alpha)。无论游戏中的默认照明范围如何,都要使其成为您所需的尺寸。然后,将Movieclip的blendmode设置为ERASE。

如果一切正确完成(我希望我正确描述了所有步骤!),当您导航回容器保存整个设置的时间线时,您应该看到灯光的混合模式&#34;掩盖&#34 ;阴影层之外的部分(与闪存图层中的传统遮罩相比,只考虑渐变的alpha,这样做更顺畅)。

您仍然需要使用代码告诉Light Movieclip关注您的播放器/光源,可以通过两种方式进行处理: - 仅移动灯光渐变。 要么 - 移动整个容器,但是,请确保你将舞台大小的阴影片伸展得更远,这样如果你的播放器靠近舞台的任何边缘,阴影就不会突然在对面突然切断(s)屏幕。

在完成所有这些之后,传统Flash矢量渲染中的大屏幕变化往往会导致性能下降。我之后可以给你的唯一建议是考虑使用Stage3D动力引擎(Starling,Genome2D等),但这对你的游戏来说是一个很大的改变 - 超出了这个问题的范围。

编辑,为您提供有关DisplayObjects层次结构的更好答案,这里有一个图表(尽管用丑陋的ASCII字符制作)

+ 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.

您还可以在此处查看截屏教程:
Quick Tutorial on making a Radial Gradient light & shadow setup
https://www.screenr.com/6MJN