IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Charger toutes les ressources avant de lancer son programme


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Charger toutes les ressources avant de lancer son programme
    Bonjour à tous,

    Je suis en train de programmer un petit jeu avec un ami depuis 1 mois . Nous nous demandons comment faire pour charger toutes les images et sons dont nous avons besoin tout au long de notre jeu afin que java n'ait pas à les recharger en plein milieu du jeu ( Le jeu a alors un léger lag pour le chargement des sons par exemple ! ) . On voudrait que tout se charge en début de programme ( un écran de Loading en quelque sorte je pense )

    Avez vous une solution à cela ? Merci !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il suffit que tu fasses une classe qui contient toutes tes ressources, avec des accesseurs pour les récupérer. Par exemple, tu peux utiliser des enum pour les identifier, et utiliser des maps pour les stocker.

    Exemple de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public class Ressources {
     
        public enum Sprite {
             SPRITE_DE_CECI,
             SPRITE_DE_CELA,
             ...
        }
     
        public enum Son {
             SON_DE_CECI,
             SON_DE_CELA,
             ...
        }
     
        private Map<Sprite, Image> mapSprite = new HashMap<>; // Image ou buffered image
        private Map<Son, XXX> mapSons = new HashMap<>; // XXX la classe que vous utilisez pour le son (Player, Clip... que sais-je)
     
        public Ressources() {
        }
     
        public Image getSprite(Sprite imageId) {
            return mapSprite.get(imageId);
        }
     
        public XXX getSon(Son sonId) {
            return mapSons.get(sonId);
        }
     
        public void charger() {
             mapImages.put(Image.SPRITE_DE_CECI, ImageIO.load( nomDuFichierDeImageDeCeci ); // je mets pas le détail de l'accès au fichier (à priori il devrait y avoir du getResourceAsStream..., et de l'IOException à catcher)
             mapImages.put(Image.SPRITE_DE_CELA, ImageIO.load( nomDuFichierDeImageDeCela );
             ...
        }
     
    }
    La méthode loadResources pourrait avoir un argument de type JProgressBar si tu veux afficher la progression (ou mieux, mais un petit peu moins simple, utiliser un système évènementiel).

    Ensuite dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class LancementDuJeu {
     
        public static void main(String[] args) {
     
             Ressources ressources = new Resources();
     
             ressources.load();
     
             Jeu jeu = new Jeu(ressources);
     
             jeu.demarrer();
     
        }
     
    }
    Ensuite, il y a des variantes :
    • par exemple, tu pourrais avoir, pour un sprite, plusieurs positions (animations), et donc avoir une méthode getSprite(Sprite spriteId, int position) , avoir plusieurs façons de le résoudre (par exemple, une Map<Sprite, Image[]>);
    • gérer tes sprites par image map (une seule image, et chaque sprite et une sous partie de l'image (la map stockerait des java.awt.Rectangle pour déterminer la partie de l'image qui correspond au sprite);


    Tu peux également te passer des maps, en intégrant directement les images dans les variables de l'énumération (le nom du fichier est passé en argument du constructeur de l'enum, et on ajoute une méthode getImage(), mais ce ne sera pas possible de gérer une progression du chargement. Une méthode hybride est possible, en utilisant des maps statiques. Au lieu de faire resource.getSprite(Sprite.SPRITE_DE_CELA), tu ferais Sprite.SPRITE_DE_CELA.getImage().

    Une variante pour gérer les noms des fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    ...
         public enum Sprite {
             SPRITE_DE_CECI("fichier1.png"),
             SPRITE_DE_CELA("fichier2.png"),
             ...;
             private final String fichier;
             Sprite(String fichier) {
                 this.fichier=fichier;
             }
             String getFichier() {
                  return fichier;
             }
        }
     
       ...
     
       public void charger() {
     
     
            for(Sprite sprite : Sprite.values()) {
     
               mapSprite.put(sprite, ImageIO.load(DIRECTORY_IMAGES + sprite.getFicher()); 
     
            }
     
       }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    La solution proposé par joel.drigo fonctionne parfaitement.
    Il faut juste faire attention à l’empreinte mémoire et ne pas charger trop de chose. Même si aujourd'hui la problématique de manque RAM aussi important qu'avant.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour cette réponse très détaillée et rapide !
    Je vais tester ça ce soir et je te tiens au courant.

    Encore Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger toutes les images d'un repertoire
    Par Topeur dans le forum Bibliothèque standard
    Réponses: 7
    Dernier message: 12/03/2008, 14h00
  2. MySQL 5 sur Windows me bouffe toutes les ressources du processeur
    Par maty2006 dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 13/04/2007, 13h03
  3. comment charger toutes les tables dans DataSet
    Par keletigui dans le forum Accès aux données
    Réponses: 1
    Dernier message: 21/02/2007, 20h44
  4. charger toutes les ressources du site avant affichage
    Par avogadro dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/12/2006, 08h41
  5. [TOMCAT][MEMOIRE] utilisation de toutes les ressources
    Par fabszn dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 19/12/2005, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo