Kartenspiel

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben: Habe das jetzt versucht, die TMoveBitmap besitzt die Werte , diese Klasse füge ich dann in eine ObjectList ein aber die Liste enthält dann keine Werte wie zB. fLeft usw ,
was habe ich falsch gemacht?^^
Wahrscheinlich hast du das Typecasting vergessen.
Die Liste hält ja nur Pointer auf TObjects
Du musst beim auslesen definieren, was das nun eigentlich für ein Typ ist.
Also z.B.

TMoveBitmap(fListe).fLeft:=200;

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Habe dieses Tutorial nachgemacht: http://www.delphipages.com/tips/thread.cfm?ID=182" onclick="window.open(this.href);return false;
Umgeschrieben und daraus wurde dieser Code^^

Code: Alles auswählen

TCard = class
  private
    fLeft:Integer;
    fTop: Integer;
    fRight: Integer;
    fBottom: Integer;
    fBitmap:TBitmap;
  public
  constructor create(Bitmap : TBitmap);
   property Left: Integer read fLeft write fLeft;
   property Top: Integer read fTop write fTop;
   property Right: Integer read fRight write fRight;
   property Bottom: Integer read fBottom write fBottom;
   property Bitmap: TBitmap read fBitmap write fBitmap;
  end;
  // define the list
  TCardList = class(TList)
  private
         function GetItem(AIndex: Integer): TCard;
  public
   constructor create;
   destructor Destroy; override;
   function add(Card:TCard): integer;
   property Items[AIndex: Integer] : TCard read getitem;
  end;
 
{...}
constructor TCard.create(Bitmap : TBitmap);
begin
    fBitmap:=Bitmap;
end;
 
constructor TCardlist.create;
begin
   inherited Create;
end;
 
 
destructor TCardList.Destroy;
begin
     try
        Clear;
     Finally
        inherited Destroy;
     end;
end;
 
 
function TCardlist.add(Card: TCard): integer;
begin
result := inherited Add(Card);
end;
 
function TCardList.GetItem(AIndex: integer): TCard;
var
   tempCard : TCard;
begin
   {tempCard := Items[AIndex];
   tempCard.Right := tempCard.Left + tempCard.Bitmap.Width;
   tempCard.Bottom := tempCard.Top + tempCard.Bitmap.He;}
   result := TCard( inherited Items[ AIndex ] );
end;
Die Funktion add Funktioniert einwandfrei nur wenn ich das versuche

Code: Alles auswählen

Kartenliste.Items[i].Left := temp; //Integer
     Kartenliste.Items[i].Top := 3;
bekomme ich einen: "EXTERNAL: SIGSEGV"- Error
Also muss wohl was bei "GetItem" falsch sein , glaube ich

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das zeigt wahrscheinlich den fehlerhaften Code nicht.
Tust du die Cards auch "createn" bevor du sie "addest"?

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Code: Alles auswählen

Kartenliste := TCardList.Create;
  inherited Create(AOwner);
  for i := 1 to 36 do
  begin
     fBilder[i] := TBitmap.Create;
     fBilder[i].Width:=100;
     fBilder[i].Height:=Form1.Panel1.Height-2;
     fBilder[i].Canvas.Color := clWhite;
     {fBilder[i].Canvas.Brush.Color:=clwhite;
     fBilder[i].Canvas.FillRect(BoundsRect);}
     fBilder[i].Canvas.FillRect(2,2,fBilder[i].Width-2,fBilder[i].Height-2);
     fBilder[i].Canvas.TextOut(3,3,KartenFarbe(i)+' '+KartenWert(i));
     temp.create(fBilder[i]);
     Kartenliste.Add(temp);
  end;
Jop das mache ich wohl ;)

kann es daran liegen das die Items[AIndex] nur auslesen kann aber nicht schreiben?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das ist Schrott:
temp.create(fBilder);
Kartenliste.Add(temp);

Kompiliert das überhaupt?

