Partage
  • Partager sur Facebook
  • Partager sur Twitter

collision box en mouvement qui bloque

    16 février 2017 à 15:20:31

    Bonjour,

    En développant un petit rpg 2D, je me heurte à un petit problème de compréhension.

    J'ai suivi le tutoriel de Fvirtman sur le tilemapping et les collisions, puis j'ai continué d'avancer de mon coté.

    J'ai donc créé un fichier fsprite (contenant toutes les fonctions relatives a mon personnage) et également un fichier fpnj.

    Voici mon problème : Lorsque mon perso et mon sprite rentre en collision, impossible de sortir de cette collision. Il me parait évident que cela à un rapport au fait qu'une fois la collision effectuée elle semble toujours vraie et que la fonction affine ne prend pas le relais, cependant je ne vois pas comment m'en sortir...

    Ps : Les positions sont chargées dans des fichiers txt. Egalement le mouvement du pnj ce fait par une fonction aléatoire.

    Ps2 : Ne sachant pas trop ce qu'il vous faut je vous donne le code de mes 2 fichiers et du fichier ressource, s'il faut d'autres renseignements je vous les donneraient avec plaisir ^^

    Merci d'avance ^^

    fsprite.c
    void ChargementPositionJoueur(Perso *eden)
    {
        FILE *joueur;
        joueur = fopen("joueur.txt", "r");
        fscanf(joueur, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d" ,&eden->positionX, &eden->positionY, &eden->level, &eden->vieEden,
               &eden->vieMaxEden, &eden->niveauEden, &eden->forceEden, &eden->enduranceEden, &eden->dexteriteEden, &eden->intelligenceEden,
               &eden->ruseEden, &eden->arme1Eden, &eden->arme2Eden, &eden->arme3Eden, &eden->arme4Eden, &eden->arme5Eden, &eden->arme6Eden, &eden->arme7Eden);
        rewind(joueur);
        fclose(joueur);
    }
    
    SDL_Surface *positionJoueur(Perso*eden, int x)
    {
        TTF_Init();
        TTF_Font *fontX = NULL;
        fontX = TTF_OpenFont("Data\\Font\\MOD.ttf", 30);
        SDL_Color noir = {0, 0, 0};
        char DPC[5] = {0};
        sprintf(DPC, "%d", x);
        SDL_Surface *DPM = TTF_RenderText_Blended(fontX, DPC, noir);
        return DPM;
    }
    
    void SauvegardePositionJoueur(Perso *eden)
    {
        FILE *joueur;
        joueur = fopen("joueur.txt", "w");
        fprintf(joueur, "%d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n %d\n" ,eden->positionX, eden->positionY,
                eden->level, eden->vieEden, eden->vieMaxEden, eden->niveauEden, eden->forceEden, eden->enduranceEden, eden->dexteriteEden,
                eden->intelligenceEden, eden->ruseEden, eden->arme1Eden, eden->arme2Eden, eden->arme3Eden, eden->arme4Eden, eden->arme5Eden,
                eden->arme6Eden, eden->arme7Eden);
        fclose(joueur);
    }
    
    SDL_Rect Persopos(Perso *eden)
    {
        ChargementPositionJoueur(eden);
      	SDL_Rect perso;
    	perso.x = eden->positionX;
    	perso.y = eden->positionY;
    	perso.w = 32;
    	perso.h = 32;
    
    	return perso;
    }
    
    void RecupererVecteur(Perso* eden,Input* in, int* vx,int* vy)
    {
    	int vitesse = MOVE_SPEED_PLAYER;
    	*vx = *vy = 0;
    
    	if (in->key[SDLK_UP])
        {
            *vy = -vitesse;
            eden->direction = 2;
            eden->marche = 1;
        }
        if (in->key[SDLK_UP] == 0)
        {
            eden->marche = 0;
        }
    
    	if (in->key[SDLK_DOWN])
        {
            *vy = vitesse;
            eden->direction = 0;
            eden->marche = 1;
        }
    	if (in->key[SDLK_LEFT])
        {
            *vx = -vitesse;
            eden->direction = 3;
            eden->marche = 1;
        }
    	if (in->key[SDLK_RIGHT])
        {
            *vx = vitesse;
            eden->direction = 1;
            eden->marche = 1;
        }
    }
    
    int CollisionMob(SDL_Rect *perso, Perso *eden, Mob *x)
    {
        if ((x->positionX >= eden->positionX + perso->w)
    	|| (x->positionX + x->mobWidth <= eden->positionX)
    	|| (x->positionY >= eden->positionY + perso->h)
    	|| (x->positionY + x->mobHeight <= eden->positionY))
    	{
            return 0;
    	}
    	else
            return 1;
    }
    
    int CollisionPNJ(SDL_Rect *perso, Perso *eden, PNJ *x)
    {
        if ((x->positionPNJX > eden->positionX + perso->w)
    	|| (x->positionPNJX + x->PNJWidth < eden->positionX)
    	|| (x->positionPNJY > eden->positionY + perso->h)
    	|| (x->positionPNJY + x->PNJHeight < eden->positionY))
    	{
            return 0;
    	}
    	else
           return 1;
    }
    
    int EssaiDeplacement(Map* carte,Perso *eden, PNJ *pnj1, SDL_Rect *perso, int vx,int vy)
    {
    	SDL_Rect test;
    	test = *perso;
    	test.x+=vx;
    	test.y+=vy;
    
    	if (CollisionDecor(carte,&test)==0 && CollisionPNJ(perso, eden, pnj1) == 0)
        {
            *perso = test;
    		return 1;
        }
        else
            return 0;
    }
    
    void Affine(Map* carte,Perso *eden, PNJ *pnj1, SDL_Rect* perso,int vx,int vy)
    {
    	int i;
    	for(i=0;i<ABS(vx);i++)
    	{
    		if (EssaiDeplacement(carte,eden,pnj1,perso,SGN(vx),0)==0)
    			break;
    	}
    	for(i=0;i<ABS(vy);i++)
    	{
    		if (EssaiDeplacement(carte,eden,pnj1,perso,0,SGN(vy))==0)
    			break;
    	}
    }
    
    void Deplace(Map* carte,Perso *eden, PNJ *pnj1,SDL_Rect* perso,int vx,int vy,int WIDTH_TILE,int HEIGHT_TILE)
    {
    	if (vx>=WIDTH_TILE || vy>=HEIGHT_TILE)
    	{
    		Deplace(carte,eden,pnj1,perso,vx/2,vy/2,WIDTH_TILE,HEIGHT_TILE);
    		Deplace(carte,eden,pnj1,perso,vx-vx/2,vy-vy/2,WIDTH_TILE,HEIGHT_TILE);
    		return;
    	}
    	if (EssaiDeplacement(carte,eden,pnj1,perso,vx,vy)==1)
    		return;
    	Affine(carte,eden,pnj1,perso,vx,vy);
    }
    
    void Evolue(Perso* eden,PNJ *pnj1,Input* in,Map* carte, SDL_Rect* perso,int WIDTH_TILE,int HEIGHT_TILE)
    {
    	int vx,vy;
    	RecupererVecteur(eden, in, &vx,&vy);
    	Deplace(carte,eden,pnj1,perso,vx,vy,WIDTH_TILE,HEIGHT_TILE);
    }
    
    int GetFrame(int min, int max, int vitesse)
    {
        int timer = SDL_GetTicks();
        int nbframes = max - min +1;
        int res = (timer/vitesse)% nbframes+ min;
        return res;
    }
    
    void AfficherPerso(Perso* eden, SDL_Rect* perso,SDL_Surface* screen,int xscroll,int yscroll, SDL_Surface *spriteEden)
    {
    	SDL_Rect positionsurecran = *perso;
    	positionsurecran.x -= xscroll;
    	positionsurecran.y -= yscroll;
    	eden->positionX = (positionsurecran.x + xscroll);
    	eden->positionY = (positionsurecran.y + yscroll);
    
    	int crtframes = GetFrame(0, 2, 160);
    
    	SDL_Rect cut;
        cut.w=EDEN_WIDTH;
        cut.h=EDEN_HEIGHT;
        cut.x=crtframes*EDEN_WIDTH;
        cut.y= eden->direction * EDEN_HEIGHT ;
    
        if (eden->marche == 1)
        {
            switch(eden->direction)
            {
                case 0:
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 1 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 2 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 3 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                break;
            }
        }
        else if (eden->marche == 0)
        {
            cut.x=EDEN_WIDTH;
            switch(eden->direction)
            {
                case 0:
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 1 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 2 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                case 3 :
                    Apply_Surface(positionsurecran.x, positionsurecran.y, spriteEden, screen, &cut);
                    break;
                break;
            }
        }
    }
    fpnj.c
    void ChargementInfoPNJ(PNJ *x, int lineFile)
    {
        char ligne[100];
        int i = 0;
        FILE *filepnj = fopen("pnj.txt", "r");
        if (filepnj == NULL)
        {
            puts("Probleme ouverture du fichier pnj.txt");
            exit(0);
        }
    
        while (fgets(ligne, 100, filepnj) != NULL)
        {
                 i++;
            if (i == lineFile)
            {
                if (sscanf(ligne, "%d %d %d %d %d", &x->categoriePNJ, &x->positionPNJX, &x->positionPNJY,
                    &x->PNJWidth, &x->PNJHeight) != 5)
                {
                    puts("Probleme de format de ligne incorrect");
                }
            }
        }
        fclose(filepnj);
    }
    
    SDL_Rect PNJpos(PNJ *x)
    {
      	SDL_Rect pnj;
    	pnj.x = x->positionPNJX;
    	pnj.y = x->positionPNJY;
    	pnj.w = x->PNJWidth;
    	pnj.h = x->PNJHeight;
    
    	return pnj;
    }
    
    int directionAleatoirePNJ(PNJ *x)
    {
        int alea;
        alea = (rand() % (9 - 0 + 1)) + 0;
        if (alea == 0)
        {
            x->marchePNJ = 1;
            x->directionPNJ = 0;
        }
        else if (alea == 1)
        {
            x->marchePNJ = 1;
            x->directionPNJ = 1;
        }
        else if (alea == 2)
        {
            x->marchePNJ = 1;
            x->directionPNJ = 2;
        }
        else if (alea == 3)
        {
            x->marchePNJ = 1;
            x->directionPNJ = 3;
        }
        else if (alea == 4 || alea == 5 || alea == 6 || alea == 7 || alea == 8 || alea == 9)
        {
            x->marchePNJ = 0;
        }
        return x->directionPNJ;
    }
    
    void RecupererVecteurPNJ(PNJ *x, int *vx, int *vy)
    {
        int vitessePNJ = MOVE_SPEED_PNJ;
    	*vx = *vy = 0;
    
                if (x->directionPNJ == MOVE_UP)
                {
                    *vy = -vitessePNJ;
                    x->marchePNJ = 1;
                }
                else if (x->directionPNJ == MOVE_RIGHT)
                {
                    *vx = +vitessePNJ;
                    x->marchePNJ = 1;
                }
                else if(x->directionPNJ == MOVE_DOWN)
                {
                    *vy = +vitessePNJ;
                    x->marchePNJ = 1;
                }
                else if (x->directionPNJ == MOVE_LEFT)
                {
                    *vx = -vitessePNJ;
                    x->marchePNJ = 1;
                }
                else
                {
                    x->marchePNJ = 0;
                }
    }
    
    int EssaiDeplacementPNJ(PNJ *x, Map* carte, SDL_Rect* pnj, int vx,int vy)
    {
    	SDL_Rect testPNJ;
    	testPNJ = *pnj;
    	testPNJ.x+=vx;
    	testPNJ.y+=vy;
    	if (CollisionDecor(carte,&testPNJ)==0)
    	{
    		*pnj = testPNJ;
    		return 1;
    	}
    	else if  (CollisionDecor(carte,&testPNJ)==1)
        {
            x->marchePNJ = 0;
        }
    	return 0;
    }
    
    void AffinePNJ(PNJ *x, Map* carte, SDL_Rect* pnj, int vx, int vy)
    {
    	int i;
    	for(i=0;i<ABS(vx);i++)
    	{
    		if (EssaiDeplacementPNJ(x, carte,pnj,SGN(vx),0)==0)
    			break;
    	}
    	for(i=0;i<ABS(vy);i++)
    	{
    		if (EssaiDeplacementPNJ(x,carte,pnj,0,SGN(vy))==0)
    			break;
    	}
    }
    
    void DeplacePNJ(PNJ *x, Map* carte, SDL_Rect* pnj, int vx, int vy, int WIDTH_TILE, int HEIGHT_TILE)
    {
    	if (vx>=WIDTH_TILE || vy>=HEIGHT_TILE)
    	{
    		DeplacePNJ(x, carte,pnj,vx/2,vy/2,WIDTH_TILE,HEIGHT_TILE);
    		DeplacePNJ(x, carte,pnj,vx-vx/2,vy-vy/2,WIDTH_TILE,HEIGHT_TILE);
    		return;
    	}
    	if (EssaiDeplacementPNJ(x, carte,pnj,vx,vy)==1)
    		return;
    	AffinePNJ(x, carte,pnj,vx,vy);
    }
    
    void EvoluePNJ(PNJ* x,Map* carte, SDL_Rect* pnj,int WIDTH_TILE,int HEIGHT_TILE)
    {
    	int vx,vy;
    
    	RecupererVecteurPNJ(x,&vx,&vy);
    	DeplacePNJ(x,carte,pnj,vx,vy,WIDTH_TILE,HEIGHT_TILE);
    }
    
    int GetFramePNJ(int min, int max, int vitesse)
    {
        int timer = SDL_GetTicks();
        int nbframes = max - min +1;
        int res = (timer/vitesse)% nbframes+ min;
        return res;
    }
    
    void AfficherPNJ(PNJ* x, SDL_Rect* pnj, SDL_Surface* screen, int xscroll, int yscroll, SDL_Surface *spritePNJ)
    {
    
    	SDL_Rect positionsurecranpnj = *pnj;
    
        SDL_Rect PNJpos();
    	positionsurecranpnj.x -= xscroll;
    	positionsurecranpnj.y -= yscroll;
        x->positionPNJX = (positionsurecranpnj.x + xscroll);
    	x->positionPNJY = (positionsurecranpnj.y + yscroll);
    	int crtframes = GetFramePNJ(0, 2, 160);
    
    	SDL_Rect cut;
        cut.w= x->PNJWidth;
        cut.h= x->PNJHeight;
        cut.x=crtframes*x->PNJWidth;
        cut.y= x->directionPNJ * x->PNJHeight;
    
        if (x->marchePNJ == 1)
        {
            switch(x->directionPNJ)
            {
                case 0:
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 1 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 2 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 3 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                break;
            }
        }
        if (x->marchePNJ == 0)
        {
            cut.x= x->PNJWidth;
            switch(x->directionPNJ)
            {
                case 0:
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 1 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 2 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                case 3 :
                    Apply_Surface(positionsurecranpnj.x, positionsurecranpnj.y, spritePNJ, screen, &cut);
                    break;
                break;
            }
        }
    }
    fressource.h
    #ifndef FRESSOURCE_H
    #define FRESSOURCE_H
    typedef struct
    {
        int direction;
        int marche;
        int positionX;
        int positionY;
        int level;
        int vieEden;
        int vieMaxEden;
        int niveauEden;
        int forceEden;
        int enduranceEden;
        int dexteriteEden;
        int intelligenceEden;
        int ruseEden;
        int arme1Eden;
        int arme2Eden;
        int arme3Eden;
        int arme4Eden;
        int arme5Eden;
        int arme6Eden;
        int arme7Eden;
        int DAB1;
        int DAB2;
        int DAB3;
        int DAB4;
        int DAB5;
        int DAB6;
        int DAB7;
        char nomArme1[50];
        char nomArme2[50];
        char nomArme3[50];
        char nomArme4[50];
        char nomArme5[50];
        char nomArme6[50];
        char nomArme7[50];
    } Perso;
    
    typedef struct
    {
        int directionPNJ;
        int marchePNJ;
        char nomPNJ[50];
        int categoriePNJ;
        int positionPNJX;
        int positionPNJY;
        int PNJWidth;
        int PNJHeight;
    } PNJ;
    
    
    #endif




    • Partager sur Facebook
    • Partager sur Twitter
      16 février 2017 à 16:12:39

      Bonjour,

      J'ai pas lu le code alors je peux me tromper sur ce que tu fais, mais d'une manière générale, il ne faut pas "faire le test de collision une fois le déplacement fait" mais "faire le test de collision sur la position future avant d'autoriser ou non le déplacement".

      De cette façon, on reste toujours dans un état correct!

      edit1: La condition ligne 58 de fsprite me semble insuffisante!

      edit2: tu as trop de fonction testant le deplacement. Pas besoin d'une version PNJ ET d'une version Perso!

      -
      Edité par breizhbugs 16 février 2017 à 16:23:07

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        16 février 2017 à 17:01:36

        Salut,

        breizhbugs a écrit:

        Bonjour,

        J'ai pas lu le code alors je peux me tromper sur ce que tu fais, mais d'une manière générale, il ne faut pas "faire le test de collision une fois le déplacement fait" mais "faire le test de collision sur la position future avant d'autoriser ou non le déplacement".

        Oui et non... On peut faire l'un ou l'autre. Cela dépend du comportement qu'on affecte derrière.

        Si tu ne veux pas entrer dans un mur, ou bloquer ton sprite, alors là il faut effectivement contrôler AVANT.

        Si la "rencontre" fait partie du mécanisme, genre un tir sur un ennemi, alors on déplace tout le monde, on contrôle les box, et en cas de contact, on déclenche tout ce qui va avec (e.g. animation d'explosion), avant d'afficher.

        Après, comme breizhbugs, je n'ai pas vraiment lu tout le code en détails. Tu sais, on est un peu fainéant dans le domaine. Essais de cibler un peu mieux la partie défectueuse pour poster du code plus restreint.

        Si tu ne sais pas trop cibler, vire au moins tout ce qui n'a manifestement aucun rapport pour commencer, tout ce qui est blit, chargements, sauvegarde, création de contexte etc...

        Ce n'est pas qu'on ne veux pas t'aider, on est là pour ça, mais il faut nous mâcher un peu le boulot ;) .

        Bonne continuation.

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

          16 février 2017 à 17:49:27

          Rebonjour !

          #Breizhbugs : En fait dans le code il est censé avoir une fonction affine, qui permet de gérer des déplacements après collision.

          Grosso modo : si collision, on créer un vecteur déplaçant le sprite le "long" de la zone de collision. (où alors j'ai peut être vraiment mal compris le tuto ^^)

          La ligne 58 est en effet insuffisante, j'avais oublié ce problème (a l'époque je me servait du fait que le compilateur lit les if dans l'ordre, il faudra que je modifie cela)

          Le "copié collé" des fonctions de déplacement venait du fait que je ne savais pas si j'aillais on non les modifier, il faudrait en effet que je formalise mieux cela pour alléger mon code.

          #drx : c'est vrai que c'est pas très malin de ma part, voici donc les informations utilies (désolé c'est encore long :() :

          // Position du perso (eden->position sont chargés d'un fichier)
          SDL_Rect Persopos(Perso *eden)
          {
              ChargementPositionJoueur(eden);
            	SDL_Rect perso;
          	perso.x = eden->positionX;
          	perso.y = eden->positionY;
          	perso.w = 32;
          	perso.h = 32;
          
          	return perso;
          }
          
          // Les fonctions gérants les déplacements et les collisions
          
          void RecupererVecteur(Perso* eden,Input* in, int* vx,int* vy)
          {
          	int vitesse = MOVE_SPEED_PLAYER;
          	*vx = *vy = 0;
          
          	if (in->key[SDLK_UP])
              {
                  *vy = -vitesse;
                  eden->direction = 2;
                  eden->marche = 1;
              }
          ETC....
          }
          
          int EssaiDeplacement(Map* carte,Perso *eden, PNJ *pnj1, SDL_Rect *perso, int vx,int vy)
          {
          	SDL_Rect test;
          	test = *perso;
          	test.x+=vx;
          	test.y+=vy;
          
          	if (CollisionDecor(carte,&test)==0 && CollisionPNJ(perso, eden, pnj1) == 0)
              {
                  *perso = test;
          		return 1;
              }
              else
                  return 0;
          }
          
          void Affine(Map* carte,Perso *eden, PNJ *pnj1, SDL_Rect* perso,int vx,int vy)
          {
          	int i;
          	for(i=0;i<ABS(vx);i++)
          	{
          		if (EssaiDeplacement(carte,eden,pnj1,perso,SGN(vx),0)==0)
          			break;
          	}
          	for(i=0;i<ABS(vy);i++)
          	{
          		if (EssaiDeplacement(carte,eden,pnj1,perso,0,SGN(vy))==0)
          			break;
          	}
          }
          
          void Deplace(Map* carte,Perso *eden, PNJ *pnj1,SDL_Rect* perso,int vx,int vy,int WIDTH_TILE,int HEIGHT_TILE)
          {
          	if (vx>=WIDTH_TILE || vy>=HEIGHT_TILE)
          	{
          		Deplace(carte,eden,pnj1,perso,vx/2,vy/2,WIDTH_TILE,HEIGHT_TILE);
          		Deplace(carte,eden,pnj1,perso,vx-vx/2,vy-vy/2,WIDTH_TILE,HEIGHT_TILE);
          		return;
          	}
          	if (EssaiDeplacement(carte,eden,pnj1,perso,vx,vy)==1)
          		return;
          	Affine(carte,eden,pnj1,perso,vx,vy);
          }
          
          void Evolue(Perso* eden,PNJ *pnj1,Input* in,Map* carte, SDL_Rect* perso,int WIDTH_TILE,int HEIGHT_TILE)
          {
          	int vx,vy;
          	RecupererVecteur(eden, in, &vx,&vy);
          	Deplace(carte,eden,pnj1,perso,vx,vy,WIDTH_TILE,HEIGHT_TILE);
          }
          
          
          // La fonction collision avec le pnj
          int CollisionPNJ(SDL_Rect *perso, Perso *eden, PNJ *x)
          {
              if ((x->positionPNJX > eden->positionX + perso->w)
          	|| (x->positionPNJX + x->PNJWidth < eden->positionX)
          	|| (x->positionPNJY > eden->positionY + perso->h)
          	|| (x->positionPNJY + x->PNJHeight < eden->positionY))
          	{
                  return 0;
          	}
          	else
                 return 1;
          }

          Autres informations importantes :

          #define SGN(X) (((X) == 0)?(0):(((X)<0)?(-1):(1)))
          #define ABS(X) ((((X)<0)?(-(X)):(X)))
          
          // Pour passer en coordonnées globales lors de l'affichage des sprites pnj/perso on change également les positions :
          
          SDL_Rect positionsurecran = *perso;
          positionsurecran.x -= xscroll;
          positionsurecran.y -= yscroll;
          eden->positionX = (positionsurecran.x + xscroll);
          eden->positionY = (positionsurecran.y + yscroll);
          
          SDL_Rect positionsurecranpnj = *pnj;
          positionsurecranpnj.x -= xscroll;
          positionsurecranpnj.y -= yscroll;
          x->positionPNJX = (positionsurecranpnj.x + xscroll);
          x->positionPNJY = (positionsurecranpnj.y + yscroll);




          -
          Edité par Eden Stark 16 février 2017 à 17:51:10

          • Partager sur Facebook
          • Partager sur Twitter
            16 février 2017 à 18:40:21

            Eden Stark a écrit:

            #Breizhbugs : En fait dans le code il est censé avoir une fonction affine, qui permet de gérer des déplacements après collision.

            Au vu du code que tu donnes, ta fonction affine ne sert strictement à rien...

            De même ta fonction evolue est juste une surcouche inutile!

            Tu devrais avoir quelque chose de simple et lisible style

            pour chaque objet mouvant objm
                tempsobj = appliquedeplacement(objm); //tempsobj reprensente objm dans sa position future
                stop = 0;
                pour chaque objet o
                   si collision(tempobj, o)== VRAI
                       stop = 1
                        break;
                   finsi
                finpour
                si stop = 0
                   objm = appliquerdeplacement(objm)
                finsi
            finpour
                 



            -
            Edité par breizhbugs 16 février 2017 à 18:48:22

            • Partager sur Facebook
            • Partager sur Twitter
            ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
              18 février 2017 à 1:49:51

              Bonsoir !

              Après avoir pas mal cherché, je dois avouer que je comprend pas bien...

              Les fonctions utilisées jusqu'à présent, marchaient pour les collisions décors, cependant je comprend que ce soit un cas différent pour les objets en mouvement.

              J'ai essayé de trouver comment ta fonction fonctionne, mais en vain.

              En fait je n'arrive pas a piger comment on peut anticiper un mouvement avant de le faire (le tempsobjet dans ton exemple)...

              • Partager sur Facebook
              • Partager sur Twitter
                18 février 2017 à 12:49:13

                Salut,

                En fait cela dépend de comment tu opères dans ton programme. J'ai envie de dire qu'il y a 2 grands modes de pensé. Sois tu penses en terme d'objet, soit en terme de fonctions.

                Je te montre 2 schémas simplifié puis t'explique :

                pour chaque bonhomme : par "objet"
                {
                  si (ok pour déplacer) <- les box ici.
                      déplacer;
                  animer;
                  afficher;
                }
                /*par "fonction"*/
                
                 contrôler si ok pour déplacer; (pour chaque bonhomme en interne)
                
                 déplacer; (le résultat précédent mémorisé dans bonhomme)
                
                 animer;(pour chaque bonhomme en interne)
                
                 afficher;(pour chaque bonhomme en interne)
                

                Par exemple, dans mon jeu, j'ai utilisé la seconde méthode à la différence que je contrôlai les box en dernier puisque je cherche le contact au lieu de l'éviter.

                Si tu utilises la seconde méthode en voulant éviter le contact alors tes bonhommes doivent regarder "plus loin" que juste devant eux, maintenant un exemple concret :

                Le pixel en 50 est libre, 2 pixels A et B ne doivent pas se rencontrer en convergeant vers X :

                • A est en 49 et regarde en 50 s'il peut avancer d'un pixel  : Oui.
                • B est en 51 et regarde en 50 s'il peut reculer d'un pixel : Oui.
                • A avance;
                • B recule;

                Et là... C'est le drame, l'un avance et l'autre recule donc... Ton jeu se retrouve interdit aux mineurs :lol:

                Bonne continuation.

                -
                Edité par drx 18 février 2017 à 12:51:56

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                collision box en mouvement qui bloque

                × 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