Скорость прокрутки Диспаритность Android 2D Графика - PullRequest
2 голосов
/ 29 июня 2011

Я экспериментирую с 2D-графикой в ​​Android в свободное время, и меня заинтриговала идея создания «песочницы» на основе спрайтов для игры.Я посмотрел онлайн и нашел несколько хороших учебников, но я застрял с довольно простой проблемой: мой спрайт движется быстрее, чем местность, и «скользит» по ней.Кроме того, он медленно опережает прокрутку ландшафта и перемещается к краю обзора.

У меня есть анимированный спрайт, который я хочу перемещать по всему миру.Я делаю это, изменяя его абсолютные координаты (устанавливая положение X и Y в функции 'update ()' и применяя скалярное множитель для ускорения или замедления скорости, с которой он движется.

this.setXPos(currX + (speed * dx2));
this.setYPos(currY + (speed * dy2));

Под этим спрайтом я рисую «ландшафт» из растрового изображения. Я хочу продолжать перемещать этот спрайт через координаторы координат выше, но также перемещать мой вид и прокручивать ландшафт так, чтобы спрайт оставался в том же относительном положении экранано движется по «миру». У меня есть несовершенная реализация, где player - мой спрайт, а field - моя местность:

@Override
protected void onDraw(Canvas canvas)
{
     player.updateLocation(GameValues.speedScale);
     field.update(new Point(player.getXPos(), player.getYPos()));

     field.draw(canvas);
     player.draw(canvas);
     //more stuff here...
}

И field.update() выглядит как ( Предупреждение: сложноезакодированность ):

public void update(Point pt)
{

    sourceRect.left = pt.x - 240;
    sourceRect.right = pt.x + 240;

    sourceRect.top = pt.y - 400;
    sourceRect.bottom = pt.y + 400;
}

Мысль о том, что в конечном итоге я просто получу размеры экрана и сделаю его менее «хакерским», но соберет что-то вместе быстро, легко может бытьмоя проблема исходит от. Немедленный интерес field.draw():

@Override
public void draw(Canvas canvas)
{
   try
   {
      canvas.drawBitmap(fieldSheet, sourceRect, destRect, null);
   }
   catch(Exception e)
   {
      //Handle Exception...
   }
}

Вы заметите, что я использую перегрузку drawBitmap(), которая принимает источник и адресination Rect и метод field.update() перемещает этот sourceRect в соответствии с движением спрайта.Как я могу держать «камеру» (так сказать) в центре спрайта и соответствующим образом прокручивать местность?Я думал, что перемещение только sourceRect и поддержание постоянного destRect сделает это, но теперь я думаю, что мне нужно перемещать destRect по «миру» с помощью спрайта, сохраняя при этом те же измерения.

Есть ли лучший (читай функциональный ) способ сделать эту работу?Я прихожу сюда несколько постыдно, так как думаю, что это должно быть несколько проще, чем мне кажется.Любая помощь или предложения приветствуются.Спасибо!

* Редактировать: * Имеет ли смысл также перемещать пункт назначения Rect с той же скоростью, что и спрайт?Я думаю, что я соединил источник и пункт назначения Rect и оставил destRect неподвижным.Я обновлю результаты после того, как получу шанс попробовать (возможно, во время обеда).

* Edit_2: * Изменение прямоугольника назначения не привело меня туда, но использованиеметод View.scrollBy(x, y) приближает меня к полностью удовлетворенному.Оставшийся вопрос, который нужно решить, - как «обрезать» прокрутку View до прямоугольника, представляющего «поле».Я полагаю, что функции View.getLeft() и View.getTop(), смещенные на ширину и высоту экрана, можно использовать для указания Rect, который можно виртуально перемещать в пределах ограничений "мира" и блокировать дальнейшие отклонения отаргументировал метод View.scrollBy().Причина, по которой я обращаю внимание на этот подход, заключается в том, что View, кажется, не позиционируется в абсолютном пространстве, и вызов View.getLeft(), даже после View.scrollBy(x, y), где x> 0, возвращает 0.

...