temp:=TCard.Create(....

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

theo hat geschrieben:Das ist Schrott:
temp.create(fBilder);
Kartenliste.Add(temp);

Kompiliert das überhaupt?

temp:=TCard.Create(....


Beides davon geht


Das Hinzufügen geht problemlos

das ist das was probleme macht:

Code: Alles auswählen

Kartenliste.Items[i].Left := temp; //Integer
     Kartenliste.Items[i].Top := 3;
EDIT:

Habe auch versucht eine "Put-Procedure" sowie es die normale TList benutzt mit einzubauen , aber da kommt immernoch der fehler :( , manno -.- , woran könnte es liegen?

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Entweder existiert temp nicht ( = nil) oder der Index (i) ist nicht richtig. Aber wohl eher ersteres.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Habe jetzt das Hinzufügen sofort beim Paint gemacht somit ist der Fehler mit dem Werte zuweisen weg.

Und sofort das nächste Problem habe jetzt ja die Position der Bilder um dieses PtInRect auszuführen , doch da hat sich wieder mal ein fehler eingeschlichen :D

Code: Alles auswählen

procedure TForm1.Groupbox2MouseDown(Sender: TOBject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
   i,FormLeft,FormTop : Integer;
   tempRect: TRect;
   tempPoint: TPoint;
begin
   i := Spielerhand.Kartenliste.Count-1;
   FormLeft := Left + Groupbox2.Left + Panel1.Left;
   FormTop := Top + Groupbox2.Top + Panel1.Top;
   repeat
   begin
      tempPoint.x := X;
      tempPoint.y := Y;
      tempRect.Bottom := FormTop + Spielerhand.Kartenliste.Items[i].Bottom;
      tempRect.Top := FormTop + Spielerhand.Kartenliste.Items[i].Top;
      tempRect.Left :=  FormLeft + Spielerhand.Kartenliste.Items[i].Left;
      tempRect.Right := FormLeft + Spielerhand.Kartenliste.Items[i].Right;
 
      if PtInRect(tempRect,tempPoint) then
      begin
         ShowMessage(KartenFarbe( karten_spieler[i] )+' '+KartenWert( karten_spieler[i] )+' ist Angeklickt worden.');
         i := 0;
      end;
 
      if i <> 0 then
      begin
         i := i - 1;
      end;
 
   end until (i = 0);
end;
Müsste doch logischer weise richtig sein .... glaube ich^^

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Welcher Art ist denn der Fehler?

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Es kommt keine Ausgabe muss man mit den Punkten die abgefragt werden falsch sein

weil das Kartenfeld ist auf einem Panel gezeichnet , dieser ist in einer Groupbox , sind die Punkte formTop, formLeft falsch oder richtig?^^

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

also was ich bisjez herausgefunden habe , das TCustomControl kein onMouseDown event hat und da es auf nem Panel ist wird dessen onMouseDown Event nicht ausgeführt, wenn ich ein Event auf der GroupBox oder sofort auf der Form erstelle wird dieses nicht über dem TCustomControl ausgeführt also was muss ich jetzt machen? ich muss ja auf den Karten die X,Y Werte der Maus rausfinden aber das geht ja irgendwie nicht :(

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Nimm doch ein TImage, dann haste die Darstellung und die MouseEvents gibt es auch. Das setzt man auf ein TCustomPanel, dann kann man das auch durchreichen...
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

hm ein versuch wäre es wert , ich werde morgen mal versuchen ;)

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Die ganzen Karten werden jetzt auf einem TImage gezeichnet , das onMouseDown geht auch

aber jetzt das nächste Problem (wird langsam zur gewohnheit)

Left/Top/Bottom/Right für das TRect stimmen irgendwie nicht

Habe das Projekt als Source hochgeladen , wenn man es kompiliert wird extra in einer Memo-Feld alle X/Y/Left/Top/Bottom/Right angezeigt , vllt wisst ihr was da noch fehlt

PS: Da ist noch bischen viel Müll mitbei , dieses wird später schön gelöscht , kb es jetzt zu machen :D
Dateianhänge
Durak.zip
(206.71 KiB) 67-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben: Left/Top/Bottom/Right für das TRect stimmen irgendwie nicht
Lieber Eugen,
Gewöhn dir bitte nicht diesen Stil an, jedes programmier Problemchen ins Forum zu setzen.
Versuch doch mal selber zu Debuggen, da lernst du auch was dabei.
Gerade beim Lazarus Debugger ist Writeln ein guter Freund.
Wenn du unter Windows bist, musst du glaub ich bei den Linker Einstellungen die Checkbox
"Win32 Gui application" oder so ähnlich ausschalten.
Dann kriegst du nebst der Anwendung eine Konsole, wo du alles mögliche rausschreiben kannst.
Schau doch mal, welche Werte dein Rect hat. Ich benutze dafür manchmal meine StringRect Funktion:

function StringRect(Rct: TRect): string;
begin
Result := 'Left: ' + inttostr(Rct.Left) +
' Top: ' + inttostr(Rct.Top) +
' Right: ' + inttostr(Rct.Right) +
' Bottom: ' + inttostr(Rct.Bottom);
end;

Nichts aufregendes, aber praktisch.
So siehst du schnell, ob die Werte sinnvoll sind oder nicht.
z.B. mit Writeln(StringRect(MyRect),' ',FormTop,' ',FormLeft); etc...



EDIT: Du darfst die Karte nicht Freen am Ende von procedure TForm1.Karten_zeichnen;
tempCard.free wegmachen!

Ausserdem solltest du die Arrays immer mit 0 beginnen.

Also: Kartenbilder = array[1..36] of TBitmap; ist nicht so schlau mach 0..35

Vor allem wenn du's nachher so ausliest:
for i := 0 to Length(Form1.karten_spieler) do
begin
tempCard := TCard.Create(fBilder[Form1.karten_spieler]);

Da sind Kopfschmerzen vorprogrammiert.

Und schalte doch mal bei "Compilereinstellungen -> Quelltext" alle Überprüfungen ein, dann siehst du solche Böcke eher.

Antworten