Je veux changer mon arrière-plan sombre et déprimant en un arrière - plan herbeux joyeux , en temps réel, de sorte que l'arrière-plan joyeux soit affiché dans un rayon autour d'un personnage de jeu.
Un champ de force de bonheur , si vous voulez.
Comment cela peut-il être réalisé de manière aussi performante que possible lors du rendu sur un canevas dans une vue personnalisée?
MISE À JOUR: Voici comment cela fonctionne dans ma tête:
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
}
J'utilise canvas.drawArc()
pour faire un cercle, mais il me manque définitivement quelque chose.
Canvas
fait les choses un peu différemment du HTML<canvas>
, ce que je pensais que vous vouliez dire! J'ai édité ma réponse pour expliquer le fonctionnement de l'écrêtage en général, avec des liens spécifiques à Android et un exemple de code.Réponses:
Démo
GameDev Meta : Henshin Main !!:RÉ
Le code utilise une
canvas
clip
région etrequestAnimationFrame
pour une qualité et une efficacité maximales. (C'est mieux vivre .)Je suppose que vous vouliez dire HTML
canvas
! Même si vous ne l'avez pas fait, d'autres moteurs de rendu (comme le pipeline de rendu 2D d'Android, que vous auriez peut-être voulu dire) prennent également en charge les régions de clip accélérées par le matériel . Le code sera probablement similaire.Demande d'images d'animation avec
requestAnimationFrame
(ou la solution fournie par une autre plate-forme) entraîne une animation de meilleure qualité en laissant le moteur déterminer la synchronisation du rendu.Cela se fait en douceur sur un netbook bas de gamme et sur mon téléphone Android.
Explication
Pour rendre cela plus généralement utile, comprenons vraiment l' écrêtage .
Disons que nous avons ces deux rectangles:
L'écrêtage fonctionne aussi bien sur les lignes, les points, les images ou tout ce que vous souhaitez rendre. Je m'en tiens aux rectangles pour plus de simplicité.
Nous ne voulons pas du tout que le rectangle rouge soit visible ici (cercle noir).
Nous pouvons donc demander au moteur de rendu de couper le rectangle rouge par ce cercle.
En d'autres termes, lorsque le rectangle rouge est dessiné, il est dessiné partout sauf là où aurait été ce cercle noir.
Les différents rendus ont différentes manières de spécifier la région à découper. En JavaScript, avec le HTML
<canvas>
, j'ai fait essentiellementMaintenant, dans un Android
Canvas
, vous voudrez faire la même chose, mais le moteur de rendu attend un code légèrement différent:La documentation Android à ce sujet pourrait être utile. Il y a de bonnes questions comme celle-ci sur StackOverflow sur plus de choses que vous voudrez peut-être essayer avec.
la source
Implémentation fonctionnelle à l'aide de la méthode Ankos:
Merci à Anko pour toute son aide!
la source