Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Changer le point d'origine d'une image

Sujet résolu
    15 juin 2006 à 16:03:20

    Bonjour,
    Pour un meilleur réalisme de collisions entre deux cercles, je voudrai déplacer le point d'origine qui est dans le coin supérieur gauche de la surface cercle1 et de la surface cercle2 en leur centre. Est-ce possible ?

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 juin 2006 à 16:52:00

      Grâce à une macro, tu peux simplifier le calcul
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2006 à 17:09:31

        Saurais-tu continuer ton explication stp? Je vois pas vraiment le rapport avec les marcos là.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 juin 2006 à 17:16:26

          Et bien, si tu veux déplacer le point d'origine, tu doit prendre le point en haut à droite, et lui rajouter la longueur du diamètre/2 (du rayon quoi)

          Donc, tu dois, soit mettre à chaque fois que tu modifie les coordonées, ou autre, "image.x+image.w/2" pour l'origine x, et 'image.y+image.h/2' pour l'origine y. Tu peux donc faire une macro qui le fait automatiquement
          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2006 à 17:31:07

            Hum c'est image->w et image->h : image est un pointeur de type SDL_Surface !
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 juin 2006 à 17:35:13

              Oui, tout à fait correct.
              • Partager sur Facebook
              • Partager sur Twitter
                15 juin 2006 à 19:13:34

                Merci de vos réponse, pourrais-je demander d'avoir un exemple avec la macro svp? J'espere ne pas en demander trop :)
                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2006 à 19:18:10

                  http://www.siteduzero.com/tuto-3-4200-1-le-preprocesseur.html#ss_part_3

                  Tu as lu ça ?

                  Bah après tu te crées ta macro (quoique une fonction ça marche très bien aussi avec un return centreImage par exemple)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 juin 2006 à 11:20:54

                    Oui. Je n'arrive pas a mettre le point d'origine d'une image en son centre.
                    Pour centrer le curseur sur le centre de mon pommeau, rien de plus simple:

                    case SDL_MOUSEMOTION:
                         posJoueur.x = event.motion.x - 30;
                         posJoueur.y = event.motion.y - 30;
                         /* etc ... je n'ai pas mis le reste volontairement ici */


                    Mais pour centrer maintenant le point d'origine du palais et ensuite effectuer tous les calculs qui nécessite posJoueur.x posJoueur.y posPalais.x et posPalais.y par leur centre respectif, c'est une autre paire de manche! J'aurais besoin d'aide svp. Merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 juin 2006 à 12:02:48

                      Mais de toute façon tu ne changera pas le pt d'origine de place !

                      Ce qu'il faut faire c'est ça par exemple :

                      struct ptOrigineCentre
                      {
                         long x, y;
                      };

                      Et une fonction :

                      void transformOrigine (SDL_Surface *objet, SDL_rect positionObjet, struct ptOrigineCentre *centreObjet)
                      {
                         centreObjet->x = positionObjet.x + objet->w/2 ;
                         centreObjet->y = positionObjet.y + objet->h/2 ;
                      }

                      Et ensuite tu appelles ta fonction :
                      transformOrigine(joueur, posJoueur, &centreJoueur); //par exemple
                      /*Tu remarques que j'envoie un pointeur pour que les valeurs elle-mêmes soit modifiée !*/

                      Bien sûr auparavant tu auras fait :
                      struct ptOrigineCentre centreJoueur;


                      Voilà j'espère que ça t'aide !
                      Ensuite tu utilise ta structure ptOrigineCentre à la place de la structure SDL_Rect pour calculer les coordonnées !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 juin 2006 à 12:55:13

                        J'ai fais ce que tu as dit, mais je n'arrive pas vraiment, j'explique mon problème de ta solution:

                        case SDL_MOUSEMOTION:
                             transformeOrigine(jBleu, posJoueur, &centreJoueur);
                             centreJoueur.x = event.motion.x;
                             centreJoueur.y = event.motion.y;


                        Le pommeau ne veut pas suivre la souris suite à ce code, pourtant, ma structure est bien celle-ci:

                        typedef struct PtOrigineCentre PtOrigineCentre;
                            struct PtOrigineCentre
                            {
                                long x, y;
                            };


                        et ma fonction est comme ceci:


                        void transformeOrigine (SDL_Surface *objet, SDL_Rect pos, PtOrigineCentre *centreObjet)
                        {
                            centreObjet->x = pos.x + objet->w/2;
                            centreObjet->y = pos.y + objet->h/2;
                        }


                        Pourrais-tu me dire pourquoi mon pommeau ne suit pas la souris stp ? Merci.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 juin 2006 à 12:59:47

                          Comment as-tu déclarer centreJoueur ?
                          Comme ceci ? :
                          PtOrigineCentre centreJoueur;

                          Si oui je ne vois pas bien !

                          N'oublis pas de blitter non plus hein :p !

                          Au fait quel est le problème exact, le pommeau reste en place ou bouge-t-il ?
                          S'il bouge, comment bouge-t-il ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 juin 2006 à 13:01:33

                            Oui la déclaration est bonne sinon j'aurais obtenu une erreur. Ce n'est pas un problème de blittage étant donné que si je marque posJoueur.x a la place de centreJoueur.x et la même chose en y, le pommeau suit bien la souris.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 juin 2006 à 13:08:21

                              Et bah voilà l'erreur ! centreJoueur n'est pas du type SDL_Rect donc on ne peut pas blitter avec !
                              Attends je réfléchis à la solution et je te redis en éditant !

                              Edit : si tu veux utiliserça dans ce sens alor il faut inverser la fonction :
                              void transformeOrigine (SDL_Surface *objet, SDL_Rect *pos, PtOrigineCentre centreObjet)
                              {
                                  pos->x = centreObjet.x - objet->w/2;
                                  pos->y = centreObjet.y - objet->h/2;
                              }
                              /*attention l'appel de fonction se fait maintenant comme ceci :
                              transformeOrigine(machin, &posMachin, centreMachin);
                              */

                              Et tu appelles la fonction après ton case SDL_MOUSEMOTION juste avant le blittage quoi !
                              Je croyais que tu avais besoin de l'inverse moi mais là toi tu veux modifier les positions SDL_Rect en fonction de la postition du centre !

                              Voilà tiens moi au courant !
                              Et blit avec posJoueur pas centreJoueur
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 juin 2006 à 15:23:14

                                Merci, c'est technique marche bien.
                                Mais j'ai un autre petit problème, j'ai une fonction qui limite le déplacement du pommeau (quand il rencontre un mur, il ne le traverse pas). La voici:


                                void collisionJMur(PtOrigineCentre *centreJoueur)
                                {
                                    if(centreJoueur->x <= 380) centreJoueur->x = 380;
                                    if(centreJoueur->x >= 639) centreJoueur->x = 639;
                                    if(centreJoueur->y <= 61)  centreJoueur->y = 61;
                                    if(centreJoueur->y >= 339) centreJoueur->y = 339;
                                }


                                Le problème est que cette fonction se trouve dans le fichier "collision.c" et la définition de ma structure dans le fichier "structures.h". j'ai bien mis
                                #include "structures.h"

                                au début de mon fichier jeu.c (qui contient je le rappelle la fonction collisionJMur) et donc, quand je compile, il met met l'erreur suivante:
                                error: conflicting types for 'collisionJMur'

                                J'ai compris la signification de cette erreur mais pas comment la résoudre, j'ai essayé de mettre SDL_Rect à la place de PtOrigineCentre et, une fois fait, il me met ce warning:

                                warning: passing arg 1 of `collisionJMur' from incompatible pointer type

                                J'ai aussi compris la signification de ce warning mais je ne sais vraiment pas comment résoudre ceci aussi. Quelqu'un saurait-il m'aider sur ce coups ?

                                Merci
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 juin 2006 à 15:53:03

                                  Citation : SeyZ

                                  Le problème est que cette fonction se trouve dans le fichier "collision.c" [...] au début de mon fichier jeu.c (qui contient je le rappelle la fonction collisionJMur)


                                  Alors c'est dans quel fichier, collision.c ou jeu.c ?

                                  Ensuite lors de l'appel de la fonction fais tu bien :
                                  collisionJMur(&centreBidule);


                                  Sinon je ne vois pas où le conflit de types aurait lieu (c'est comme ça que je comprends l'error).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 juin 2006 à 18:23:52

                                    Dans collision.c, désolé ^^
                                    Oui je fais bien cet appel de fonction.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 juin 2006 à 10:44:19

                                      Et t'as inclus structure.h dans collision.c (parce que tu dis l'avoir fait dans jeu.c mais les autres on sais pas) ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 juin 2006 à 11:11:25

                                        J'ai réglé le problème, merci de m'avoir aidé Pierre89. C'était un problème de fatigue dirons-nous, en faite je ne m'étais pas forcément bien organisé et je me suis embrouillé, mais après une bonne nuit de sommeil ca a été ^^ Encore merci.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        [SDL] Changer le point d'origine d'une image

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown