0

シーンに触れている間、スプライトのスケールを大きくするためにシーン更新ハンドラーを実行しています。ユーザーが指を離すと停止するはずですが、私のアクションアップは登録されません。スプライトは、画面が再びタッチされるまでサイズが大きくなり続けます。その時点で、古いスプライトの成長が停止し、新しいスプライトが開始されます。理由はありますか?

scene.registerUpdateHandler(new IUpdateHandler() {

        @Override
        public void reset() {         
        }

        @Override
        public void onUpdate(float pSecondsElapsed) {
            if(fillerNum>-1){
                if(filler[fillerNum].active){
                    mPhysicsWorld.unregisterPhysicsConnector(mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(filler[fillerNum].sprite));
                    mPhysicsWorld.destroyBody(filler[fillerNum].body);

                    filler[fillerNum].sprite.setScale(filler[fillerNum].scale+=pSecondsElapsed*.5);

                    filler[fillerNum].body = PhysicsFactory.createCircleBody(mPhysicsWorld, filler[fillerNum].sprite, BodyType.DynamicBody, FIXTURE_DEF);
                    mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(filler[fillerNum].sprite, filler[fillerNum].body, true, true));
                }
            }               
        }
    });






@Override
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
         if(this.mPhysicsWorld != null) {
                if(pSceneTouchEvent.isActionDown()) {
                    createFiller(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
                    return true;
                }
                if(pSceneTouchEvent.isActionUp()){
//Never executed
                    Log.e("Action UP", Boolean.toString(filler[fillerNum].active));
                    createStationaryFiller();
                }
            }
        return false;
    }
4

4 に答える 4

0

更新ハンドラを登録しています! これは、シーンがエンジンに登録されている限り、この onUpdate メソッドを継続的に呼び出すことを意味します。fillNum が -1 未満になったときにのみ停止します。フィラー番号の動作を確認する必要があります。

于 2012-06-27T20:27:25.977 に答える
0

参照用に使用できますZoomExample。シーンに触れると、カメラはスムーズにズームインします。ズーム部分をコードに置き換えて、スプライトを拡大するだけです。

scene.setOnSceneTouchListener(new IOnSceneTouchListener() {
        @Override
        public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
            switch(pSceneTouchEvent.getAction()) {
                case TouchEvent.ACTION_DOWN:
                    //sprite.setScale() code
                    break;
                case TouchEvent.ACTION_UP:
                    //sprite.setScale() code
                    break;
            }
            return true;
        }
    });
于 2012-06-28T01:13:57.693 に答える
0

多くの人がこの問題に頭を悩ませています!間違いを犯すと、自分を叩くでしょう!方法を確認してくださいonSceneTouchEvent()。最後にあなたreturn false。メソッドの戻り値 false は、TouchListener に、ユーザーによって実行された TouchEvent (アクションダウン) が無効であることを伝えます。したがって、TouchListener は、後続のすべてのイベント (アクションの移動、アクションのアップなど) の登録を停止します。

ifこれが、2 番目のステートメントのコードが実行されない理由です。に変更return falseするreturn trueだけで、次のイベントを登録するように touchlistener に伝えます。

このようなばかげた問題ですが、非常にイライラします。

于 2012-06-28T04:37:12.790 に答える
-1

結局のところ、スプライトを作成するonAreaTouchedメソッドにisActionUpメソッドを追加し、onSceneTouchEventに含める必要がありました。前者がないと、スプライトは別のタッチが追加されるまで成長し続けました。後者がなければ、スプライトから指をドラッグして外しても、それでも成長します。

于 2012-06-28T03:24:51.573 に答える