Transparent und TBitMap

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Dann is ja gut!
Die erste Umwandlung:
AssignBitmapToOpBitmap(tmp,b1);
Kannst du dir evtl auch sparen, indem du einfach OpBitmaps im Memory hältst anstatt Bitmaps. Wenn das nur Sprites sind und du nicht Canvas Methoden wie Textout für die Sprites brauchst, sollte das eigentlich kein Problem sein. Dann kannst du das Bild komplett mit OpBitmaps zusammenbauen und nur noch das Resultat vor dem Ausgeben umwandeln.
TOPBitmapCanvas.CopyRect findest du in opbitmap.pas, falls das ein Bug sein sollte, kannst du ihn gerne beheben. ;-)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Das Seltsame ist halt nur das ein Sprite bei der Position 0,0 nicht angezeigt wird, obwohl dort einer sein müsste...

Ich werde mal nach schauen...

Aber mir gefällt diese Lib immer besser... evlt. könntest du noch mehr "sachen" einbauen wie halt Effekte mit Licht und soweiter.....

Dann währe das eine Prima Sache,,,,

Aber ich verstehe einfach nicht warum meine Methode so langsam ist und die von Lazarus so schnell.... dabei verwenden wir beide zwei verschachelte Forschleife.... wo ist der Unterschied ?

an colors oder Pixels liegt es leider nicht... das habe ich ausprobiert... kann mir das jemand von euch erklären ?
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wiso Effekte und Licht ? Was hat das darin zu suchen ? Ich denke du wolltest ne Engine schreiben da gehört sowas rein aber doch nicht in ne Lib für Grafikformate.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wenn du meinst.... Den Fehler bei CopyRect kann ich nicht finden... aber es muss einen geben.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wiso nimmst du nicht einfach Draw wie ich es probiert hab.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ganz einfach: Weil der Hintergrund 640X400 Groß ist und der Sprite nur 20X20

Ich habe schon überlegt ein weiters Hilfs bitmap zu nehmen dort den Gewünschten teil rein kopieren, aber.... das wahre es das leider auch nicht.

Jetzt habe ich mit "bewegten" BIlder/Sprite Probleme, die werden nicht mehr gelöscht.... Schalte ich Trazparent aus geht es wie gewollt....
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Hä das versteh ich jetzt nicht.
Was hindert dich nun daran Draw zu nehmen ?

Und wozu brauchst du da n Hilfsbitmap ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

Das hört sich ja schon wieder ein wenig nach einer Tilemap für ein Spiel an. Nimm doch lieber SDL, das hat solche Sachen, an denen du da tagelang rumkaust, schon mit an Board.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nee, pluto schreibt seine eigene Engine is doch Quatsch was fertiges zu nehmen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

Ah, schon klar. Hätte ich mehr Zeit, würde ich wohl auch soviel Enthusiasmus aufbringen können, aber ich begnüg mich halt mal mit SDL.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@Christian ist mir klar das du das nicht verstehst. hast noch nie ein Spiel geschrieben wie ?
Ganz einfach:
Wenn ich draw nehmen würde, würde es mir die Gesammte Grafik kopieren aber ich brauche ja nur ein Teil von der Grafik.
Außerdem habe ich es Probiert, ist nicht die Lösung des Problems.

SDL würde ich gerne nehmen, wenn die Unterstützung besser währe und ich möchte halt kein extra Fenster haben.... ich möchte schon die VCL oder LCL nutzen.... Ich habe mir wie gesagt SDL angeschaut gefiel mir auch ganz gut, bis auf einige Punkte darum habe ich kein SDL genommen.
(Währe wirklich schön gewesen, wenn es was währe)
und es gibt sehr Wenig Hilfe dazu..... leider... die Meisten Tutorials die ich gefunden habe befassen sich nur mit einem Bruchteil der Möglichkeiten.... darum habe ich damit aufgehört.

Wenn ich SDL noch mal nehmen sollte, nur, wenn es eine bessere Hilfe gibt und eine Bessere Font unterstüzung, ich möchte nicht 1000 Variationen in einer Grafik Datei haben nur weil ich mal ein Buchstaben blau oder grün zeichnen möchte...

Evlt. ist SDL im Moment nur unter C++ am besten ausgereift.
Meine Engine ist ja im Prinzip so ähnlich: Sie Aktualisiert nur das was sich gerade Geändert hat.

edit01: Engine ist evlt. auch das Falsche Wort. Meine "Engine" hat im Moment nur eine Aufgabe: Sprite Zeichnen und das auf einen Grafischen Hintergrund.

