Quiero cambiar mi fondo oscuro y deprimente a un fondo de hierba feliz , en tiempo real, de modo que el fondo feliz se muestre en un radio alrededor de un personaje del juego.
Un campo de fuerza de la felicidad , por así decirlo .
¿Cómo se puede hacer esto con el mayor rendimiento posible cuando se procesa en un lienzo en una vista personalizada?
ACTUALIZACIÓN: Así es como funciona en mi cabeza:
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
}
Estoy usando canvas.drawArc()
para hacer un círculo, pero definitivamente me falta algo.
Canvas
hace las cosas un poco diferente al HTML<canvas>
, ¡lo que pensé que querías decir! Edité mi respuesta para explicar cómo funciona el recorte en general, con algunos enlaces específicos de Android y código de ejemplo.Respuestas:
Manifestación
GameDev Meta : Henshin Main !! :RE
El código usa un
canvas
clip
región yrequestAnimationFrame
para obtener la máxima calidad y eficiencia. (Es mejor vivir ).¡Supuse que querías decir HTML
canvas
! Incluso si no lo hizo, otros motores de renderizado (como la canalización de renderizado 2D de Android, que podría haber querido decir) también admiten regiones de clip aceleradas por hardware . El código probablemente se verá similar.Solicitar cuadros de animación con
requestAnimationFrame
(u otra solución proporcionada por la plataforma) da como resultado una animación de mayor calidad al permitir que el motor determine el tiempo de renderizado.Esto funciona sin problemas en una netbook de bajo rango y en mi teléfono Android.
Explicación
Para que esto sea más útil en general, comprendamos realmente recorte .
Digamos que tenemos estos dos rectángulos:
El recorte funciona igual de bien en líneas, puntos, imágenes o cualquier otra cosa que desee renderizar. Solo me quedo con los rectángulos por simplicidad.
No queremos que el rectángulo rojo sea visible aquí (círculo negro) en absoluto.
Entonces podemos indicarle al renderizador que recorte el rectángulo rojo por ese círculo.
En otras palabras, cuando se dibuja el rectángulo rojo, se dibuja en todas partes, excepto donde habría estado ese círculo negro.
Los diferentes renderizadores tienen diferentes formas de especificar por qué región recortar. En JavaScript, con el HTML
<canvas>
, hice esencialmenteAhora, en un Android
Canvas
, querrás hacer algo similar, pero el procesador espera un código ligeramente diferente:La documentación de Android al respecto puede ser útil. Hay buenas preguntas como esta en StackOverflow sobre más cosas que quizás quieras probar con él.
fuente
Implementación de trabajo utilizando el método Ankos:
¡Gracias a Anko por toda la ayuda!
fuente