【问题标题】:Score increases randomly onActionMove分数随机增加 onActionMove
【发布时间】:2013-06-03 12:08:38
【问题描述】:

当我用手指触摸精灵时,分数随机增加而不是固定率我的意思是我设置了分数 每次增加 50,但是当我在精灵上滚动时,有时会增加 100,有时会增加 150 和 200;

       mHardware1[active] = new Sprite(pX, pY, samsung,
                this.getVertexBufferObjectManager()) {
            @Override
            public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                    float X, float Y) {
                if (pSceneTouchEvent.isActionMove()) {
                    scene.detachChild(mHardware1[active]);
                    score+50;

}

当我使用 isActionDown 代替 isActionMove 时它可以工作,但是我在玩水果忍者之类的游戏,我需要在屏幕上滚动手指,这就是为什么我不能使用 isActionDown

【问题讨论】:

  • 也许你的触摸不是“不间断的移动”,所以你的应用程序注意到几个短的动作,而你认为​​它只是一个长的动作
  • 是的,我知道这是问题,但有什么解决方案
  • 我认为 threadupdatehandler 可以解决这个问题,但请给我任何解决方案 stackoverflow 团队

标签: java android andengine sprite


【解决方案1】:

您可以使用 SurfaceScrollDetector,它会检测用户何时在屏幕上滑动手指。它有以下关联的事件:

  • onScrollStarted
  • onScroll
  • onScrollFinished

我猜当你到达 onScrollFinished 时你可以增加 50。 我目前正在将 SurfaceScrollDetector 用于一个项目,但我没有以您询问的方式使用它,所以我不能确定它是否会按预期工作。

这是使用它的示例之一(除了 PinchZoomDetector): https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/PinchZoomExample.java

【讨论】:

  • 这里的问题是我不想增加分数 onscroll 完成但是当我滚动精灵时分数应该增加
  • 如果你与精灵相交,你不能只检查onScroll并设置一个标志......然后onScrollFinished,如果设置了标志,你可以将你的分数提高50?
【解决方案2】:

场景更新发生在与 UI 事件不同的线程上,因此在事件处理程序意识到精灵已分离之前,可能会有多个排队的触摸屏事件通过。

设置一个局部布尔变量来防止这种情况,例如:

boolean touchProcessed = false;
mHardware1[active] = new Sprite(pX, pY, samsung,
            this.getVertexBufferObjectManager());

@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
        float X, float Y) {
    if (!touchProcessed & pSceneTouchEvent.isActionMove()) {
        touchProcessed = true;
        scene.detachChild(mHardware1[active]);
        score += 50;
    }
}

请注意,您可以使用:mHardware1[active].detachSelf() 而不是 scene.detachChild(...)

还请注意,您应该在更新线程中分离精灵,因此:

boolean touchProcessed = false;
mHardware1[active] = new Sprite(pX, pY, samsung,
            this.getVertexBufferObjectManager());

@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
        float X, float Y) {
    if (!touchProcessed & pSceneTouchEvent.isActionMove()) {
        touchProcessed = true;
        score += 50;
        engine.runOnUpdateThread(new Runnable() {
             @Override
             public void run() {
                 mHardware1[active].detachSelf();
             }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2015-12-29
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多