AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory-Spiel OOP

Ein Thema von Jazzman_Marburg · begonnen am 26. Feb 2010 · letzter Beitrag vom 26. Feb 2010
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Memory-Spiel OOP

  Alt 26. Feb 2010, 17:58
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 18:04
Du erzeugst Dir da aber ein Speicherleck. Wie ist es so?Card.FImage.Assign(RueckBild);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 18:16
Hallo!

Zitat von DeddyH:
Du erzeugst Dir da aber ein Speicherleck. Wie ist es so?
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 18:37
Wo malst du FImage den auf die "Karte"?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#5

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 18:51
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 19:05
ja, das sehe ich. aber dann ist das ja lange noch nicht sichtbar. Es hängt bisher nur als Variable in deinem Objekt..
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#7

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 19:14
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#8

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 19:17
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.
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#9

Re: Memory-Spiel OOP

  Alt 26. Feb 2010, 19:40
Jepp -- das war wirklich dumm

Vielen Dank!

Schönen Abend!
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz