Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Benutzerdefinierte Spritefarben (https://www.delphipraxis.net/94228-benutzerdefinierte-spritefarben.html)

Neutral General 18. Jun 2007 14:43


Benutzerdefinierte Spritefarben
 
Hi,

Wusste leider keinen besseren Namen für meine Frage. Ich würde gerne Sprites haben die pratkisch von Natur aus komplett weiß sind (also schon mit schwarzen Konturen) und der Benutzer soll die Farben für einzelne Fläschen des Sprites selbst auswählen dürfen (z.B. aus einem Colordialog oder so). Wie macht man sowas? Ich würde dann die Andorra Engine benutzen.

Gruß
Neutral General

Khabarakh 18. Jun 2007 15:03

Re: Benutzerdefinierte Spritefarben
 
Sind diese zu füllenden Flächen einfarbig oder Gradienten? Je nachdem musst du diese Farben im Original-Bitmap mit einer/m einzigartigen Farbe bzw. Farbbereich füllen, die/den du dann im Spiel einfach durch die wirkliche Farbe ersetzen kannst.
Ein Beispiel ist immer gut bei solchen Fragen ;) . Ich gebe mal ein Gegenbeispiel: Das Hemd des Clonks ist eigentlich ein clFuchsia-Verlauf (die berühmtberüchtigte Farbe ;) ) und wird zur Laufzeit dann durch die vom Spieler gewählte Farbe ersetzt (hier hellblau).

Neutral General 18. Jun 2007 15:07

Re: Benutzerdefinierte Spritefarben
 
Mhh ja also das Prinzip ist mir schon so klar aber wie mach ich das in der Praxis? Also früher sind meine Versuche auf Sprites zu malen immer fehlgeschlagen...

Khabarakh 18. Jun 2007 15:22

Re: Benutzerdefinierte Spritefarben
 
Da du meinem Beispiel nicht widersprochen hast, werde ich dieses weiterführen: Das Mittel zum Ziel heißt wie immer in der Informatik Mathematik. Wir suchen ja nichts Anderes als eine Abbildung, eine Funktion, die einen (RGB-)Vektor auf einen anderen abbildet.
Da ich gerade festgestellt habe, dass die Clonkvorlage in blau ist :stupid: , wollen wir also den Bereich #0000ff...#000000 auf #rrggbb...#000000 abbilden. Soll heißen, der Benutzer wählt eine Farbe c, der Blauton im Originalbild gibt dann vor, in welcher Helligkeit diese Farbe eingefügt wird (256 mögliche Schattierungen). Die Farbe des Pixels mit dem originalen Blauwert x ist dann c * x / 255.

Neutral General 18. Jun 2007 15:33

Re: Benutzerdefinierte Spritefarben
 
Mhh jaaaa aber ich meine wie ich das praktisch programmiere.. Die Theorie bekomm ich denke ich mal auch hin aber wie färbe ich eine Fläche eines Sprites?

Khabarakh 18. Jun 2007 15:50

Re: Benutzerdefinierte Spritefarben
 
Unter DirectX holst du dir die Surface der Textur, von dieser kannst du dann einen Speicherbereich sperren lassen und beschreiben. Wie genau das zu programmieren ist, hängt natürlich von der API ab.

Neutral General 18. Jun 2007 15:51

Re: Benutzerdefinierte Spritefarben
 
Ja wie gesagt ich wollte Andorra2D benutzen...

igel457 18. Jun 2007 16:26

Re: Benutzerdefinierte Spritefarben
 
Wie wäre es mit...
Delphi-Quellcode:
Image.Color := clWasAuchImmer;

Neutral General 18. Jun 2007 16:38

Re: Benutzerdefinierte Spritefarben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Grml...

Schau(t) mal im Anhang.. Bei dem "Sprite" soll der Benutzer z.B. die Farbe der Hose bestimmen können und die Farbe des Pullovers und die Farbe des Motivs und die Hautfarbe,etc... @Igel.. Kann man in dem einen Spiel von dir nicht auch sowas einstellen?

