2

数週間前、私は同様の問題について質問しましたが、Starling Framework ( Sprite の Starling TouchEvent )内で

現在、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 など)、さまざまなピッカーも試しました。

この問題は (starling の) 2D 移動スプライトでも発生するため、starling/away3d ではなく、Stage3D または AIR 関連である可能性があります。

誰にもいくつか提案がありますか?たぶん、app.xml に何かを設定するのを忘れていますか?

4

1 に答える 1

0

どちらのフレームワークも、イベントレス システム (Stage3D) を処理する必要があります。Stage3D はイベントをキャッチしたり受信したりせず、タッチ イベントやマウス イベントも確実に受け取りません。そのため、どちらのフレームワークも、ステージ上のイベントをキャッチして正確な推定を再現しようとする内部システムを使用して、これらのイベントをシミュレートします。個人的には、これらのシステムは CPU が高すぎて正確さが足りないと感じているので、私のように独自のシステムを作成することをお勧めします。ステージ上のイベントをキャッチし、表示されているオブジェクト (Stage3D 上での位置を使用) のどれがタッチされたかを判断するだけです。個人的には、(特にスターリングの場合) パフォーマンスが向上し、精度が大幅に向上します。

于 2014-06-26T17:56:49.967 に答える