我必须沿着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个方向点。 知道为什么会这样吗?
答案 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 中查找等效项(我没有重命名它们,因为,代码按原样运行)