Außerdem gibt es noch ein "paar" Collisions Funktionen die alle sehr einfach gehalten sind.

@Christian du hast dich doch letzten gewundert das hier so wenige Fragen gestellt werden oder ? Ich verrate dir Morgen den Grund dafür, fallst du da nicht selber Drauf kommst *G*
Die Antwort auf diese Frage, findest du beim Aufmerksamen Lesen dieses Threads :D

@theo
Es ist egal ob ich Draw oder CopyRect verwendet, die Linke Oberer Ecke wird einfach nicht gezeichnet. Das Tile hat die Position 0,0,20,20 also die Oberere Linke ecke. Die ist jetzt frei.

Wenn ich die Tranparent ausschalte dann wird sie Angezeigt.
Ich habe mir schon deine CopyRect Funktion angeschaut, konnte jedoch kein Fehler finden.

Ich finde deine lib aber Trozdem weiterhin ganz tool, nur hat das umwandeln stört und kostet auch zeit.... beim laden dauert es jetzt länger, Was ja auch klar ist. Aber ich frage mich immer noch warum meine Methode so langsam ist.... also die mit den zwei for schleifen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

@Christian ist mir klar das du das nicht verstehst. hast noch nie ein Spiel geschrieben wie ?
Doch ein paar, und die sind sogar fertig geworden ...
Ganz einfach:
Wenn ich draw nehmen würde, würde es mir die Gesammte Grafik kopieren aber ich brauche ja nur ein Teil von der Grafik.
Draw zeichnet eine Grafik in eine andere Grafik da wird also deine Sprite auf deinen Hintergrund gezeichne und das war wenn ich dich richtig verstehe genau das was du willst oder ?
Außerdem habe ich es Probiert, ist nicht die Lösung des Problems.
Aja, dann solltest du dein problem besser beschreiben dann kann dir vieleicht auch jemand mit ner konkreten lösung helfen und nicht seitenweise Ratespiele machen.
SDL würde ich gerne nehmen, wenn die Unterstützung besser währe und ich möchte halt kein extra Fenster haben....
Spielmenüs sind meisst in den Spielen eingebetet es macht schon sinn nur ein Fenster zu haben und das is das SDL fenster.
ich möchte schon die VCL oder LCL nutzen....


Dann verstehe ich nicht warum du nicht die Möglichkeiten der VCL/LCL auschöpfst und deren Zeichenmethoden nimmst, nämlich TCanvas.
und es gibt sehr Wenig Hilfe dazu..... leider... die Meisten Tutorials die ich gefunden habe befassen sich nur mit einem Bruchteil der Möglichkeiten.... darum habe ich damit aufgehört.
Dazu hast du ja den Quelltext und die meissen Funktionen erklären sich von selbst. Dazu bis du halt programmierer dafür das andere dir nicht vorbeten müssen wie du was zu tun hast.
Wenn ich SDL noch mal nehmen sollte, nur, wenn es eine bessere Hilfe gibt und eine Bessere Font unterstüzung, ich möchte nicht 1000 Variationen in einer Grafik Datei haben nur weil ich mal ein Buchstaben blau oder grün zeichnen möchte...
Wozu brauchst du denn 100 Varianten einer Grafikdatei, wenn du einen Buchstaben blau oder Grün zeichnen möchtest ? Ich weiss immer noch nicht was du für ein Problem hast.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wozu brauchst du denn 100 Varianten einer Grafikdatei, wenn du einen Buchstaben blau oder Grün zeichnen möchtest ?
Weil es für mich so aussieht das es keine Funktion gibt in SDL mit der ich Schnell ein "Buchstaben" einfärben kann
Dann verstehe ich nicht warum du nicht die Möglichkeiten der VCL/LCL auschöpfst und deren Zeichenmethoden nimmst, nämlich TCanvas.
Ein Spiel kann man nicht mit der LCL schreiben sondern nur die Menus und soweiter.
Aber das eigentliche Spiel sollte wegen der Geschwindigkeit in selber gezeichnet werden.
Spielmenüs sind meisst in den Spielen eingebetet es macht schon sinn nur ein Fenster zu haben und das is das SDL fenster.
Das gebe ich dir recht es gibt ja schon schon eine GUI für SDL. allerdings war das Demo bei mir bei 100% cpu last was für mich einfach zuviel ist.

Aja, dann solltest du dein problem besser beschreiben dann kann dir vieleicht auch jemand mit ner konkreten lösung helfen und nicht seitenweise Ratespiele machen
Was gibt es an der Beschreibung des Problems nicht zu verstehen ?
Die Linke oberer Ecke wird nicht gezeichnet. Weiter nix. der Rest geht soweit. bis auf einige Fehler aber die muss ich alleine lösen, weil die nicht in diesen Thread gehören.

