Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3/AIR Mobile在移动对象上的点击和/或触摸事件_Actionscript 3_Mobile_Air_Touch_Stage3d - Fatal编程技术网

Actionscript 3 AS3/AIR Mobile在移动对象上的点击和/或触摸事件

Actionscript 3 AS3/AIR Mobile在移动对象上的点击和/或触摸事件,actionscript-3,mobile,air,touch,stage3d,Actionscript 3,Mobile,Air,Touch,Stage3d,几周前,我问了一个关于类似问题的问题,但在Starling框架内() 现在,我正在用Away3d开发另一款手机应用/游戏。我似乎在触摸/轻触移动的球体或长方体时也有同样的问题。当球体不移动时,我可以精确地点击它的位置,但当它旋转时,点击事件不会触发非常精确的结果。 这只发生在手机上(在Android 4.2.2:Nexus7/Galaxy S2和iOS:iPad2/iPad视网膜上测试) 注意:我还尝试了不同的帧率、更多的事件(鼠标向上、向下等)、不同的选择器 由于这个问题也发生在2d移动精灵身

几周前,我问了一个关于类似问题的问题,但在Starling框架内()

现在,我正在用Away3d开发另一款手机应用/游戏。我似乎在触摸/轻触移动的球体或长方体时也有同样的问题。当球体不移动时,我可以精确地点击它的位置,但当它旋转时,点击事件不会触发非常精确的结果。 这只发生在手机上(在Android 4.2.2:Nexus7/Galaxy S2和iOS:iPad2/iPad视网膜上测试)

注意:我还尝试了不同的帧率、更多的事件(鼠标向上、向下等)、不同的选择器

由于这个问题也发生在2d移动精灵身上(在椋鸟身上),我猜它可能是舞台3D或与空气相关的,而不是椋鸟/away3d


有人有什么建议吗?也许我忘记在app.xml中设置一些东西了?

这两个框架都必须处理无事件系统(Stage3D)。Stage3D不会捕捉或接收任何事件,当然也不会触摸或鼠标事件。因此,两个框架都使用一个内部系统来模拟这些事件,该系统捕捉舞台上的事件,并试图重现准确的估计。我个人觉得这些系统CPU太贵,不够精确,所以我的建议是像我一样,创建自己的系统。只需在舞台上捕捉事件,并确定哪些显示的对象(在舞台3d上使用它们的位置)已被触摸。我个人从中获得了性能提升(尤其是对椋鸟)和更高的准确度。

你说的“发射不太准确”是什么意思?在3d中单击对象通常是通过光线投射完成的,因此可能存在问题。我必须在要单击的对象的前面(对象移动的方向)单击。触摸事件似乎是在图形更新之前处理的。更新:见Jeffrey的回复,也许这也是问题所在。似乎是对的-你在fps方面有问题吗,这会使这个问题更加明显吗?不,我可以在Nexus7表上以稳定的60 fps运行。在enter frame事件(如果我是对的)之前触发这些事件,你可能会更新对象的位置,因此,对触摸目标的检查应适用于您实际看到对象的对象位置。难道你不是真的按下了对象,但在不同的多边形或其他物体上释放,所以点击或点击不会被捕捉到吗?你能试着听一听吗?只需按下并检查释放位置是否没有变化,比如>10px左右
package {
import away3d.containers.ObjectContainer3D;
import away3d.containers.View3D;
import away3d.core.pick.PickingColliderType;
import away3d.core.pick.PickingType;
import away3d.debug.AwayStats;
import away3d.entities.Mesh;
import away3d.events.MouseEvent3D;
import away3d.primitives.SphereGeometry;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Vector3D;

[SWF(frameRate="60")]
public class Main extends Sprite {
    private var _container:ObjectContainer3D;
    private var _view:View3D;
    private var _sphere:Mesh;
    public function Main()
    {
        super();

        addEventListener(Event.ADDED_TO_STAGE, onAdded_toStage);
    }

    private function onAdded_toStage(e:Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, onAdded_toStage);

        stage.align         = StageAlign.TOP_LEFT;
        stage.scaleMode     = StageScaleMode.NO_SCALE;

        stage.addEventListener(Event.RESIZE, onResize_stage);

        init3d();
    }

    private function onResize_stage(e:Event):void {
        _view.width     = stage.stageWidth;
        _view.height    = stage.stageHeight;
    }

    private function onEnter_frame(e:Event):void {
        _container.rotationY += 1;
        _view.render();
    }

    private function onClick_sphere(e:MouseEvent3D):void {
        //reposition the sphere
        var deg:Number          = Math.random() * 360;
        _sphere.x               = 250 * Math.cos(deg);
        _sphere.z               = 250 * Math.sin(deg);
        _sphere.y               = 80 + (Math.random() * 40);
    }

    private function init3d():void {
        //create the 3d-view
        _view               = new View3D();
        _view.width         = stage.stageWidth;
        _view.height        = stage.stageWidth;
        addChild(_view);

        //create a cub
        _view.camera.z = -400;
        _view.camera.y = 75;
        _view.camera.lookAt(new Vector3D(0, 125, 0));

        //create container
        _container = new ObjectContainer3D();
        _view.scene.addChild(_container);

        //create sphere to tap
        _sphere                 = new Mesh(new SphereGeometry(10));
        _sphere.pickingCollider = PickingColliderType.AS3_FIRST_ENCOUNTERED;
        _sphere.y               = 100;
        _sphere.z               = -250;
        _sphere.mouseEnabled = true;
        _sphere.addEventListener(MouseEvent3D.CLICK     , onClick_sphere);
        _container.addChild(_sphere);

        var stats:AwayStats = new AwayStats(_view);
        addChild(stats);

        addEventListener(Event.ENTER_FRAME, onEnter_frame);
    }
}