Le cycle de vie du moteur est très simple, similaire aux standards de jeux.
Étant donné que le LionEngine est une librairie (et non un programme), vous devrez créer vous même la première étape du cycle de vie: le Main
public class MainJava
{
public static void main(String[] args)
{
// Here the program starts
}
}
public class AppAndroid extends Activity
{
@Override
protected void onCreate(Bundle bundle)
{
super.onCreate(bundle);
// Here the program starts
}
}
Rien de nouveau jusqu'ici si vous avez assez de connaissance dans le domaine.
Une fois le point d'entré du langage compris, vous aimeriez certainement découvrir celui du moteur.
Voici l'arborescence complète du cycle de vie:
L'idée principale derrière cela est que le Loader peut être considéré comme un ordonnanceur de Sequence,
où chacune des sections d'un jeu (introduction, menu, niveau...) représente une Sequence. Ainsi,
lorsqu'une Sequence est terminée (fin d'une introduction, ou un niveau de jeu...), l'application
(et également le moteur), n'est pas nécessairement terminé. Vous souhaiteriez par exemple poursuivre sur un autre
niveau, ou simplement enchainer sur le menu après l'introduction.
L'application démarre avec la première Sequence que vous lui donnez, et continue sa vie jusqu'à sa
terminaison (en arrêtant toute activité, ou en démarrant une nouvelle Sequence). Dans tous les cas, c'est
le Loader qui contrôle ces étapes. La seule condition pour arrêter un programme est lorsque le Loader
n'a plus aucune nouvelle Sequence à gérer. Dans ce cas là, le moteur sera clôturé, et l'application
terminera (ainsi que la JVM associée).
L'initialisation du moteur doit être réalisée dans le main. C'est à ce moment là que vous aurez la possibilité
de configurer le moteur selon vos besoins. Vous aurez à définir des éléments requis, tels que le nom du
programme et sa version, le répertoire des ressources, la résolution d'affichage (plus un
filtre optionnel), et enfin la première Sequence à lancer.
Qu'en est-il du code requis ?
EngineAwt.start("Name", Version.create(1, 0, 0), "resources");
Loader.start(Config.windowed(new Resolution(640, 480, 60)), Scene.class);L'initialisation est a peut près la même quelque soit la cible, Java & Android ...
...sauf pour un cas spécial dans le cas d'Android, qui doit être appliqué à la première ligne (this):
EngineAndroid.start("Name", Version.create(1, 0, 0), this); C'est parce que le répertoire des ressources est relatif à l'application Android, et ne peut être défini manuellement (ainsi que pour des raisons de droits d'accès).
Une fois que le moteur a été initialisé et que le Loader a démarré la première Sequence, le
programme tourne alors en roue libre.
Sequence en cours démarre simplement une nouvelle Sequence, et termine à ce moment là. Le
contrôle est donné à la nouvelle Sequence.
Voici un exemple montrant comment lier deux Sequence (où le Menu est la première Sequence):
package com.b3dgs.lionengine.example.core.sequence;
import com.b3dgs.lionengine.Context;
import com.b3dgs.lionengine.Resolution;
import com.b3dgs.lionengine.Verbose;
import com.b3dgs.lionengine.core.Engine;
import com.b3dgs.lionengine.core.sequence.Sequence;
import com.b3dgs.lionengine.graphic.Graphic;
class SequenceFirst extends Sequence
{
private int count;
public SequenceFirst(Context context)
{
super(context, new Resolution(320, 100, 32));
}
@Override
public void load()
{
count = 0;
}
@Override
public void update(double extrp)
{
count++;
if (count > 2)
{
end(SequenceNext.class);
}
}
@Override
public void render(Graphic g)
{
Verbose.info("SequenceFirst rendering number " + count);
}
@Override
public void onTerminated(boolean hasNextSequence)
{
if (!hasNextSequence)
{
Engine.terminate();
}
}
}
|
package com.b3dgs.lionengine.example.core.sequence;
import com.b3dgs.lionengine.Context;
import com.b3dgs.lionengine.Resolution;
import com.b3dgs.lionengine.Verbose;
import com.b3dgs.lionengine.core.Engine;
import com.b3dgs.lionengine.core.sequence.Sequence;
import com.b3dgs.lionengine.graphic.Graphic;
class SequenceNext extends Sequence
{
public SequenceNext(Context context)
{
super(context, new Resolution(320, 100, 32));
}
@Override
public void load()
{
Verbose.info("Next sequence loaded !");
}
@Override
public void update(double extrp)
{
end();
}
@Override
public void render(Graphic g)
{
Verbose.info("I am Next !");
}
@Override
public void onTerminated(boolean hasNextSequence)
{
if (!hasNextSequence)
{
Engine.terminate();
}
}
}
|
package com.b3dgs.lionengine.example.core.sequence;
import com.b3dgs.lionengine.core.awt.EngineAwt;
import com.b3dgs.lionengine.core.sequence.Loader;
public class AppSequence
{
public static void main(String[] args)
{
EngineAwt.start(AppSequence.class.getSimpleName(), Version.create(1, 0, 0), AppSequence.class);
final Resolution output = new Resolution(640, 480, 60);
Loader.start(Config.windowed(output), SequenceFirst.class);
}
}
La SequenceFirst terminera lorsque count > 2, et démarrera la prochaine Sequence
appelée SequenceNext. Quand la SequenceNext est démarrée, le programme s'arrêtera simplement
(comme appelé).
Lire la suite: Outils de base