在Papervision3D中,3D场景交互事件主要用到了一个新的类:InteractiveScene3DEvent,这个类在
org.papervision3d.events包中,主要定义了有关鼠标和3D对象之间交互时事件驱动的一些静态属性,如点击、移动、滑开、滑上、按
下、按下并释放、按下释放移开等。
该类的构造函数是:
InteractiveScene3DEvent (type:String,
container3d:DisplayObject3D = null, bubbles:Boolean = false,
cancelable:Boolean = false) |
详细的参数就不再一一解释,你只要记住它的用法比照Flash CS3中的MouseEvent类使用,这里简单提供在Flash
CS3帧上的测试代码(使用前不要忘了要import包类):
import org.papervision3d.events.InteractiveScene3DEvent;
addEventListener(InteractiveScene3DEvent.OBJECT_CLICK,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_MOVE,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_OUT,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_OVER,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE,
onHandle);
addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE_OUTSIDE,
onHandle);
private function onHandle(e:InteractiveScene3DEvent):void
{
trace(e.type);
}
|
注意观察输出面板相关的信息!
基本3D交互场景事件实例:
本实例是场景中有一个旋转的平面Plane,正反面都有贴图,当用鼠标移上或移开时交换显示不同的图片,点击该平面时向相反方向旋转。在代码中,我预先创
建一个3D对象Plane平面,并使用两张不同的图片来做材质贴图,然后使用InteractiveScene3DEvent来驱动鼠标事件。效果图示如
下:
具体代码如下:
package
{
import
PaperBase;
import
org.papervision3d.objects.DisplayObject3D;
import
org.papervision3d.events.InteractiveScene3DEvent;
import
org.papervision3d.materials.BitmapFileMaterial;
import
org.papervision3d.objects.primitives.Plane;
import it.flashfuck.debugger.FPSMonitor;
public class
MainInteractiveScene3dEvent extends PaperBase
{
private var
ourMaterial:BitmapFileMaterial = new
BitmapFileMaterial("img/pic43.jpg");//用于plane平面对象上的材质贴图
private var
ourOverMaterial:BitmapFileMaterial = new
BitmapFileMaterial("img/pic12.jpg");//用于当鼠标移到plane平面上时的材质贴图
private var yawspeed:Number =
3;//设置yaw()方法的旋转角度
private var
plane:DisplayObject3D;
public function MainInteractiveScene3dEvent()
{
addChild(new FPSMonitor());
init();
}
override protected function init3d():void
{
ourMaterial.interactive = true;//设置材质交互
ourMaterial.doubleSided = true;
ourOverMaterial.interactive = true;
ourOverMaterial.doubleSided = true;
plane = new Plane(ourMaterial,1000,1000,4,4);
default_scene.addChild(plane);
plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
onInteractiveHandle);
plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT,
onInteractiveHandle);
plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER,
onInteractiveHandle);
}
private
function onInteractiveHandle(e:InteractiveScene3DEvent):void
{
if (e.type
== "mousePress")
{
yawspeed *= -1;
}
if (e.type == "mouseOut")
{
plane.material=ourMaterial
}
if (e.type == "mouseOver")
{
plane.material = ourOverMaterial;
}
}
override protected function processFrame():void
{
plane.yaw(yawspeed);
}
}
} |
总结:本节主要是关于交互场景3D事件类的基本用法,比
较简单。实际上,该类的使用和Flash
CS3中的MouseEvent类一样;另外需要注意的是,该类定义的是静态属性,因此可以“类名.属性”的方式直接使用;事件处理器函数可以调用同一个
函数实现不同的功能,如本例中对3D鼠标事件的处理采用if条件来实现指定的事件处理,算是对代码的一种优化吧。如果对代码中相关的材质贴图不是很明白,
可以参看前面的内容。
本教程可自由转载,请注明转载出处,谢谢~!