| Autor |
Beitrag |
.50AE
      
Beiträge: 100
|
Verfasst: Mo 04.12.06 19:36
Hiho!
Ich weiß jetzt schon ziemlich genau wie ich alles in meinem kommenden 2D Spiel regeln will.
Allerdings gibt es noch ein paar Probleme mit dem Aufbau des Leveleditors.
Folgendes:
Man hat im unteren Bereich eine Palette mit den verfügbaren Teiltexturen.
Diese sollen nun im oberen Bereich (Spielfeld) auftragbar sein..
Bisher habe ich eine TImage Komponente, die so groß ist wie das komplette spätere Spielfeld einmal sein soll. (Also 4800*2400 pixel)
Auf dieses TImage werden nun alle teile "gemalt".
D.h. ich überprüfe welches Teil ausgewählt ist und platziere dessen Textur auf der TImage Komponente. (mit Hilfe von BitBlt)
1. Problem
Der Vorgang dauert aber relativ lang, vorallem wenn man die "Pinsel"größe auf 9 Felder erhöht..
Wenn ich das TImage kleiner mache geht es auch nicht schneller (wäre auch unlogisch, aber ein Versuch ist es immer Wert..)
2. Problem
Die Transparente Farbe der Felder soll Pink (clFuchsia/FF00FF) sein.
Wenn ich aber ein Teil auf das TImage zeichne, wird alles bisher unbezeichnete weiß.
Also erstelle ich bei FormShow ein TImage-Großes Pinkes Rechteck.. Was auch geht.
Wenn ich jetzt aber ein Teil darauf zeichne ist es ebenfalls unsichtbar?!
(Das gleiche hab ich bei der Teilpalette bemerkt. Auf die werden auch Teiltexturen so gezeichnet, und davor wurde ein "transparentes" Rechteckt erstellt. Wenn ich jetzt aber wieder einen "unsichtbaren" Teil aus der Tomponente in eine andere kopiere wird der Bereich in dieser 2. Komponente "sichtbar")
Danke für eure Hilfe
50ae
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 04.12.06 19:52
Ein TImage ist extrem Speicherintensiv. Benutze zum Zeichnen eine TPaintBox.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
.50AE 
      
Beiträge: 100
|
Verfasst: Mo 04.12.06 20:43
Seh ich es richtig, dass die TPaintBox keine Transparenz unterstützt?
50ae
|
|
P_G
      
Beiträge: 75
Win XP
Delphi 7 / 8 Enterprise
|
Verfasst: Di 05.12.06 15:18
Hi,
es geht tatsächlich schneller, wenn du mit einem Offset-Bitmap arbeitest, welches du per BitBLT auf eine Paintbox zeichnest.
Transparenz erreichst du, indem du deine Texturen jeweils als TBitmap definierst. Jetzt setzt du die Eigenschaft 'TransparentColor' des Bitmaps auf clFuchsia und die Eigenschaft 'Transparent' auf True. Dann zeichnest du die Textur auf dein Offset-Bitmap (von mir aus mit 'OffsetBitmap.Canvas.Draw').
Gruß,
P_G
|
|
.50AE 
      
Beiträge: 100
|
Verfasst: Mi 06.12.06 17:50
Tag.
Es geht jetzt tatsächlich sehr schnell P_G, aber so ganz funktionieren tut's nicht..
1. Die Texturen auf der Paintbox sind nicht transparent (obwohl ichs eingestellt hab; sowohl bei den Texturen-Bitmaps selbst als auch bei dem OffsetBmp)
2. Der Bereich auf den noch keine Teile gemalt wurden ist weiß nach platzierung des 1. Teils.
Wenn ich nun Refresh oder Repaint der Pantbox aufrufe ist sie komplett transparent..
Ich kopiere die Einzeltexturen per BItBlt auf das OffsetBmp und dann dieses per BitBlt auf die paintbox.
MfG
50ae
|
|
monster
      
Beiträge: 51
Win XP
Delphi 2005 PE
|
Verfasst: So 10.12.06 22:13
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.PaintBox1Paint(Sender: TObject); begin paintbox1.canvas.brush.Color := clNavy; paintbox1.Canvas.fillrect(rect(0, 0, clientWidth, clientHeight));
image1.Transparent := true; image1.Picture.Bitmap.TransparentColor := clLime; paintbox1.Canvas.Draw(0, 0, image1.Picture.Bitmap); end; |
wenn du keine farbe angibst, wird der pixel ganz links unten als transparenter pixel verwendet (wenn TransparentMode = tmAuto).
|
|
.50AE 
      
Beiträge: 100
|
Verfasst: Mo 11.12.06 14:03
Hoi,
Die transparente Farbe hatte ich schon angegeben.
Ich poste meinen Code mal hier rein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
|
bmpoffset.Canvas.Draw(tix*24,tiy*24,icurrenttile.Picture.Bitmap); bmpOffset.Transparent := true; bmpOffset.TransparentColor := clfuchsia;
BitBlt(pb_eworld.Canvas.Handle, 0,0,pb_eWorld.Width,pb_eworld.Height, bmpOffset.Canvas.Handle,0,0,SRCCOPY); |
MfG
50ae
|
|
P_G
      
Beiträge: 75
Win XP
Delphi 7 / 8 Enterprise
|
Verfasst: Mo 11.12.06 15:37
Hi .050AE,
du hast was mißverstanden. Die Transparenz wird angewandt auf die gekachelte Textur. In deinem Fall 'icurrenttile.Picture.Bitmap', und zwar bevor du die Textur auf das OffsetBmp zeichnest.
Gruß,
P_G
|
|
.50AE 
      
Beiträge: 100
|
Verfasst: Mo 11.12.06 17:53
Abend,
die Textur die aufgetragen wird ist jetzt transparent.
Aaaaber..
Der bereich auf den noch nichts aufgetragen wurde ist weiß (oder wenn ich ein pinkes Rechteck reinzeichne um erstmal den ganzen bereich transparent zu machen pink..)
wenn ich nun refreshe wird ALLES, also auch bereits gezeichnetes, transparent/unsichtbar.
Schade dass es mit einem Image so lange dauert, da ging alles reibungslos :'(
MfG
50ae
|
|
P_G
      
Beiträge: 75
Win XP
Delphi 7 / 8 Enterprise
|
Verfasst: Di 12.12.06 10:45
Hi,
bin nicht sicher, ob ich dich verstehe...
1. Nimm auf jeden Fall OffsetBmp.Transparent := True aus deinem Code, wenn noch nicht geschehen.
2. Färbe das OffsetBmp gleich zu Beginn ein, wenn unbemalte Flächen nicht weiß sein sollen.
Gruß,
P_G
|
|
.50AE 
      
Beiträge: 100
|
Verfasst: Fr 22.12.06 13:47
Hi,
Es funktioniert inzwischen. Allerdings genauso schnell, wie wenn ich ein TImage benutzt hätte..
Ich kopiere das OffsetBmp momentan so auf die Paintbox:
Delphi-Quelltext 1:
| pb_eworld.Canvas.Draw(0,0,bmpOffset); |
Wenn ich es mit BitBlt mache, geht es wesentlich schneller, allerdings hat die PaintBox dann wieder keine Transparenz...
Wenn ich die Paintbox auf eine Größe von etwa 600x300 setze (statt 4800x2400) geht der Draw vorgang schon schneller, allerdings immernoch zu langsam um flüssig arbeiten zu können.
Wie kann ich das Problem lösen?
MfG
50ae
|
|