Autor Beitrag
.50AE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 04.12.06 20:43 
Seh ich es richtig, dass die TPaintBox keine Transparenz unterstützt?

50ae
P_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51

Win XP
Delphi 2005 PE
BeitragVerfasst: So 10.12.06 22:13 
ausblenden 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;          // muss true sein, sonst passiert nix
  image1.Picture.Bitmap.TransparentColor := clLime;    // die transparente farbe
  paintbox1.Canvas.Draw(0, 0, image1.Picture.Bitmap);           // gibt das Bild aus
end;


wenn du keine farbe angibst, wird der pixel ganz links unten als transparenter pixel verwendet (wenn TransparentMode = tmAuto).
.50AE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 11.12.06 14:03 
Hoi,

Die transparente Farbe hatte ich schon angegeben.

Ich poste meinen Code mal hier rein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
//tix,tiy,fx,fy sind koordinaten/feldnummern
//bmpOffset ist ein TBitmap
//pb_eWorld ist eine Paintbox (auf der die Welt abgebildet werden soll
//icurrenttile ist ein TImage in dem das ausgewählte Bild gezeigt wird

//Diese Zeilen werden bei einem Klick auf die Spielfläche ausgeführt
{BItBlt(bmpOffset.Canvas.Handle, tix*24,tiy*24,24,24,
           iPicktiles.Canvas.Handle,fx,(fy-1)*24,SRCCOPY);}

bmpoffset.Canvas.Draw(tix*24,tiy*24,icurrenttile.Picture.Bitmap); 
  //BitBlt und Draw liefert das gleiche Ergebnis
bmpOffset.Transparent := true;
bmpOffset.TransparentColor := clfuchsia;

//Das folgt in der OnClick prozedur nach dem Aufruf obigen Codes
BitBlt(pb_eworld.Canvas.Handle, 0,0,pb_eWorld.Width,pb_eworld.Height,
           bmpOffset.Canvas.Handle,0,0,SRCCOPY);
//pb_eworld.Refresh;
//Nach einem refresh ist alles transparent, anders nichts..


MfG
50ae
P_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: 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:
ausblenden 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