Я хочу изменить свой темный и удручающий фон на счастливый травяной фон в реальном времени, чтобы счастливый фон отображался в радиусе вокруг игрового персонажа.
ForceField счастья , если вы будете.
Как это можно сделать максимально эффективно при рендеринге на холст в пользовательском представлении?
ОБНОВЛЕНИЕ: Вот как это работает в моей голове:
private int hModeX, hModeY;
private float hModeRadius = 0.1f;
private float hModeStart = 0;
happyModeBg = Bitmap.createScaledBitmap(happyModeBg, getWidth(),getHeight(), true);
hModeX = getWidth()/2;
hModeY = getHeight()/2;
private void initHappyMode(Canvas canvas){
hModeRadius = 75 * thread.getDelta();
if(hModeRadius > 500) {
hModeStart = timestep; //What is timestep?
}
//context.arc(x, y, radius, 0, 2 * Math.PI, false); <- your version
canvas.save();
canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint) // <- my version
//context.clip(); <- dont know what this does or if there is an equivilant
canvas.drawBitmap(happyModeBg, 0, 0, null);
canvas.restore();
//requestAnimationFrame(step); <- dont know what this does since I cant seem to find it for android
}
Я использую, canvas.drawArc()
чтобы сделать круг, но я определенно что-то упускаю.
Canvas
работает немного иначе, чем HTML<canvas>
, который, как я думал, вы имели в виду! Я отредактировал свой ответ, чтобы объяснить, как работает отсечение в целом, с некоторыми ссылками для Android и примером кода.Ответы:
демонстрация
GameDev Meta : Henshin Main !! : D
Код использует
canvas
clip
регион иrequestAnimationFrame
для максимального качества и эффективности. (Лучше жить .)Я предположил, что вы имели в виду HTML
canvas
! Даже если вы этого не сделали, другие движки рендеринга (например, 2D-конвейер рендеринга Android, который вы могли бы иметь в виду) также поддерживают области клипа с аппаратным ускорением . Код, скорее всего, будет выглядеть аналогично.Запрос кадров анимации с помощью
requestAnimationFrame
(или решения, предоставленного другой платформой) приводит к повышению качества анимации, позволяя движку определять время рендеринга.Это плавно воспроизводится на нетбуке с низкой дальностью и на моем телефоне Android.
объяснение
Чтобы сделать это более полезным, давайте разберемся с ограничениями .
Допустим, у нас есть эти два прямоугольника:
Обрезка работает так же хорошо на линиях, точках, изображениях или чем-либо еще, что вы можете визуализировать. Я просто придерживаюсь прямоугольников для простоты.
Мы не хотим, чтобы красный прямоугольник был здесь виден (черный круг) вообще.
Таким образом, мы можем дать рендереру команду обрезать красный прямоугольник этим кругом.
Другими словами, когда рисуется красный прямоугольник, он рисуется везде, кроме того места, где был бы этот черный круг.
Разные рендереры по-разному определяют регион, который нужно обрезать. В JavaScript, с HTML
<canvas>
, я сделал по существуТеперь в Android
Canvas
вы захотите сделать то же самое, но средство визуализации ожидает немного другой код:Документация Android по этому вопросу может быть полезной. В StackOverflow есть такие хорошие вопросы, как этот, о том, что вы можете попробовать с ним.
источник
Рабочая реализация с использованием метода Анкос:
Спасибо Анко за помощь!
источник