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

Développement 2D, 3D et Jeux Discussion :

Translation d'images ?


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut Translation d'images ?
    Bonjour, je voudrais créer un mini-jeu avec une montgolfière qui reste fixe suivant l'axe des abscisses à l'écran et qui ne varie que en hauteur.

    C'est donc le paysage qui va devoir défiler et je me demande quelles sont les différents moyens de réaliser ça ? Je ne peux pas en effet créer une image de taille gigantesque afin de ne jamais arriver au bout !

    Donc est-ce qu'il faut obligatoirement créer plusieurs images que l'on met bout à bout (lorsque l'une a fini de défiler, on met la suivante) ? Car cette technique me semble lente du point de vue éxécution (chaque fois charger une image en mémoire et la translater :s )

    Ou alors existe-il d'autres techniques beaucoup plus efficaces ?

    Toutes les idées sont les bienvenues merci à vous

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par NeMo_O Voir le message
    Donc est-ce qu'il faut obligatoirement créer plusieurs images que l'on met bout à bout (lorsque l'une a fini de défiler, on met la suivante) ? Car cette technique me semble lente du point de vue éxécution (chaque fois charger une image en mémoire et la translater :s )

    Ou alors existe-il d'autres techniques beaucoup plus efficaces ?
    Ca fait un bail que je n'ai plus codé de side-scroller, mais je ne pense pas qu'on ai fait mieux que de translater (blitter) l'image du fond.

    Je déplace la discussion dans le forum "Jeux", où tu auras certainement plus de réponses.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Je pense que t'as deux moyen de faire ça:

    1) Soit tu trouves une image de décor que tu peux faire tourner en boucle. Tu crées 2 références sur cette image et lorsque la première a finit de s'afficher, tu affiche la deuxième. Ça se fait facilement.

    2) Tu peux aussi créer un grand décor et le faire défiler jusqu'à la fin du niveau.

    Pour la vitesse d'exécution peut importe la taille de l'image vu qu'il y aura du clipping. La ou ça peut bloquer c'est si tu fais le blitting toi même mais si tu utilises directx ou la SDL y aura pas de souci.
    Pour finir le chargement pourra peut être être plus long si tu charges un seul grand décor mais ça on peut rien y faire.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Oki merci

    Je pense que je vais faire avec une technique maison lol.

    J'ai pris une image je l'ai retournée sous paint et mise bout à bout avec l'originale, ce qui fait que je peux la faire tourner en boucle.

    Seul souci, je pense que je vais devoir déclarer mon image en variable globale afin de ne pas la recharger toutes les secondes.

    (Bonne idée pour l'image qui fait tout le "niveau" mais ce n'est pas le but de mon programme, il doit tourner indéfiniment jusqu'à ce que l'utilisateur décide de s'arreter)

    Sinon, je ne connais pas trop ce que sont le blitting et le clipping

    J'ai trouvé ça sur wikipédia :

    En programmation graphique 3D, la méthode du clipping consiste à ne pas calculer les objets extérieurs au cône de vision d'une scène afin d'optimiser le temps de calcul.
    Mais pourrais-je avoir un peu plus de précisions ?

    Car je ne m'imagine pas "découper" les bouts de l'image qui sortent de l'écran.

    Merci

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Je comprend pas pourquoi tu veux recharger l'image a chaque fois. Si tu pouvais me dire quelle API t'as l'intention d'utiliser ça pourrait aider.

    Voila comment je ferais un scrolling:

    1)Je charge une seul fois ma texture qui représentes le background a scroller.

    2)Je fais une entité background (un objet, ou peut importe comment tu fais ton jeu, un truc pour stocker les infos de ton background quoi). Cette entité a 2 références vers ma texture et donc 2 fois les coordonnées x et y.

    3)Ensuite tu affiche la 1er texture et tu la scroll. Lorsqu'elle arrive a la fin, tu lui colle le début de la deuxième texture et tu continues le scrolling. Lorsque la deuxième texture arrive a la fin, tu lui met la 1er texture au bout. Tu continues de faire ça tout le temps et si ta texture a un début et une fin bien raccord, on y verra que du feu.

    J'espère que je suis clair. C'est une technique que j'ai utilisé et qui marche. Y en a peut être des mieux mais je les connais pas et j'ai jamais vraiment cherché non plus.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    le blitting c'est juste le fait de copier bit a bit des informations. Pour les jeux c'est principalement copier du buffer qui représente une image vers le buffer qui représente l'écran.

    Le clipping c'est decouper une image en mémoire pour ne garder que la partie qui sera réellement afficher. En réalité on découpe pas vraiment l'image, on défini juste un rectangle qui représente la partie a être affiché.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Oui merci très clair

    Je programme sous Linux Fedora en C avec la bibliothèque GTK+.

    J'ai donc fait comme tu as dit, j'ai chargé une seule fois mon image et ensuite je la translate jusqu'à arriver à la fin puis je met la seconde et ainsi de suite.

    Mais mon ventilateur se met à tourner assez fort, signe d'une forte utilisation du processeur. Je pense que c'est dû au bitting car copier une image jpeg de taille 800*600 vers l'écran toutes les 100 ms, ça doit être assez long.

    En tout cas, merci ça marche bien. C'est juste un problème d'optimisation maintenant car je trouve que ça devrait être plus fluide et moins consommer de ressources. (Même en lançant un jeu 3D, ça ne "rame" pas autant lol)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Ok cool.

    J'y connais rien en programmation linux (j'ai fait un peu de x window mais j'ai vite arrêté).

    Si tu fais le blitting par toi même, vérifie que tu utilises les memcpy le plus possible et que tu parcours l'image et l'écran ligne par ligne en mémoire et non pas colonne par colonne (ca fait du cache miss sinon).

    Si c'est une fonction d'une API c'est que ça vient d'ailleurs dans ton code.

    Bonne chance a+!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Oui j'ai vérifié c'est bien ligne par ligne que ça se copie.

    J'ai trouvé d'ou venait la "lenteur" : je copiais l'image vers l'écran sur une certaine abscisse, puis je la supprimais et je la recopiais une seconde fois un cran vers la gauche.

    Je ne vois pas comment je pouvais faire plus élémentaire, mais j'ai trouvé une fonction dont le but est de translater et avec cette fonction plus de problème

    Merci en tout cas !

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Tu peux utiliser aussi le système de "tuiles" ou tilemap en anglais par exemple avec des cases de 64*64...comme dans un RPG
    Sauf que dans un RPG la vue est soit iso 2d soit de haut.
    Dans le jeu que tu veux faire la vue est de coté..
    inconvénient : les motifs se répètent mais l'avantage c'est que c'est relativement rapide.
    Et puis si tu as des bitmaps lambdas comment veux-tu gérer les collisions avec le relief?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    D'accord

    Merci pour cette idée je n'y avais pas pensé !

    C'est vrai que dans le cadre d'un jeu, c'est obligatoire pour gérer les collisions mais ça n'est pas réellement un jeu en lui-même mon application (c'est pour cela qu'à la base je ne savais pas vraiment dans quel forum poster lol). C'est juste une modélisation graphique basique d'une valeur entre 0 et 100 que je récupère autre part.

    Entre 0 et 20, rien ne passe la montgolfière est au sol et le paysage ne défile pas. Puis progressivement jusqu'à 100, elle décolle et la vitesse de défilement du paysage augmente.

    Je ne me préoccupe pas des collisions car dans le cadre du projet ça n'est pas le point le plus important. C'est un projet sur le stress et l'utilisateur doit réussir par le biofeedback à poser la montgolfière (s'il est stressé, elle va avancer très vite et s'il est relaxé elle sera posée au " sol ").

    Enfin merci quand même je retiens ça pour le jour où j'en aurai besoin

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

Discussions similaires

  1. rotation et translation d'image
    Par diskostu dans le forum C
    Réponses: 1
    Dernier message: 30/04/2011, 01h25
  2. [Débutant] Translation dans une image sans en changer la taille
    Par MxBen9 dans le forum Images
    Réponses: 3
    Dernier message: 19/07/2010, 12h53
  3. translation d'image boucle for
    Par jujuj dans le forum Images
    Réponses: 10
    Dernier message: 28/09/2009, 16h05
  4. translation d' image
    Par ABN84 dans le forum Images
    Réponses: 1
    Dernier message: 29/03/2009, 17h48
  5. Animation d'une image, translation, rotation en javascript ?
    Par Ptit_Mouss dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/09/2006, 11h21

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