Correction d'un bug collision dans dxsprite.pas

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

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.