Draw zeichnet eine Grafik in eine andere Grafik da wird also deine Sprite auf deinen Hintergrund gezeichne und das war wenn ich dich richtig verstehe genau das was du willst oder ?
Im Prinzip schon, aber wie gesagt, die Lösung war es nicht. Ich glaube da habe ich dich Falsch verstanden.
Doch ein paar, und die sind sogar fertig geworden ...
Toll, womit und welche ? 2D oder 3D ?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ES GEHT JETZT, DIE LINKE OBERER ECKE WIRD GEZEICHNET ICH BIN AUF draw ausgewichen und habe eine Hilfst Bitmap genommen. Damit geht es Prima.

Warum copyrect nicht geht, weiß ich nicht....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@Christian
Du hattest recht, jetzt in der Neuen Lazarus Version gibt es eine Transparentmode Funktion die auch klappt... bei der älteren, konnte ich den Transparentmode nicht einstellen dann kam immer ein Fehler.

@theo
Deine OpBitmap ist ja wie ich immer sage gar nicht mal so schlecht, nur Dauert deine Methode dafür einfach zu lange... Ich habe gestern alles "Deaktiviert" was damit zu tun hatte.. und siehe da das Level für Pacman war sofort geladen.... seit dem nutze ich die Methode von Lazarus....

Code: Alles auswählen

tmp3:=TBitmap.Create;
  tmp:=TBitMap.Create;
  tmp2:=TBitMap.Create;
  b1:=TCanvasOPBitmap.Create;
 b2:=TCanvasOPBitmap.Create;
diese ganzen Variablen mussten Installisiert werden, das dauert bei 31*10 Objekten halt seine Zeit... Evlt könnte man das noch Optimieren...

auf jeden Fall ging es dann so weiter:

Code: Alles auswählen

tmp.Width:=Width; tmp.Height:=Height;
      tmp2.Width:=tmp.Width; tmp2.Height:=tmp.Height;
      tmp3.Width:=tmp.Width; tmp3.Height:=tmp.Height;
      tmp.Canvas.Draw(0,0,SpriteImage);
      AssignBitmapToOpBitmap(tmp,b1);
das Eigentliche zeichnen:

Code: Alles auswählen

....
    if (SpriteImage <> NIL) and (visible) then begin
      Buffer.canvas.Draw(left,top,SpriteImage);
//      BitBlt(Buffer.Canvas.Handle,left,top,Width,Height,SpriteImage.Canvas.Handle,0,0,SRCCOPY);
 
  //    Buffer.Canvas.Draw(left,top,SpriteImage);
      if NewDraw then
        OutCanvas.Draw(left,top,SpriteImage);
    end;
//  end;
  else begin
    if (visible) then begin
      if (not onlyTranzparent) or ((onlyTranzparent) and (ot)) then begin
        ot:=False;
  //      DrawTrazparent(NewDraw);
      end
      else begin
    //    BitBlt(Buffer.Canvas.Handle,left,top,Width,Height,tmp2.Canvas.Handle,0,0,SRCCOPY);
     //   OutCanvas.Draw(left,top,tmp2);
      end;
    end;
  end; 
 
procedure TPluto2DSprite.DrawTrazparent(const NewDraw:Boolean = True);
var
  r1,r2:TRect;
begin
  r1:=rect(0,0,Width,Height);
  r2:=rect(left,top,Width,Height);
 
  BitBlt(tmp3.canvas.Handle,0,0,Width,Height,Buffer.canvas.Handle,left,top,SRCCOPY);
  AssignBitmapToOpBitmap(tmp3,b2);
 
  b2.Canvas.Draw(0,0,b1);
 
  b1.TransparentColor:=clwhite;
  AssignOpBitmapToBitmap(b1,tmp2);
 
  buffer.canvas.Draw(left,top,tmp2);
//  if (left = 0) and (top = 0) then b1.SaveToFile('/media/hda7/hallopluto.png');
  if NewDraw then OutCanvas.Draw(left,top,tmp2);
end;
SpriteImage ist nur ein Pointer auf ein Eintrag in einer eigenen ImageList

Evlt kann man hier einiges nur einmal machen, aber naja... ich werde gleich alles was damit zu tuen hat entfernen. Ich finde aber immer noch die LIb nicht schlecht... halt für diese Aufgabe ungeeignet.... oder ich habe es Falsch verstanden.
MFG
Michael Springwald

Antworten