![]() |
DDM君 (2010-01-26 16:20:03) |
可以考虑把plane变成layer,然后测试二维sprite的mouseEvent即可 |
![]() |
noxss (2010-01-27 09:45:09) |
是啊,如果只需要点击的话搞成2D事件就可以了~~绝对准确~ 如果有3D交互需求(比如需要获得点击位置的UV),可以试试给需要交互的地方分多些面。 |
![]() |
newyaya (2010-01-27 15:50:11) |
恩,是的,能不采用3d的最好不要用,我游戏里原来也有鼠标,但是使用起来不准确,如果你实在想用可以参考以下范例: sandy写的,用鼠标移动立方体,点击在该位置放置立方体。 package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import sandy.core.data.Point3D; import sandy.core.Scene3D; import sandy.core.scenegraph.Camera3D; import sandy.core.scenegraph.Group; import sandy.events.Shape3DEvent; import sandy.materials.Appearance; import sandy.materials.attributes.LightAttributes; import sandy.materials.attributes.LineAttributes; import sandy.materials.attributes.MaterialAttributes; import sandy.materials.ColorMaterial; import sandy.materials.Material; import sandy.primitive.Box; import sandy.primitive.Plane3D; /** * ... * @author Darknet */ public class SandyPlaceObjects extends Sprite { public var scene:Scene3D; public var camera:Camera3D; public var group:Group = new Group('group'); //public var box:Box = new Box('player', 32, 32, 32); public var ground:Plane3D = new Plane3D('bottom', 150, 250, 10, 10, Plane3D.ZX_ALIGNED,'quad'); public var tmpbox:Box = new Box('tmpbox'); public function SandyPlaceObjects() { camera = new Camera3D(300, 300); camera.y = 100; camera.lookAt(0,0,0); var root:Group = group; scene = new Scene3D( "scene", this, camera, root ); addEventListener(Event.ENTER_FRAME, enterFrameHandler ); var materialAttr:MaterialAttributes = new MaterialAttributes( new LineAttributes( 0.5, 0x2111BB, 0.4 ), new LightAttributes( true, 0.1) ); var material:Material = new ColorMaterial( 0xFFCC33, 1, materialAttr ); var app:Appearance = new Appearance( material ); //box.appearance = app; //box.useSingleContainer = false; //box.enableBackFaceCulling = false; ground.appearance = app; ground.enableBackFaceCulling = false; ground.useSingleContainer = false; ground.enableEvents = true; ground.addEventListener(MouseEvent.CLICK, placeobject); ground.addEventListener(MouseEvent.MOUSE_OVER, updateobjectover); ground.addEventListener(MouseEvent.MOUSE_OUT, updateobjectout); //group.addChild(tmpbox); //group.addChild(box); group.addChild(ground); } public function placeobject(objectevent:Shape3DEvent):void { var placeobject:Box = new Box('boxplace'); var v:Point3D = objectevent.point; placeobject.x = v.x; placeobject.y = v.y; placeobject.z = v.z; group.addChild(placeobject); //trace('added...'+"x:"+v.x+"y:"+v.y+"z:"+v.z); } public function updateobjectover(objectevent:Shape3DEvent):void { ground.addEventListener(MouseEvent.MOUSE_MOVE, updateobjectposition); group.addChild(tmpbox); } public function updateobjectposition(objectevent:Shape3DEvent):void { //trace('over'); var v:Point3D = objectevent.point; tmpbox.x = v.x; tmpbox.y = v.y; tmpbox.z = v.z; //trace('added...'+"x:"+v.x+"y:"+v.y+"z:"+v.z); } public function updateobjectout(objectevent:Shape3DEvent):void { ground.removeEventListener(MouseEvent.MOUSE_MOVE, updateobjectposition); group.removeChildByName(tmpbox.name); } private function enterFrameHandler( event : Event ) : void { scene.render(); } } } |
![]() |
snyuan (2010-01-29 00:23:25) |
谢谢各位,我也想能尽量用二维处理的就不用三维,毕竟二维的效率和精度要高多了。我做了个测试,在3D平面Plane上添加二维上的鼠标处理事件this.addEventListener(MouseEvent.CLICK,mouseClickHandler); 但是这好像根本不起作用。是不是这个二维事件处理函数被PV3D的InteractiveScene3DEvent屏蔽了。 如果如DDM君所说,把plane变成layer,然后测试二维sprite的mouseEvent,我不太清楚到底该怎么建立layer和加测试事件,另外此事件处理函数中怎么知道鼠标是对哪个3D对象进行操作的,麻烦详细介绍一下。多谢 |
![]() |
noxss (2010-01-29 10:26:08) |
这个...要DISPLAYOBJECT才能用二维事件吧... 参考研究所的教程把PLANE放到一个VIEWPORTLAYER中再给这个VIEWPORTLAYER添加3D事件侦听就好了 |
![]() |
noxss (2010-01-29 11:25:41) |
2D侦事件..想太多3D了,呵呵 |
![]() |
snyuan (2010-02-02 01:54:27) |
谢谢noxss君还有各位大侠。VIEWPORTLAYER添加2D事件侦听的方法还是很好用的。 |
|
|