Correction d'un bug collision dans dxsprite.pas

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 988 fois - Téléchargée 35 fois

Contenu du snippet

Bonjour,

Pour les utilisateurs de DELPHIX, certain on du remarquer que le test de collision en PIXELCHECK etait erronée. Surtout si vous utilisez la meme image ou (Surface) pour les sprites...

Avant toutes choses, il convient d'utiliser la class TImageSpriteEX pour les sprites animés.

Apres pour le bug en cas de meme Image, faites la correction si dessous :

Dans le cas contraire, la collision se fera uniquement en BoundRect.

Voila, suis pas pro, mais j'espere apporté une pierre a votre édifice :)

Meandcat

Source / Exemple :


Avant :

{  Pixel check !!!  }
    ddsd1.dwSize := SizeOf(ddsd1);
    if suf1.Lock(r1, ddsd1) then
    begin
      try
        ddsd2.dwSize := SizeOf(ddsd2);
        if (suf1=suf2) or suf2.Lock(r2, ddsd2) then
        begin
        try
            if suf1=suf2 then ddsd2 := ddsd1;
            if ddsd1.ddpfPixelFormat.dwRGBBitCount<>ddsd2.ddpfPixelFormat.dwRGBBitCount then Exit;
                                     
            {  Get transparent color  }
            .........
           finally
            if suf1<>suf2 then suf2.UnLock;
          end;
        end;
      finally
        suf1.UnLock;
      end;
    end;
    Result := False;
  end;
end;      <----(End de la function)

Apres :

{  Pixel check !!!  }
    ddsd1.dwSize := SizeOf(ddsd1);
    ddsd2.dwSize := SizeOf(ddsd2);
    if not suf2.Lock(r2,ddsd2) then  exit;
    Suf2.UnLock;
    if suf1.Lock(r1, ddsd1) then
    try
            if ddsd1.ddpfPixelFormat.dwRGBBitCount<>ddsd2.ddpfPixelFormat.dwRGBBitCount then Exit;
                                     
            {  Get transparent color  }
           ..............
    finally
       suf1.UnLock;
    end;
    Result := False;
  end;
end;    <---- (End de la function)

(entre nous, j'ai enlever le begin..end englobant le Try car ca sert a rien...)

Conclusion :


La derniere version que j'ai est la 2000 V2 remanier pour fonctionner sous Delphi 7. Si par hasard vous en connaissez une plus recente. Suis preneur :)

A voir également

Ajouter un commentaire

Commentaires

japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
Salut, meandcat.

Pourrais-tu expliquer ce que tu entends par erroné en parlant du test de collision de Delphix ?

J'ai programmé récemment un casse-briques sommaire, avec des sprites utilisant la même image (les briques) et je n'ai pas rencontré de problème, ou du moins, pas vraiment dans la gestion des collisions proprement dite. Juste une imprécision dont je tiens compte dans mon code. Et surtout, un décalage entre le moment de la collision et le son qui est sensé se produire à ce moment-là.

J'ai essayé ton DXSPRITE.PAS modifié, et je n'ai pas noté de changement perceptible dans le comportement du jeu.

Alors, si tu peux nous en dire plus... :)

japee
neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008
-
Salut... Je n'ai pas essayé ton code bien qu'il m'ai interessé car j'ai connu ce bug il y a quelques années et j'ai abandonné tout projet delphiX a cause de ça (pour passer à directX en c++)... Pour expliquer à japee le bug est un bug de collision sur les sprites de delphiX lorsque ceux-ci comporte plusieurs image (genre un vaisseau spatial qui tourne).
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
Merci pour tes explications, neodelphi, je comprends mieux le problème.

Moi aussi j'ai abandonné DelphiX qui m'a pas mal déçu.
Mon casse-brique est donc en stand-by.
Dommage, il était assez avancé, très jouable en tout cas...
Mais ce décalage entre le moment de la collision et le son... inacceptable.

Quand j'aurai le temps, j'irai voir du côté de DirectX...

Bonne prog'
neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008
-
En réalité après réflexion je me souvien que je ne suis pas passé directement à directX en c++ mais il existe autre chose que delphiX : ce sont les headers Delphi Jedi de directX, ça reprend en gros les headers que tu trouve pour le c++ mais cette fois ci pour delphi... Par contre c'est carément plus complexe que delphiX parceque delphiX est la pour simplifié un peu tout ! Mais en revanche ça marche très bien. Le seul inconvénient est le retard des headers jedi sur la version de directX, je ne suis pas sur que les headers pour directX soient terminés. En tout cas pour faire du directX sous delphi c'est il me semble ce qu'il y a de mieu.
ijcro
Messages postés
1
Date d'inscription
mercredi 26 janvier 2005
Statut
Membre
Dernière intervention
14 mars 2005
-
Ahoy
I try too repair DXSprite.pas, my code can be downloaded from turbo.gamedev.net and it is similar to presented code here.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.