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

Composants graphiques Android Discussion :

Création d'une carte à base de tuiles


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Création d'une carte à base de tuiles
    Bonjour à tous et à toutes(il y en a peu, mais ça existe )

    Je suis me suis mis récemment au Java et à Android (j'étais sur C# avant), et j'ai pour but de réussir à coder proprement une application affichant une carte (perso) faite de tuiles(256x256).
    En C# je faisais ça avec un Panel et des PictureBox (je sais, c'est pas bien), mais cette fois ci j'aimerai bien directement dessiner dans un Canva... (et si j'y arrive, je transpose le tout su la version C#, ça lui fera du bien)

    J'ai stocké les tuiles dans le dossier drawable, et leur nom est de la forme suivante :
    • x0y0z0, x0z1y0, ..., xNyNzU

    N est un multiple de 256 (0 = 0, 1 = 256, ..., N = N*256) et U est le niveau de zoom (0, 1, etc...)
    Pour ce qui est de la l'algo, j'imagine qui faudrait créer une collection de Bitmap, initialiser la capacité de la collection avec le nombre maximum de tuiles qui peut être affiché à l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nbTuilesX = (int)Math.floor((double)largeurEcran / 256) + 2;
    int nbTuilesY = (int)Math.floor((double)hauteurEcran / 256) + 2;
    int nbTuilesTotal = nbTuilesX * nbTuilesY ;
    Cette collection serait une sorte de SparseArray avec deux clés (abscisse, ordonnée) et pourrait à la volée ajouter et enlever des éléments...
    Lors du déplacement de la carte, il faudrait vérifier que la collection contienne les tuiles appropriées et soit les afficher, soit les charger :
    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
    // On prend les coordonnées des coins haut-gauche et bas-droite de l'écran par rapport à l'origine de la carte
    int coinHautGaucheX = origineEcranX;
    int coinHautGaucheY = origineEcranY;
    int coinBasDroiteX = origineEcranX + largeurEcran;
    int coinBasDroiteY = origineEcranY + hauteurEcran;
     
    /* On calcul les origines(en multiples de 256) de la tuile la plus en haut à gauche
    et la tuile la plus en bas à droite qui doivent être affichées */
    int originePremiereTuileX = (int)Math.floor((double)coinHautGaucheX / 256);
    int originePremiereTuileY = (int)Math.floor((double)coinHautGaucheY / 256);	
    int origineDerniereTuileX = (int)Math.floor((double)coinBasDroiteX / 256);
    int origineDerniereTuileY = (int)Math.floor((double)coinBasDroiteY / 256);
     
    // On trouve les origines de toutes les tuiles à afficher(en multiples de 256)
    for(int x = originePremiereTuileX; x <= origineDerniereTuileX; x++) {
    	for(int y = originePremiereTuileY; y <= origineDerniereTuileY; y++) {
    		// Actions sur la tuile(x,y) dont la position est (x*256, y*256)
    		if(/* Test si la tuile(x,y) existe dans la collection */
    			// Afficher la tuile(x,y)
    		else
    			// Charger nouvelle tuile(x,y)
    	}	
    }
    A partir d'ici je suis un peu perdu...
    Si vous avez la moindre idée ou le moindre conseil, je suis preneur

    J'aimerai vraiment aboutir à un code optimiser pour que la "glisse" soit la plus confortable possible(plus de fps et moins de ms quoi...) ^^

    Des idées ?

  2. #2
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Par défaut
    J'ai regardé vite fait ton code et tes explications et voici ce que je te propose (si j'ai bien compris) :

    Tu crées une HashTable qui contiendra tes tuiles, indexées par leur nom en xNyNzU. Comme ça tu te facilites la condition de ton if et tu te facilites sa récupération.
    Ensuite pour la charger, ben tu crées ton nouveau Bitmap a partir de ton drawable et tu l'insères dans la HashTable.

    En espérant que ça t'aide.

  3. #3
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Par défaut
    Oh je viens de me rendre compte, j'ai oublié de te dire que tu devrais mettre tes images dans le dossiers Assets plutôt que Drawable, ça te permettra de les loader plus facilement (et surtout à partir du nom du fichier).

  4. #4
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Arf...
    Je m'étais basé sur l'article suivant :Astuces #5 : Stop aux HashMaps! (très bon blog sur Android en passant). Mais bon, String étant un objet...

    En tout cas, merci pour l'info, je vais retourner à mes tests

    Ps : Merci pour l'astuce des Assets (je vais faire mes petites recherches là dessus aussi)

  5. #5
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Par défaut
    Ou alors tu peux essayer de développer 2 fonctions, une permettant d'associer a une de tes tuiles xNyNzU un unique entier pour utiliser ensuite un SparseArray, et l'autre pour faire le chemin inverse (si tu en as besoin).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 67
    Par défaut
    Bonjour DamiB,

    Bien que peu en mesure de t'aider, ton sujet m'intéresse ...

    Pourquoi des tuiles ?
    N'est-il pas possible d'avoir une image bitmap qui déborde (largement voire très largement) de l'écran et de n'afficher que la partie centrée sur une position qui nous intéresse ?
    Il faut régler bien sûr le pb de la calibration ....

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/05/2012, 20h11
  2. Réponses: 3
    Dernier message: 22/05/2007, 11h05
  3. création d'une carte au format jpg
    Par TocTocKiéLà? dans le forum C++
    Réponses: 2
    Dernier message: 13/02/2007, 17h28
  4. [SQL] Création d'une nouvelle base
    Par balabonov dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 27/09/2006, 15h14
  5. création d'une carte avec navigation du type mappy
    Par BernardT dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 30/10/2005, 01h24

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