Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Memory-Spiel OOP (https://www.delphipraxis.net/148289-memory-spiel-oop.html)

Jazzman_Marburg 26. Feb 2010 17:58


Memory-Spiel OOP
 
Hallo Gemeinde,
mich plagt gerade folgendes Problem:
Ich schreibe ein Memory-Spiel, und dazu habe ich eine Klasse TSpielKarte und eine Container-Klasse, die die Verwaltung der Karten übernimmt und so das Spielfeld als Objekt darstellt (TSpielfeld).
Nun möchte ich, dass jede Karte ein Rückenbild anzeigt (beim Klicken dann das Bild dessen Zwilling ja gesucht werden soll). Dazu überreiche ich im CREATE des Spielfeldes eine ImageList, die alle Bilder enthält.
Das Spielfeld initialisiert (created) nun alle benötigten Spielkarten -- und soll z.B. das erste Bild in der ImageListe als Rücken-Bild für alls Spielkarten verwenden.

Der Spielkarten-Konstruktor sieht so aus:
Delphi-Quellcode:
constructor TSpielKarte.Create(Owner: TComponent);
begin
  inherited Create(Owner);
  Self.OnClick := Click;

  FImage := TBitmap.create;
  FImage.Width := 100;
  FImage.Height := 100;

end;
Die Initialisierung der Spielkarten erfolgt der Klasse Spielfeld etwa so:
Delphi-Quellcode:
  RueckBild := TBitmap.Create;
  FBilderliste.GetBitmap(3, RueckBild);

  for i := 0 to FCounTSpielKartes - 1 do
  begin
    Card := TSpielKarte.Create(nil);
    Card.Parent := FParent;
    Card.Height := 102;
    Card.Width := 102;
    Card.FImage := RueckBild;
    ...
Nun sehe ich aber kein "RueckBild" auf der Karte. D.h. ich habe irgendwas mit dem Card.FImage vermurkst. Nur was?
Ich dachte zunächst, dass FImage ein Parent bräuchte -- ist aber wohl Unsinn.

Jede Spielkarte soll halt die Möglichkeit haben ein Bild vom Typ TBitmap anzuzeigen. Da ich später vielleicht auch Text auf der Spielkarte anzeigen wollte, habe ich mich dagegen entschieden, einfach 20 TBitmaps als Spielkarten zu verwenden.

Dankbar für jede Idee/Kommentar.
Gruß
Jazzman

DeddyH 26. Feb 2010 18:04

Re: Memory-Spiel OOP
 
Du erzeugst Dir da aber ein Speicherleck. Wie ist es so?
Delphi-Quellcode:
Card.FImage.Assign(RueckBild);

Jazzman_Marburg 26. Feb 2010 18:16

Re: Memory-Spiel OOP
 
Hallo!

Zitat:

Zitat von DeddyH
Du erzeugst Dir da aber ein Speicherleck. Wie ist es so?
Delphi-Quellcode:
Card.FImage.Assign(RueckBild);

Das ist zwar auch nett -- aber ich sehe immer noch kein Bild!
Ist denn der Rest ok?
Ich habe gerade überprüft, ob die übergebene ImageList (mit Bildchen gefüllt) im Spielfeld auch ankommt: Ja.

Delphi-Quellcode:
constructor TSpielFeld.Create(...; BilderListe: TImageList);
begin
  inherited Create;
  Randomize;
  FBilderliste := BilderListe; // FBilderliste.Count = 20. Also war die Übergabe sowiet ok
  IniTSpielFeld;
...
Irgendwo ist da der Wurm drin...

Danke & Gruß
Jazzman

daywalker9 26. Feb 2010 18:37

Re: Memory-Spiel OOP
 
Wo malst du FImage den auf die "Karte"?

Jazzman_Marburg 26. Feb 2010 18:51

Re: Memory-Spiel OOP
 
Zitat:

Zitat von daywalker9
Wo malst du FImage den auf die "Karte"?

Naja, ich dachte an der Stelle, wo die Spielkarte erzeugt wird, übergebe ich FImage das "Rueckbild":

Delphi-Quellcode:
  // SpielFeld wird created und danach werden die Spielkarten erzeugt...
  RueckBild := TBitmap.Create;
  FBilderliste.GetBitmap(3, RueckBild);

  for i := 0 to FCounTSpielKartes - 1 do
  begin
    Card := TSpielKarte.Create(nil);
    Card.Parent := FParent;
    Card.Height := 102;
    Card.Width := 102;
    Card.FImage := RueckBild; // Hier übergebe ich ein Bitmap an das FImage, das war es.
    ...
Jazzman

daywalker9 26. Feb 2010 19:05

Re: Memory-Spiel OOP
 
ja, das sehe ich. aber dann ist das ja lange noch nicht sichtbar. Es hängt bisher nur als Variable in deinem Objekt..

Jazzman_Marburg 26. Feb 2010 19:14

Re: Memory-Spiel OOP
 
Zitat:

Zitat von daywalker9
ja, das sehe ich. aber dann ist das ja lange noch nicht sichtbar. Es hängt bisher nur als Variable in deinem Objekt..

Ich kann nur ahnen was Du sagen möchtest, dewegen habe ich mal folgendes ausprobiert:

Delphi-Quellcode:
    Card.FImage := RueckBild;
    Card.Canvas.Draw(0, 0, Card.FImage);
(Gleiche Stelle wie oben).
Aber weder sehe ich nun etwas, noch macht "Card.Canvas.Draw(0, 0, Card.FImage);" irgendwie einen Sinn auf mich. Das FImage hat ja kein Parent, also dachte ich, wenn ich dem FImage ein Bitmap übergebe, würde es automatisch gezeigt...

Bin verwirrt.

Gruß
Jazzman

daywalker9 26. Feb 2010 19:17

Re: Memory-Spiel OOP
 
Eine Bitmap selber hat keinen Parent. Es ist ja "nur" ein Bild. Um das Bild anzuzeigen musst du entweder direkt auf dem Canvas machen oder benutzt ein "TImage". Dies kann auch Bitmaps anzeigen.

Jazzman_Marburg 26. Feb 2010 19:40

Re: Memory-Spiel OOP
 
Jepp -- das war wirklich dumm :oops:

Vielen Dank!

Schönen Abend!
Jazzman


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

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