8

我在 Flash 视频播放器中遇到了一个奇怪的、非常难以重现的图形故障!到目前为止,仅在 Chrome 中。

截屏

“进入建筑物”下方的灰色矩形显示了 Flash 播放器所在的 html div 的背景颜色。“我们在哪里”链接下方有一个较小的矩形。这些是具有脚本悬停动画的精灵(包含其他几个精灵和显示对象)(它们缓慢地向位于其原点一定范围内的随机点移动)。故障与它们一起调整大小,有时会消失。

最奇怪的是它使整个 Flash 组件透明。创建视频播放器时,我运行此代码:

        graphics.clear();
        graphics.beginFill(0xff00ff, 1);
        graphics.drawRect(0, 0, _stage.stageWidth, _stage.stageHeight);
        graphics.endFill();

所以视频播放器的背面应该有一个明亮的颜色,如果我不加载视频播放器,我已经确认它在那里。然而,这种明亮的颜色并没有显示出来,而是包含播放器的背景 div 发光。

这对我来说绝对没有意义......而且我不知道如何调试它。我所知道的是,故障的出现取决于文本链接在屏幕上悬停的位置。

闪光灯以 WMODE 透明加载,这是我们需要的,因为它在半透明的一侧有一个可扩展的“翼”。

编辑:

它在 www.48hourgames.com 上直播。创建帐户后,您将看到以上面屏幕截图结尾的视频播放器。

4

5 回答 5

5

这是 Pepper Flash 播放器的问题。Adobe 和 Google 已经为此努力了一段时间,这就是他们打算如何让 Flash 保持活力并在 Linux 平台上运行。

不幸的是,Pepper Flash 有很多缺陷。今年夏天的某个时候,Pepper Flash 成为 Chrome 中所有操作系统的默认 Flash 插件。它有很多问题没有真正的解决方案,除了禁用它(并希望 Adob​​e/Google 能解决这些问题)。

要禁用 Pepper Flash:

  • 去:铬://插件
  • 单击右上角的详细信息图标
  • 找到 Flash Player 插件部分,您可能会在此处安装多个版本的 Flash。我刚刚安装了 Chrome 来验证问题所在,并且安装了 Pepper Flash 以及 2 个“普通”版本的 Flash。
  • 禁用路径中包含“PepperFlash”的 Flash 插件。
于 2012-12-20T16:11:50.957 回答
4

我能够非常可靠地重现该问题。几个想法:

  • 听起来wmode transparent可能会经常出现问题。也许你可以让 Flash 元素的宽度为 100%,并在左/右边缘做一个无缝的背景。在 Flash 中,您可以防止它通过stage.scaleMode = StageScaleMode.NO_SCALE;. 如果 Flash 走完整个宽度,您可以摆脱wmode transparent并且可能会很好。
  • 您是否尝试过设置cacheAsBitmap覆盖true电影的两个按钮?
  • 因为伪影只出现在电影的结尾,所以当它是静止帧时,也许在电影达到这个最终状态时设置cacheAsBitmap到电影上会起作用吗?true
  • 也许当它到达最终状态时用看起来相同的PNG图像换掉电影?
  • 如果它们还不是PNG图像,也许用PNG图像交换两个按钮?

如果这些都不起作用...变得更加绝望。

  • 也许将 SWF 中的侧边菜单(扩展 Flash 元素)剥离成它自己的 SWF 并放在电影 SWF 的顶部。这样,电影 SWF 可能会丢失wmode transparent,并且可能不会在侧面菜单上发生故障。
  • 侧边菜单可以是 HTML。
    • 翻转状态可以是 HTML 元素。
    • 或者,侧边菜单可以调用 Flash 元素来切换翻转文本。对 Flash 的调用必须通过ExternalInterface类(详细信息)进行注册。

因为我没有代码来测试任何东西,所以这些都是在黑暗中拍摄的

我将从cacheAsBitmap相关的想法开始。然后转到PNG创意(按钮,最后一帧)。从那里,尝试 Flash 元素的全角版本。如果这些都不起作用,您可能需要考虑新设计。如果这不是一个选项,我将继续拆分侧边菜单,并进行变体,如上所述。

于 2012-12-20T23:36:18.840 回答
2

我今天使用最新的 Flash Player 版本 11.6 + Chrome 27 遇到了这个问题。在某些计算机上它可以正常工作,而在其他几台计算机上却没有,这使得很难找到问题,因为它没有发生在我身边。

我相信这是 Flash 的错误,而不是 chrome,因为当我右键单击 -> 放大,右键单击 -> 缩小时,脏补丁消失了

所以我四处寻找一个肮脏的快速修复。

尝试过cacheAsBitmap方法:不起作用(此修复适用于“黑色透明”问题,但不适用于此问题)。

尝试了两帧图像方法:都不工作(不知道为什么)

我终于找到了一种修复方法(测试了几次):

由于脏的白色补丁只在动画结束时出现,我在舞台上放了一个透明的形状补间剪辑,让它永远运行。它有效。

p/s:实际上我试图将其添加为评论而不是答案,但找不到方法,这很奇怪。

于 2013-06-04T04:01:57.673 回答
0

今天在玩拼图游戏时,我在 Google Chrome 31.0.1650.63 上遇到了这个问题。我通常不使用这个浏览器,因此 flash 在每个浏览器中的工作方式都应该完全相同,所以当我听到白色矩形覆盖在我的游戏中时,我有点惊讶。将 wmode 设置为不透明而不是透明可以解决此问题。

于 2013-12-30T14:00:35.523 回答
0

同样在这里,在我的视频播放器中也是如此。

仅在 chrome pepper flash 中,并且仅当 swf 嵌入了透明 wmode 时。

今天我在网上找到了一个我可以忍受的修复/解决方法/黑客:

“如果你想用一个简单的技巧绕过这个问题,你可以绘制一个透明填充的电影剪辑。每一帧都会切换它的 'alpha' 属性。因为它的填充是透明的,所以它的 'alpha' 属性不会做任何事情,除了强制全屏重绘以更新 MovieClip 的 alpha 属性。这反过来又修复了由于 wmode 透明而导致的任何故障渲染。

通过添加 moueEnabled = false,您可以确保黑客不会干扰任何现有的鼠标事件”

import flash.display.MovieClip;
import flash.events.Event;

var redrawAll = new MovieClip();
redrawAll.mouseEnabled = false;
redrawAll.graphics.beginFill(0x000000, 0);
redrawAll.graphics.moveTo(0,0);
redrawAll.graphics.lineTo(stage.stageWidth, 0);
redrawAll.graphics.lineTo(stage.stageWidth, stage.stageHeight);
redrawAll.graphics.lineTo(0, stage.stageHeight);
redrawAll.graphics.endFill();
addChild(redrawAll);

addEventListener(Event.ENTER_FRAME, function(e:Event){
    redrawAll.alpha = (redrawAll.alpha == 0)? 1 : 0;                 
});

"

来源:https ://code.google.com/p/chromium/issues/detail?id=173089#c12

于 2014-02-07T22:33:17.633 回答