Создание моего холста с возможностью прокрутки без капитального ремонта - PullRequest
1 голос
/ 18 июня 2011

Я нахожусь в процессе разработки 2-D игры для Android, которую я в основном использую в качестве опыта, чтобы изучить все преимущества программирования для приложений для Android, поэтому, естественно, я сталкиваюсь с множеством головоломок для работы через. В настоящее время моей основной деятельностью является создание пользовательского класса, который расширяет SurfaceView и реализует SurfaceHolder.Callback. Это представление создает поток, который обрабатывает большую часть логики и всю графическую обработку (это включает создание экземпляра холста и рисование на нем и т. Д.

Что ж, будучи новичком, я не думал, что когда начинаю проектировать холст, который будет намного больше экрана и позволит пользователям прокручивать страницу, чтобы увидеть все части холста ... но, увы, вот что мне нужно, чтобы это случилось.

Если есть простой способ сделать это, пожалуйста, дайте мне знать.

Мое лучшее предположение - поместить фактическое создание холста в отдельный класс, который расширяет ScrollView, и каким-то образом просто вызывать все Draw () для этого холста из моего потока. Это возможно? мои события кликов фактически фиксируются из основной активности (просто к сведению).

Ответы [ 4 ]

4 голосов
/ 18 июня 2011

Лучшим вариантом будет использовать камеру для перевода холста. Сделайте что-то вроде этого:

// Creates a new camera object
Camera mCam = new Camera();
float startX;
float startY;

@Override
public void onTouch(MotionEvent event)
{
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        startX = event.getX();
        startY = event.getY();
    }
    else if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        float x = event.getX();
        float y = event.getY();

        // Lets you translate the camera by the difference
        mCam.translate(x -startX, startY - y, 0.f);
        startX = event.getX();
        startY = event.getY();
    }
}

@Override
public void onDraw(Canvas canvas)
{
    // Draw here the objects you want static in the background
    canvas.drawBitmap(mBackground, 0, 0, null);

    canvas.save();
    mCam.applyToCanvas();

    // Draw here the objects you want to move
    canvas.drawBitmap(mBall, 0, 0, null);

    canvas.restore();

    // Draw here the objects you want static on the forebround
    canvas.drawBitmap(mScore, 0, 0, null);
}

Обратите внимание, что вы рисуете mBall на 0,0, но из-за перевода камеры он будет перемещаться на указанную величину. Надеюсь, это поможет. Веселитесь:)

1 голос
/ 18 июня 2011

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

Если кто-то думает об использовании этого метода, есть пара условий, которые сделали его хорошим выбором. Во-первых, все мои объекты - это объекты для рисования с предопределенными местоположениями, использующие метод setBounds (int, int, int, int), все объекты также хранят свои собственные координаты для местоположения для рисования на холсте, и все объекты вызываются в хеш-картах, что позволяет мне вызывать и обрабатывать все существующие объекты.

Теперь я размышлял о том, что сказал Кабуко, и как это бесполезно рисовать огромный холст, и как я сталкиваюсь с проблемами события щелчка, вот когда я придумал это.

когда событие касания экрана происходит у края экрана, вызывается пользовательский метод Scroll (), который проходит по каждому объекту и корректирует сохраненные координаты местоположения объекта в зависимости от того, в каком направлении пользователь пытается прокрутить. после того, как он увеличивает местоположение объектов, он (параллельно) увеличивает пару переменных для смещения x и y. Затем это смещение учитывается в координатах событий касания, поэтому объекты по-прежнему можно выбирать прикосновением независимо от положения, на котором прокручивается экран.

тогда для производительности просто оператор if делает так, чтобы рисование вызывалось только для объекта, если координаты этих объектов попадают в диапазон экрана.

Извините за злорадство, но я действительно удивлен и впечатлен этим, ха-ха. Я действительно только около месяца программирую, и у меня почти есть полностью функциональная 2D-стратегия!

Java для чайников окупилась, лол.

0 голосов
/ 18 июня 2011

Простой трюк с играми с боковой прокруткой - разделить ваш мир на плитки, где каждая плитка имеет определенное количество области.

0 голосов
/ 18 июня 2011

Вы могли бы попробовать свой подход, даже если это не та стратегия, которую я когда-либо использовал бы сам.Я подозреваю, что вы все равно столкнетесь с некоторыми проблемами при таком подходе.Если ваша игра уже использует сенсорный ввод, у вас будут конфликты.Кроме того, если производительность вообще является проблемой (особенно если у вас есть анимация), вы не хотите использовать этот подход.

Если вы занимаетесь многопоточностью, производительность, вероятно, имеет значение.Рисование стоит дорого, и если вы делаете огромный холст, вам придется рендерить все это, и это будет стоить вам.Вы должны рисовать только то, что на экране (более или менее).Извините, но вам, вероятно, понадобится «капитальный ремонт» ...

Тем не менее, справляться с прокруткой не так уж и плохо.У вас, вероятно, есть координаты для всего, что вы рисуете.Все, что вам нужно сделать, это отследить ваши «текущие координаты», а затем перевести ваш чертеж x и y на ваши текущие x и y.Имея дело с производительностью, вы можете многое сделать, но это начинает становиться немного не по теме.Посмотрите эти видео, если хотите узнать больше:

http://www.youtube.com/watch?v=U4Bk5rmIpic

http://www.youtube.com/watch?v=7-62tRHLcHk

...