添加动态路径到精灵

时间:2013-03-18 12:52:55

标签: android andengine

我必须沿着onTouch绘制的路径移动精灵。因为我正在使用Path和PathModifier

case MotionEvent.ACTION_UP:

        int historySize = pSceneTouchEvent.getMotionEvent().getHistorySize();
        pointX = new float[historySize];
        pointY = new float[historySize];

        for (int i = 1; i < historySize; i++) {

            pointX[i] = pSceneTouchEvent.getMotionEvent().getHistoricalX(i);
            pointY[i] = pSceneTouchEvent.getMotionEvent().getHistoricalY(i);

        }
        path = new path(pointX,pointY);
        PathModifier pathModifier = new PathModifier(2.5f, path);
        pathModifier.setRemoveWhenFinished(true);
        sprite1.clearEntityModifiers();
        sprite1.registerEntityModifier(pathModifier);

        break; 

它给我的错误,因为路径需要至少2个方向点。 知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

通常这不应该发生,因为运动事件通常不仅仅是一个坐标。也许你应该测试historySize是否真的大于2.另外你可以添加精灵起始坐标,否则精灵会“跳”到第一个触点(但这不是你的问题)。

这实际上并没有什么不同 - 只是另一种可能性:

path= new Path(historySize);
for (int i = 0; i < historySize; i++) {
      float x = pSceneTouchEvent.getMotionEvent().getHistoricalX(i);
      float y = pSceneTouchEvent.getMotionEvent().getHistoricalY(i);
      path.to(x,y);
}

此外,我注意到您使用int i=1启动了for循环,因此如果historySize为2,则循环只会迭代一次!

修改

我找不到问题,但我找到了解决方案:
不要使用motionEvent history,而是在toucheEvent出现时随时保存touchEvent的坐标:

ArrayList<Float> xCoordinates; // this is where you store all x coordinates of the touchEvents
ArrayList<Float> yCoordinates; // and here will be the y coordinates.

onSceneTouchEvent(TouchEvent sceneTouchEvent){
    switch(sceneTouchEvent.getAction()){
        case (TouchEvent.ACTION_DOWN):{  
            // init the list every time a new touchDown is registered
            xCoordinates = new ArrayList<Float>();   
            yCoordinates = new ArrayList<Float>();               
            break;
        }
        case (TouchEvent.ACTION_MOVE): {
            // while moving, store all touch points in the lists
            xCoordinates.add(sceneTouchEvent.getX());  
            yCoordinates.add(sceneTouchEvent.getY());
            break;
        }
        case (TouchEvent.ACTION_UP): {
            // when the event is finished, create the path and make the sprite move
            // instead of the history size use the size of your own lists

            Path path = new Path(xCoordinates.size());  
            for (int i = 0; i < xCoordinates.size(); i++) {
                path.to(xCoordinates.get(i), yCoordinates.get(i));  // add the coordinates to the path one by one
            }

            // do the rest and make the sprite move
            PathModifier pathModifier = new PathModifier(2.5f, path);
            pathModifier.setAutoUnregisterWhenFinished(true);
            sprite1.clearEntityModifiers();
            sprite1.registerEntityModifier(pathModifier);
            break;
        }
    }

我在手机上测试了这个(它没有在调试模式下运行),它运行正常。但是为了确保不会抛出异常,你应该总是测试xCoordinates列表是否大于1.尽管它很可能是。

嗯,我希望它至少可以帮助解决原始问题。我注意到一些方法的命名方式不同(例如setAutoUnregisterWhenFinished(true);)我猜你使用AndEngine GLES1 ?我使用 GLES2 ,所以当一个方法在我的代码中有另一个名字时,不要担心,只需在 GLES1 中查找等效项(我没有重命名它们,因为,代码按原样运行)

  • 克里斯托弗