Gruß
Neutral General

igel457 18. Jun 2007 16:43

Re: Benutzerdefinierte Spritefarben
 
Ja, das kann man. Du musst die Sprites halt "vorrendern". Ich habe das so gemacht:

Delphi-Quellcode:
//Produces the Image (with hair color etc...)
procedure TCharacter.ProduceImage;
var x,y:integer;
    abmp:TBitmap;
    col,ncol:TColor;
    r,g,b:byte;

    //Makes a color daker
    function DarkColor(acolor:TColor;value:integer):TColor;
    var r,g,b:byte;
    begin
      r := cut(getrvalue(acolor)-value);
      g := cut(getgvalue(acolor)-value);
      b := cut(getbvalue(acolor)-value);
      result := rgb(r,g,b);
    end;
begin

  //Create Bitmap
  abmp := TBitmap.Create;
  abmp.PixelFormat := pf24Bit;

  //Get the Oringinals Bitmap (TFigurImage)
  original.GetAsBitmap(abmp);

  { TODO -oAll -cCode : Scanline }
  for x := 0 to abmp.Width-1 do
  begin
    for y := 0 to abmp.Height-1 do
    begin
      col := abmp.Canvas.Pixels[x,y];
      r := getrvalue(col);
      g := getgvalue(col);
      b := getbvalue(col);
      //Skin color. In the originals Bitmap the skin colors RGB Values are all the same --> gray/white
      if (r=g) and (r=b) then
      begin
        ncol := darkcolor(skincolor,255-r);
        abmp.Canvas.Pixels[x,y] := ncol;
      end;

      //Cloths color. In the originals Bitmap the clothes color is red (GB are not set)
      if (g=0) and (b=0) then
      begin
        ncol := darkcolor(clothescolor,255-r);
        abmp.Canvas.Pixels[x,y] := ncol;
      end;

      //Hair color. In the originals Bitmap the clothes color is yellow (B is not set) R and B is the same.
      if (b=0) and (r=g) then
      begin
        ncol := darkcolor(haircolor,255-r);
        abmp.Canvas.Pixels[x,y] := ncol;
      end;
    end;
  end;

  //Assing the new bitmap to the buffer
  figurimage.Assign(abmp);

  figurimage.transparentcolor := clFuchsia;
  figurimage.transparent := true;


  //Free all things
  abmp.Free;
end;

Khabarakh 18. Jun 2007 17:11

Re: Benutzerdefinierte Spritefarben
 
Zitat:

Zitat von Neutral General
Schau(t) mal im Anhang..

Bei einem so einfachen Bild (also doch kein Gradient :roll: ) würde ich einfach ein paar Punkte für FloodFill definieren, kürzer gehts nimmer.

Neutral General 18. Jun 2007 17:31

Re: Benutzerdefinierte Spritefarben
 
Hi,

Du hast das ganze jetzt auf ein Bitmap gemalt. Und was machst du dann? Das Bitmap direkt in Sprite.Image laden oder in die ImageList?

igel457 18. Jun 2007 17:43

Re: Benutzerdefinierte Spritefarben
 
Dann lade ich das ganze in ein TAdBitmap und dieses übergebe ich über Texture.Texture.LoadFromBitmap in einen neuen Eintrag einer ImageListe den ich dem Sprite zuweise. Du kannst natürlich auch ein schon bestehendes Bild bearbeiten.

Neutral General 19. Jun 2007 11:08

Re: Benutzerdefinierte Spritefarben
 
Hi,

Ok thx. Noch eine Frage: Was ist denn cut(..) für eine Funktion? Muss ich da eine Unit einbinden oder hast du cut(..) selbst geschrieben?

Gruß
Neutral General

igel457 19. Jun 2007 13:08

Re: Benutzerdefinierte Spritefarben
 
Cut verhindert, dass es einen Byteüberlauf gibt. Also

[delphi]
function cut(v:integer):byte;
begin
result := v;
if v < 0 then
result := 0
else
if v > 255 then v := 255;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz