Ссылка на пример из документации http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/PathModifierExample.java.
Согласитесь, весьма распространенная задача - заставить спрайт двигаться через определенные чекпойнты. Делается это довольно просто, в onCreateScene (а может быть, где-нибудь еще) создается объект Path из пакета org.andengine.entity.modifier.*. В качестве аргумента конструктора указывается количество точек, через которые будет проходить спрайт. Если точек менее двух - вывалится Exception:
final Path path = new Path( route.size()+1 );
Заполняется массив точек:
path.to( mCurrentSprite.getX(), mCurrentSprite.getY() ); // от текущей позиции спрайта
path.to(100,100);
path.to(100,250);
....
Где mCurrentSprite - объект, наследованный от Sprite.
Создаем модификатор типа PathModifier:
В примере из документации эта конструкция оборачивается в LoopEntityModifier(). Если это сделать, спрайт будет возвращаться в точку старта. Я когда в это дело только въезжал, очень долго не мог понять почему мой спрайт на сцене после анимации не меняет своего положения :)
И конечно, вешаем его на наш спрайт:
mCurrentSprite.registerEntityModifier(mEntityModifier);
В-принципе, на этом уже можно поставить точку. Если исполнить данный код, спрайт будет двигаться по заданному маршруту
В методы mEntityModifier можно записать всё, что нам необходимо для анимации спрайта. У меня например спрайт - кораблик поворачивается носом к следующему чекпойнту:Согласитесь, весьма распространенная задача - заставить спрайт двигаться через определенные чекпойнты. Делается это довольно просто, в onCreateScene (а может быть, где-нибудь еще) создается объект Path из пакета org.andengine.entity.modifier.*. В качестве аргумента конструктора указывается количество точек, через которые будет проходить спрайт. Если точек менее двух - вывалится Exception:
final Path path = new Path( route.size()+1 );
Заполняется массив точек:
path.to( mCurrentSprite.getX(), mCurrentSprite.getY() ); // от текущей позиции спрайта
path.to(100,100);
path.to(100,250);
....
Где mCurrentSprite - объект, наследованный от Sprite.
Создаем модификатор типа PathModifier:
mEntityModifier = new PathModifier(SceneGame.DEFAULT_TIME_MOVING_OF_SHIP, path, null, new IPathModifierListener() { @Override public void onPathStarted(PathModifier pPathModifier, IEntity pEntity) { // TODO Auto-generated method stub // код, который должен исполняться при старте маршрута } @Override public void onPathWaypointStarted(PathModifier pPathModifier, IEntity pEntity, int pWaypointIndex) { // TODO Auto-generated method stub // код, который выполняется при старте нового чекпойнта } @Override public void onPathWaypointFinished(PathModifier pPathModifier, IEntity pEntity, int pWaypointIndex) { // TODO Auto-generated method stub // код, который выполняется при финише прохождения чекпойнта } @Override public void onPathFinished(PathModifier pPathModifier, IEntity pEntity) { // TODO Auto-generated method stub // код, который должен исполняться при финише маршрута } });
В примере из документации эта конструкция оборачивается в LoopEntityModifier(). Если это сделать, спрайт будет возвращаться в точку старта. Я когда в это дело только въезжал, очень долго не мог понять почему мой спрайт на сцене после анимации не меняет своего положения :)
И конечно, вешаем его на наш спрайт:
mCurrentSprite.registerEntityModifier(mEntityModifier);
В-принципе, на этом уже можно поставить точку. Если исполнить данный код, спрайт будет двигаться по заданному маршруту
@Override public void onPathWaypointStarted(PathModifier pPathModifier, IEntity pEntity, int pWaypointIndex) { if( pWaypointIndex < mRoute.size()-1 ){ Point point1 = mRoute.get( pWaypointIndex ); Point point2 = mRoute.get( pWaypointIndex+1 ); float angle = (float) getAngleBetweenPoints(point1, point2); mCurrentSprite.setRotation(angle); } } private double getAngleBetweenPoints(Point point1, Point point2){ return Math.toDegrees( Math.atan2(point2.getY() - point1.getY(), point2.getX() - point1.getX()) ); }А в примерах из документации AndEngine он изменяет анимацию:
switch(pWaypointIndex) { case 0: player.animate(new long[]{200, 200, 200}, 6, 8, true); break; case 1: player.animate(new long[]{200, 200, 200}, 3, 5, true); break; case 2: player.animate(new long[]{200, 200, 200}, 0, 2, true); break; case 3: player.animate(new long[]{200, 200, 200}, 9, 11, true); break; }
2 комментария:
Спасибо за статью!
Тяжело, и не очень все понятно, путница какая-то ( Ничего личного. Молодец, что пишешь, все равно.
Отправить комментарий