Delphi-PRAXiS
Seite 1 von 2  1 2      

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 Uhr.
Seite 1 von 2  1 2      

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