Я экспериментирую с 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.