Announcement

Collapse
No announcement yet.

Problem beim neuzeichnen von überlappenden, transparenten Images

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim neuzeichnen von überlappenden, transparenten Images

    Hallo, ich experimentiere gerade zum erstenmal mit isometrischer Grafik herum.

    Bisher habe ich eine Prozedur die 150 transparente, sich überlappende Bilder erstellt und aus einer Bilderliste füllt (Bilder sind 46*92).
    Das klappt auch, Quelltext siehe unten, wobei ich mich frage ob man die Bilder vielleicht irgendwie in ein Bild oder Container füllen könnte um die Erzeugung zu beschleunigen.

    Bild nach drücken der Starttaste:

    http://schaak.dyndns.info/pics/iso1.jpg


    Wenn ich jetzt einen der Scrollbuttons drücke, werden die Grafiken wieder neu aus der Bilderliste gefüllt, die Werte der Grafik kommt erstmal provisorisch aus einer Stringliste.
    Erst passierte gar nichts, nachdem ich image.refresh mit eingebaut habe, klappt es, aber die Bilder sind "kaputt".

    Bild nach scrollen:
    http://schaak.dyndns.info/pics/iso2.jpg


    Irgendwie bleiben die Kronen der Bäume im transparenten Teil stehen, während die neuen Bäume von den den anderentiles überdeckt werden.
    Habe die Bilder jetzt testweise von links oben nach rechts unten und andersrum gefüllt.

    Quelltext für ru nach lo:
    Code:
    function TForm1.test(weg: String):Boolean;
    var
      i,x,xa,y,bild,bildart,zaehler: Integer;
    begin
    
    x  := strtoint(lbl_xwert.Caption);
    y  := strtoint(lbl_ywert.Caption);
    xa := x;
    bild := 150;
    zaehler :=1;
    
    lbl_test.caption := weg; // Test
    
      for i := 1 to 150 do begin
    
        bildart := strtoint(copy(zeichenk[y],xa,1));
        ImageList1.GetBitmap(bildart,img[bild].picture.bitmap);
        dec(xa,1);
        dec(bild,1);
        inc(zaehler,1);
          if zaehler = 11 then
          begin
          zaehler := 1;
          dec(y,1);
          xa := x;
          end;
        img[bild].Refresh;
    
      end;
    end;
    Quelltext für die Ersterstellung:
    Code:
    procedure TForm1.KarteZeichnen;
    var i,x,xa,y,count1,count2,zeile : Integer;
    begin
    
    // Testmap in Stringliste einlesen
    zeichenk := TStringList.Create;
    zeichenk.LoadFromFile('test.map');
    // Ende
    
    x  := -38;
    xa := -38;
    y  := -15;
    count1 := 1;
    count2 := 1;
    zeile := 0;
    
    for i := 1 to 150 do
    begin
    img[i] := TImage.Create(Form1.Panel1);
    img[i].Name := 'img'+inttostr(i); // Test
    img[i].Transparent := True;
    img[i].Parent := Form1.Panel1;
      if count1 < 11 then begin
      xa := xa+46;
      end
      else begin
      inc(count2, 1);
      if count2=3 then count2:=1;
      xa := x+46+(count2*23-23);
      y := y+23;
      count1 := 1;
      inc(zeile, 1);
      end;
    img[i].Top := y;
    img[i].Left := xa;
    img[i].AutoSize := True;
    ImageList1.GetBitmap(strtoint(copy(zeichenk[zeile],count1,1)),img[i].picture.Bitmap);
    inc(count1, 1);
    end;
    
    end;
    Zuletzt editiert von schaak; 21.01.2008, 21:24.

  • #2
    Naja, hab das Problem jetzt gelöst, indem ich die Bilder mit .free gelöscht(?) habe und nochmal komplett neu anlege.

    Flackert ganz schön, hat jemand eine bessere Lösung?
    Muß doch irgendwie anders gehen.
    Kann man beim Programmstart irgendwie alle Bilder in ein großes mit scrollbalken zeichnen?

    Code:
    spalte  := strtoint(lbl_xwert.Caption);
    zeile  := strtoint(lbl_ywert.Caption);
    zaehler := 1;
    x := 8;
    y := 0;
    xa := x;
    versch := 1;
    
    for i := 1 to 150 do begin
    
      img[i].Free;
      img[i] := TImage.Create(Form1.Panel1);
      img[i].Parent := Form1.Panel1;
      img[i].Transparent := True;
      img[i].AutoSize := True;
      img[i].Top := y;
      img[i].Left := xa;
    
      bild := strtoint(copy(zeichenk[zeile],spalte,1));
      ImageList1.GetBitmap(bild,img[i].picture.bitmap);
    
      inc(xa,46);
      inc(zaehler,1);
      inc(spalte,1);
        if zaehler = 11 then
        begin
          if versch = 1 then versch := 2 else versch := 1;
          zaehler := 1;
          inc(y,23);
          xa := x+versch*23-23;
          inc(zeile,1);
          spalte := strtoint(lbl_xwert.Caption);
        end;
    
    end;

    Comment

    Working...
    X