AS3:如何实现动态径向 alpha 渐变来混淆舞台?
AS3: How do I implement a dynamic radial alpha gradient to obfuscate the stage?
我有一个可以在舞台上移动的播放器。
我想在玩家周围的舞台上有一个小的照明,这样敌人和环境越远就越难被看到。通过在此处使用这些答案,我已经能够在一定程度上实现这一目标 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大神救救我
谢谢。
关于手动设置叠加层的快速指南:
- 首先,您需要一个容器 (MovieClip),其混合模式设置为“LAYER”(在 属性 检查器面板中 [如果您不知道它在哪里,我可以提供图像] ).为了让以下子 MovieClips 的混合模式协同工作,此步骤很重要。
- 接下来,您可以创建一个子 Movieclip,全舞台大小,具有所需 alpha 值的深色矩形(对于您的阴影,项目将完全不亮)。这可以是一个简单的矩形,#000000 纯黑色,几乎没有任何透明度(比如... 95% alpha)。创建 Movieclip 后,将其混合模式设置为 LAYER(或者 MULTIPLY 也可以)。
- 对于灯光,您可以创建另一个子 Movieclip(放置在上面的“阴影”叠加层之上)。创建一个具有径向渐变的圆(比方说白色,从完全不透明的 100% alpha 到完全透明的 0% alpha)。无论游戏中的默认照明范围是什么,都将其设置为您需要的大小。然后,将该 Movieclip 的混合模式设置为 ERASE。
如果一切都正确完成(我希望我正确描述了所有步骤!),当您导航回容器包含整个设置的时间轴时,您应该看到光的混合模式“遮蔽”了该部分脱离阴影层(与 Flash 层中的传统遮罩相比,考虑到渐变的 alpha,只有这样才能更平滑)。
您仍然需要代码来告诉灯光 Movieclip 跟随您的播放器/光源,这可以通过两种方式实现:
- 只移动灯光渐变。
要么
- 移动整个容器,但是,确保你将阴影剪辑进一步拉伸到舞台大小,这样如果你的玩家靠近舞台的任何边缘,阴影不会突然在另一侧被切断) 的屏幕。
总而言之,传统 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.
您还可以在此处查看截屏教程:
https://www.screenr.com/6MJN
编辑 2021:
抱歉,伙计们,自从 Articulate 收购后,ScreenR 录音似乎从互联网上消失了。在上面尝试了短链接 /6MJN
,但没有成功。考虑到 Flash 现在几乎到处都被彻底消灭了,这个记录可能不再重要了。
我有一个可以在舞台上移动的播放器。
我想在玩家周围的舞台上有一个小的照明,这样敌人和环境越远就越难被看到。通过在此处使用这些答案,我已经能够在一定程度上实现这一目标 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大神救救我
谢谢。
关于手动设置叠加层的快速指南:
- 首先,您需要一个容器 (MovieClip),其混合模式设置为“LAYER”(在 属性 检查器面板中 [如果您不知道它在哪里,我可以提供图像] ).为了让以下子 MovieClips 的混合模式协同工作,此步骤很重要。
- 接下来,您可以创建一个子 Movieclip,全舞台大小,具有所需 alpha 值的深色矩形(对于您的阴影,项目将完全不亮)。这可以是一个简单的矩形,#000000 纯黑色,几乎没有任何透明度(比如... 95% alpha)。创建 Movieclip 后,将其混合模式设置为 LAYER(或者 MULTIPLY 也可以)。
- 对于灯光,您可以创建另一个子 Movieclip(放置在上面的“阴影”叠加层之上)。创建一个具有径向渐变的圆(比方说白色,从完全不透明的 100% alpha 到完全透明的 0% alpha)。无论游戏中的默认照明范围是什么,都将其设置为您需要的大小。然后,将该 Movieclip 的混合模式设置为 ERASE。
如果一切都正确完成(我希望我正确描述了所有步骤!),当您导航回容器包含整个设置的时间轴时,您应该看到光的混合模式“遮蔽”了该部分脱离阴影层(与 Flash 层中的传统遮罩相比,考虑到渐变的 alpha,只有这样才能更平滑)。
您仍然需要代码来告诉灯光 Movieclip 跟随您的播放器/光源,这可以通过两种方式实现:
- 只移动灯光渐变。 要么 - 移动整个容器,但是,确保你将阴影剪辑进一步拉伸到舞台大小,这样如果你的玩家靠近舞台的任何边缘,阴影不会突然在另一侧被切断) 的屏幕。
总而言之,传统 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.
您还可以在此处查看截屏教程:
https://www.screenr.com/6MJN
编辑 2021:
抱歉,伙计们,自从 Articulate 收购后,ScreenR 录音似乎从互联网上消失了。在上面尝试了短链接 /6MJN
,但没有成功。考虑到 Flash 现在几乎到处都被彻底消灭了,这个记录可能不再重要了。