androidDebutant Posté(e) 25 juin 2010 Share Posté(e) 25 juin 2010 Bonjour à tous, Je suis débutant en programmation sous Android, et je me suis lancé dans la programmation d'un jeu du type "worms" en 2D. J'en suis à la partie où je souhaite tirer des missiles. Et c'est là que je me demande comment faire. Pour essayer de résumer ce que je fais actuellement. J'ai une classe qui extends View et définit la méthode onDraw(). Dans cette méthode je dessine: 1) le background 2) le décor (avec transparence) 3) le vers Ces éléments sont dessinés avec canvas.DrawBitmap(...) Voici ce que je souhaite faire: En fonction d'un angle (une variable) le missile va monter plus ou moins haut et faire une parabole. Je souhaiterais que ce missile soit une image et qu'il suive une trajectoire en s'inclinant (imaginez vous un missile tiré vers le haut avec un angle à 45°) Seulement je ne sais pas comment faire. J'ai entendu parlé de Sprites mais il faut utiliser un moteur 2D en surcouche et je préfère rester avec les fonctions de base de l'API Android. Je me demande donc si je dois faire une boucle qui tourne tant que le missile est à l'écran et n'a pas touché le décor (et qui modifierait à chaque tour le x et le y du missile) et demande de rafraichir avec onDraw(). Si je fais ça cela signifie qu'à chaque déplacement d'un pixel pour le missile je redessine toutes les Bitmaps (background+land+perso). D'un point de vue performances je pense que c'est très mauvais. Du coup je me demandais comment je pouvais redessiner que le missile lui-même, c'est à dire afficher le missile, le supprimer, l'afficher à la position suivante, etc... sans tout redessiner. Mon problème est que si je ne redessine pas tout, le missile va persister à chaque position. Je me demande également comment incliner mon missile (je vois la méthode rotate() sur l'objet canvas, mais c'est tout). Merci à vous :) Aurélien EDIT: Par ailleurs je viens de lire un tuto sur le net qui indique les "bonnes manières" pour programmer un jeu sous Android. La personne indique que pour obtenir de bonnes performances elle a dessiné une seule fois et à l'initialisation le background et ensuite rafraichit uniquement les parties qui bougeaient. J'ai essayé de faire ça avec un boolean, mais il se trouve qu'en faisant ça je me retrouve avec un fond noir, c'est à dire que mon background a été écrasé. Quelqu'un sait il comment faire pour mettre à jour seulement l'image qui doit bouger? Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kuiplo Posté(e) 25 juin 2010 Share Posté(e) 25 juin 2010 Bonjour, Il y a un exemple dans le SDK (LunarLander) qui répondras probablement à l'ensemble de tes questions :) C'est un jeu 2D utilisant les canvas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
androidDebutant Posté(e) 26 juin 2010 Auteur Share Posté(e) 26 juin 2010 Bonjour, J'ai lu complètement le code de LunarLander (je n'ai pas tout compris mais j'ai saisi les concepts et idées de base), et je m'en sert désormais comme base pour mon jeu. Seulement cela ne répond pas complètement à ma question. Dans cet exemple toute la scène est redessinée dans la méthode doDraw(). Dans mon cas lors d'un tir de missile, je dois faire evoluer le missile dans le "ciel". Mais je voudrais redessiner uniquement le missile (sur sa trajectoire). Et je ne sais pas si c'est possible, et il ne font pas comme cela dans le code de LunarLander. Si quelqu'un a déjà eu l'occasion de faire un jeu avec l'API Android, je suis preneur. Merci :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Stilgardt Posté(e) 29 juin 2010 Share Posté(e) 29 juin 2010 Salut, Je pense que quand l'écran est rafraichi, tout doit être redessiné. Donc tu es obligé de passer par la méthode OnDraw et d'afficher tous les sprites/éléments du décor nécessaire. D'ailleurs, as-tu un réel intérêt à ne vouloir afficher que la modification de position de ton missile? (redessiner tout l'écran est rapide) Si c'est pour des opitimisations de temps d'affichage, cherche plutôt à réduire les temps de calcul d'affichage ou de positionnement (tu peux faire avancer ton objet par pas de 2-3 pixels au lieu de 1 si tu veux le faire aller plus vite par exemple). Bon courage en tout cas (et bon amusement surtout)! :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 29 juin 2010 Share Posté(e) 29 juin 2010 Bonjour,J'ai lu complètement le code de LunarLander (je n'ai pas tout compris mais j'ai saisi les concepts et idées de base), et je m'en sert désormais comme base pour mon jeu. Seulement cela ne répond pas complètement à ma question. Dans cet exemple toute la scène est redessinée dans la méthode doDraw(). Dans mon cas lors d'un tir de missile, je dois faire evoluer le missile dans le "ciel". Mais je voudrais redessiner uniquement le missile (sur sa trajectoire). Et je ne sais pas si c'est possible, et il ne font pas comme cela dans le code de LunarLander. Si quelqu'un a déjà eu l'occasion de faire un jeu avec l'API Android, je suis preneur. Merci :) Methode bourine: timer avec X ms qui va servir à déplacer ton missile et à raffraichir l'écran en ne modifiant qu'uniquement la partie en mouvement. Lors du raffraichissement tu vas desciner un carré (ou rectangle ou ton missile) de la couleur du fond (là ça peut être chaud si ton fond varie...) afin d'effacer l'ancienne position du missile. Il suffit enfin de dessiner ton missile à sa nouvelle position. Avec une variable globale temporaire correspondant au coordonées de ton élémént qui se déplace ça doit marcher. C'est bourrin, possible qu'il y est mieux, par contre je pense que c'est une meilleure solution que raffraichir tout l'écran et pour cause, si je prends le freeruner qui est un téléphone assez limite, le bus qui communique vers le gpu est très faible, raffraichir une portion de l'écran c'est fluide, raffraichir tout l'écran ça ne sera pas le cas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 29 juin 2010 Share Posté(e) 29 juin 2010 public void invalidate (Rect dirty) est mieux que tout rafraichir Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.