AS3/AIR Mobile Щелчки и/или касания движущихся объектов

несколько недель назад я задал вопрос о похожей проблеме, но в рамках Starling Framework (Starling TouchEvent on Sprite)

Сейчас я работаю над другим мобильным приложением/игрой с Away3d. Кажется, у меня такая же проблема с прикосновением к движущейся сфере или коробке. Когда сфера не движется, я могу просто коснуться ее точно в ее положении, но когда она вращается, событие щелчка не срабатывает очень точно. это происходит только на мобильных устройствах (проверено на Android 4.2.2: Nexus7/Galaxy S2 и iOS: iPad2/iPad Retina)

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);
    }
}

ПРИМЕЧАНИЕ. Я также пробовал разные частоты кадров, больше событий (Mouse_up, down и т. д.), разные средства выбора.

Поскольку эта проблема также возникает с 2D-движущимися спрайтами (в скворце), я предполагаю, что это может быть связано со Stage3D или AIR, а не со starling/away3d.

У кого-нибудь есть предложения? Может быть, я забыл что-то установить в app.xml?


person Marijn    schedule 14.06.2013    source источник
comment
что значит стреляет не очень точно? щелчок по объектам в 3D обычно выполняется с помощью ray casts, поэтому здесь может быть проблема.   -  person divillysausages    schedule 16.06.2013
comment
Мне нужно щелкнуть перед (в направлении движения объекта) объекта, который я хочу щелкнуть. Кажется, что сенсорное событие обрабатывается до обновления графики. Обновление: forums.adobe.com/message/5410586#5410586 см. ответ Джеффри , может и здесь проблема.   -  person Marijn    schedule 17.06.2013
comment
вроде правильно - у тебя проблемы с фпс, что бы сделать эту проблему более заметной?   -  person divillysausages    schedule 17.06.2013
comment
Нет, я могу работать со стабильными 60 кадрами в секунду на планшете Nexus7.   -  person Marijn    schedule 17.06.2013
comment
События касания запускаются до события ввода кадра (если я прав), когда вы, вероятно, обновляете позицию своего объекта, поэтому проверка цели касания должна применяться к позиции объекта, в которой вы фактически видите объект. Разве это не похоже на то, что вы на самом деле нажимаете на объект, но отпускаете снаружи или на другом полигоне или что-то в этом роде, поэтому касание или щелчок не фиксируются? Можете ли вы попробовать послушать просто нажатие и проверить, не изменилось ли положение отпускания примерно на 10 пикселей или около того?   -  person kosmo    schedule 25.08.2013


Ответы (1)


Обе структуры должны иметь дело с системой без событий (Stage3D). Stage3D не перехватывает и не получает никаких событий и, конечно же, не касается событий касания или мыши. Таким образом, обе платформы имитируют эти события с помощью внутренней системы, которая улавливает события на этапе и пытается воспроизвести точную оценку. Я лично нахожу эти системы слишком дорогими для ЦП и недостаточно точными, поэтому мой совет - поступить, как я, создать свою собственную систему. Просто поймайте событие на сцене и решите, к какому из отображаемых объектов (в Stage3D, используя их положение) было приложено прикосновение. Я лично получаю от этого прирост производительности (особенно со скворцом) и гораздо большую точность.

person BotMaster    schedule 26.06.2014