Bonjour à tous !
Pour répondre à lynn et à SamSufy, il est possible d'obtenir la cinématique inverse, ou même une animation totalement différente.
Comme exemple, voici mon fichier "space-sunrise.script" :
win_width = Window.GetWidth();
win_height = Window.GetHeight();
ww_half = win_width / 2;
wh_half = win_height / 2;
offset = 0; //win_height / -4;
sourceImage = Image ("space_glow.png");
size_ratio = sourceImage.GetWidth() / win_width; // used later! todo: this is ugly
new_height = sourceImage.GetHeight() / size_ratio;
nh_half = new_height / 2;
scaledImage = sourceImage.Scale (win_width, new_height);
spaceGlow.sprite = Sprite (scaledImage);
spaceGlow.sprite.SetY (wh_half - nh_half + offset);
spaceGlow.sprite.SetOpacity (0);
sourceImage = Image ("sun_glow.png");
new_height = sourceImage.GetHeight() / size_ratio;
scaledImage = sourceImage.Scale (new_height, new_height); // todo: what if its not square ?
sunGlow.height = new_height;
sunGlow.sprite = Sprite (scaledImage);
sunGlow.sprite.SetX (ww_half - (new_height / 2));
sunGlow.sprite.SetY (wh_half + offset);
sunGlow.sprite.SetOpacity (0);
sourceImage = Image ("planet_black.png");
new_height = sourceImage.GetHeight() / size_ratio;
scaledImage = sourceImage.Scale (win_width, new_height);
planetBlack.sprite = Sprite (scaledImage);
planetBlack.sprite.SetY (wh_half + offset);
planetBlack.sprite.SetOpacity (1);
sourceImage = Image ("planet_glow.png");
new_height = sourceImage.GetHeight() / size_ratio;
scaledImage = sourceImage.Scale (win_width, new_height);
planetGlow.sprite = Sprite (scaledImage);
planetGlow.sprite.SetY ((wh_half + offset) - 2);
planetGlow.sprite.SetOpacity (0);
distroLogo.image = Image ("distro_logo.png");
distroLogo.width = distroLogo.image.GetWidth() / size_ratio;
distroLogo.height = distroLogo.image.GetHeight() / size_ratio;
distroLogo.image = distroLogo.image.Scale (distroLogo.width, distroLogo.height);
distroLogo.x = ww_half - (distroLogo.width / 2);
distroLogo.y = (wh_half / 2) - (distroLogo.height / 2);
distroLogo.sprite = Sprite (distroLogo.image);
distroLogo.sprite.SetX (distroLogo.x);
distroLogo.sprite.SetY (distroLogo.y);
distroLogo.sprite.SetOpacity (0);
distroName.image = Image ("distro_name.png");
distroName.width = distroName.image.GetWidth() / size_ratio;
distroName.height = distroName.image.GetHeight() / size_ratio;
distroName.image = distroName.image.Scale (distroName.width, distroName.height);
distroName.x = ww_half - (distroName.width / 2);
distroName.y = win_height - (distroName.height * 2);
distroName.sprite = Sprite (distroName.image);
distroName.sprite.SetX (distroName.x);
distroName.sprite.SetY (distroName.y);
distroName.sprite.SetOpacity (0);
spaceGlow.start = 0;
spaceGlow.end = 0.5;
sunGlow.start = 0.2;
sunGlow.end = 0.4;
sunGlow.animStart = 0.2;
sunGlow.animEnd = 0.6;
sunGlow.startPos = (wh_half - (sunGlow.height / 4)) + offset;
sunGlow.endPos = (wh_half / 2) - (sunGlow.height / 2);
planetGlow.start = 0.2;
planetGlow.end = 0.6;
distroLogo.start = 0.2;
distroLogo.end = 1;
distroName.start = 0.8;
distroName.end = 1;
t = 1;
q = 0;
fun remap (val, imin, imax, omin, omax) {
return (((val - imin) / (imax - imin)) * (omax - omin)) + omin;
}
fun progress_callback_b (d, p) {
if (p >= spaceGlow.start && p <= spaceGlow.end) {
p = (p * 100.0) / 15.0;
a = remap (p, spaceGlow.start, spaceGlow.end, 0, 1);
spaceGlow.sprite.SetOpacity (a);
}
if (p > spaceGlow.end) {
spaceGlow.sprite.SetOpacity (1);
}
if (p >= sunGlow.start && p <= sunGlow.end) {
a = remap (p, sunGlow.start, sunGlow.end, 0, 1);
sunGlow.sprite.SetOpacity (a);
}
if (p >= sunGlow.animStart && p <= sunGlow.animEnd) {
a = remap (p, sunGlow.animStart, sunGlow.animEnd, 0, 1);
b = sunGlow.startPos - ((sunGlow.startPos - sunGlow.endPos) * a);
sunGlow.sprite.SetY (b);
}
if (p >= planetGlow.start && p <= planetGlow.end) {
a = remap (p, planetGlow.start, planetGlow.end, 0, 1);
planetGlow.sprite.SetOpacity (a);
}
if (p >= distroLogo.start) {
distroLogo.sprite.SetImage (distroLogo.image.Rotate(t));
t = t + 0.04;
}
if (p >= distroLogo.start && p <= distroLogo.end) {
a = remap (p, 0.6, 1, 0, 1);
distroLogo.sprite.SetOpacity (a);
}
if (p >= distroName.start && p <= distroName.end) {
a = remap (p, distroName.start, distroName.end, 0, 1);
distroName.sprite.SetOpacity (a);
}
}
fun progress_callback_s (d, p) {
distroLogo.sprite.SetImage (distroLogo.image.Rotate(t));
t = t - 0.04;
q = q + 0.03;
if (q >= distroName.start) {
a = remap (q, distroName.start, distroName.end, 1, 0);
distroName.sprite.SetOpacity (a);
}
if (q >= 0.8) {
a = remap (q, 0.8, 0.9, 1, 0);
distroLogo.sprite.SetOpacity (a);
}
if (q >= 0.8 && q <= 1.2) {
a = remap (q, sunGlow.animStart, sunGlow.animEnd, 1, 0);
b = sunGlow.endPos - ((sunGlow.startPos - sunGlow.endPos) * a);
sunGlow.sprite.SetY (b);
}
if (q >= 0.8 && q <= 2) {
a = remap (q, 0.8, 2, 1, 0);
planetGlow.sprite.SetOpacity (a);
}
if (q >= 1.5 && q <= 2) {
a = remap (q, 1.5, 2, 1, 0);
spaceGlow.sprite.SetOpacity (a);
}
}
if (Plymouth.GetMode () == "shutdown"){
spaceGlow.sprite.SetOpacity (1);
sunGlow.sprite.SetOpacity (1);
sunGlow.sprite.SetY (sunGlow.endPos);
planetGlow.sprite.SetOpacity (1);
distroLogo.sprite.SetOpacity (1);
distroName.sprite.SetOpacity (1);
Plymouth.SetBootProgressFunction(progress_callback_s);
}
else{
Plymouth.SetBootProgressFunction(progress_callback_b);
}
La fonction "Plymouth.GetMode ()" permet d'obtenir le mode de Plymouth ("boot", "shutdown", "suspend" ou "resume"). Il suffit donc de tester le résultat de cette fonction et le tour est joué.
@ke20,
As-tu bien fait les étapes III et IV du tuto ?