0

Papervision3D 中的 ScrollPane 组件存在重大问题。这个问题已经在几个不同的论坛上提出,但没有解决:

我尝试动态创建一个 ScrollPane,并将其拖到舞台上,当添加到 PaperVision3D 环境中的 MovieClip 时,它始终显示为默认大小(100、100)。我什至无法让 Tween 处理它的大小。

4

1 回答 1

1

好的,这就去。

我试图让它与 MovieAssetMaterial 一起工作,但没有运气。如果我在 MovieAssetMaterial 中跟踪舞台,则舞台为空,我猜这就是滚动窗格无法正常运行的原因。它是一个容器,因此它需要舞台来正确设置自己。

我已经设法在 papervision 平面上获得了一个 200x200 的滚动窗格,并通过一些变通方法进行交互。这是我的代码:

package{

    import org.papervision3d.*;
    import org.papervision3d.view.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.render.*;

    import flash.display.*;
    import flash.events.*;

    import fl.controls.*;
    import fl.containers.*;

    public class PV3DScrollPane extends MovieClip{

        private var viewport:Viewport3D;
        private var camera:Camera3D;
        private var scene:Scene3D;
        private var renderer:BasicRenderEngine;
        private var plane:Plane;

        public function PV3DScrollPane(){
            init3D();
        }

        private function init3D():void
        {       
            //setup 3d
            viewport = new Viewport3D(1024, 768, false, true);
            addChild(viewport);
            camera = new Camera3D();
            camera.z = -500;
            camera.zoom = 1;
            camera.focus = 500;
            camera.target = DisplayObject3D.ZERO;
            scene = new Scene3D();
            renderer = new BasicRenderEngine();
            //setup plane
            plane = makePlane();
            stage.addEventListener(Event.ENTER_FRAME, loop);
        }

        public function makePlane():Plane
        {
            //setup scroll pane
            var sp:ScrollPane = new ScrollPane();
            addChild(sp);
            sp.x = 1000;//hide it off stage, visible doesn't help much
            sp.source = 'http://www.helpexamples.com/flash/images/image1.jpg';
            sp.setSize(200, 200);
            //setup material & plane
            var mat:MovieMaterial = new MovieMaterial(sp, false, true, false);
            mat.interactive = true;
            var plane:Plane = new Plane(mat, 0, 0, 10, 10);
            scene.addChild(plane);
            return plane;
        }

        private function loop(evt:Event):void
        {
                //plane.rotationY++;
                renderer.renderScene(scene, camera, viewport);
        }
    }
}

以及解释:我尝试过使用 BasicView,但我无法获得相同的结果,所以我使用了创建场景、相机、渲染和视口的老式方法。由于 ScrollPane 需要舞台,因此我已将其添加到舞台然后设置其大小。我使用 ScrollPane 创建了一个 MovieMaterial,并将其交互性设置为 true。我通过放置舞台“隐藏”了组件。将可见设置为 false 让我回到了 100x100 问题。

我用谷歌搜索了一下,因为我记得 UI 组件曾经与 papervision 一起使用。这是真的,他们曾经工作过。是我记得的帖子。Blitz Agency 不久前也有类似的帖子。你可以找到 InteractiveMovieMaterial.as 如果你用谷歌搜索它,但它不适用于当前的 papervision 版本,因为不再有 drawFace3D 方法,事情发生了一些变化。完成修复后,我在 John Grden 的网站上发现了一篇关于此问题的更新(2008 年)博客文章。这种方法有相似之处,但我还没有经历过所有的麻烦。

希望这可以帮助!

于 2009-09-01T21:05:10.190 回答