![]() |
Re: Panel Spiel => Panel automatisch erzeugen?
Wo du die TPanel erstellst, muss deren Owner auch die Form sein
Delphi-Quellcode:
Ansonsten sind sie in Components[i] nicht drin....
Panel:= TPanel.Create (FPanel1);
Nu müsste es gehen! |
Re: Panel Spiel => Panel automatisch erzeugen?
Boahh es läuft... :hello: :corky: Ich danke dir tausendmal... :thumb: Jetzt bin ich schonmal nen ganzes Stückchen weiter, jetzt muss ich nur noch das mit dem Punktesystem hinkriegen. Falls ich wieder Hilfe brauche, poste ich hier.
Nochmals vielen dank.. |
Re: Panel Spiel => Panel automatisch erzeugen?
|
Re: Panel Spiel => Panel automatisch erzeugen?
@frank
Ich glaub im Grunde ist es fast dasselbe, nur bei ihm heißt das Spiel "Moorhuhn" und er hat noch ein paar Grafiken. Meins dagegen basiert wirklich nur auf gelbe Panels und weißen Hintergrund. Wenn ich fertig bin stell ich mal rein. Aber zu dem Problem mit dem Punktezählen komm ich auch noch gleich. Ich muss erstmal das ganze mit dem neuen Punktefenster und SetPunkte verstehen. :hi: |
Re: Panel Spiel => Panel automatisch erzeugen?
Okay, brauche wieder eure Hilfe.
Bei dem Spiel sollen auch die Punkte gezählt werden und in einem seperaten Fenster angezeigt werden. Ich hab erstmal das mit dem seperaten fenster wegelassen. Also hab ich in das Hauptfrmular ein Edit Feld eingefügt. Dazu folgenden Code. Wenn man verloren hat (= Null Punkte) soll die Message kommen "Verloren" und das Spiel soll aufhören neue Panels zu erstellen (break;), das funktioniert auch alles. Nun hab ich mit else if angegeben, dass wenn man 10 Punkte hat, die Message "Gewonnen" erscheinen soll und das Spiel aufhören soll (break;), da tut sich aber nix, auch wenn ich 10 Punkte habe kommt keine Message und das Spiel läuft weiter. Der letzte Teil ist glaub ich am wichtigsten:
Delphi-Quellcode:
procedure TFPanel1.Timer1Timer(Sender: TObject); var i: integer; begin Panel:= TPanel.Create (FPanel1); Panel.Color:= clYellow; Panel.Caption:= 'F'; Panel.Width:= 49; Panel.Height:= 33; Panel.Left:= Random(ShSpiel.Width-60)+30; Panel.Top:= Random(ShSpiel.Height-50)+30; Panel.Parent:= FPanel1; Panel.OnClick:= PanelWeg; Zaehler:= Zaehler-1; for i:=ComponentCount-1 downto 0 do begin if Components[i] is TPanel then begin if Panel.Visible= True then begin TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30; TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30; Edit1.Text:=IntToStr(Zaehler)+' '+'Punkte'; end else begin TPanel(Components[i]).Destroy; end; end; if Zaehler = 0 then begin Timer1.Enabled:=False; ShowMessage('Verloren'); break; end else if Zaehler = 10 then begin Timer1.Enabled:=False; ShowMessage('Gewonnen'); break; end; end; end; |
Re: Panel Spiel => Panel automatisch erzeugen?
Keiner nen Vorschlag? Irgendwie klappt das mit dem else Befehl im letzten teil zaehler=10 nicht. Für zaehler=0 funzt es.
|
Re: Panel Spiel => Panel automatisch erzeugen?
bitte nur 1 Frage pro Thread... (stand das nicht mal in den Forenregeln?)
mal davon abgesehen, kann ich in dem Code-Snippet nicht erkennen, dass du jemals 10 Punkte hast...wo bzw. auf welchen Wert initialisierst du Zähler? Ich sehe nur, dass du bei jedem Timer-Event 1 abziehst (egal,ob ein panel getroffen wird oder nicht). d.h. du müsstest den Zähler auf min. 11 initialisieren, damit die Bedingung erfüllt (beim ersten timer-event) ist. Inkrementierst du den Zähler auch irgendwo? HTH Frank |
Re: Panel Spiel => Panel automatisch erzeugen?
Hi,
Stimmt schon, nach dem Intervall vom Timer wird immer ein neues Panel erstellt, daher dann ein Punkt Abzug. Habe natürlich bei den Panels eingestellt, dass bei OnClick der zaehler Wert auf +1 erhöht wird. Das funktioniert auch alles, wenn ich auf nen Panel klicke, bekomme ich auch ein Punkt. Das Problem aber ist (glaub ich zumindest), dass er bei der if abfrage auf zaehler=0 wartet und nicht mit dem else if zaehler=10 weitermacht. Da ist irgendwas falsch bei den If/else Befehlen glaub ich. |
Re: Panel Spiel => Panel automatisch erzeugen?
hast du bemerkt, dass deine If-Abfrage in der For-Schleife steckt?
glaube das sollte nicht so sein, aber mit richtiger Einrückung würde man das sehen :) . ansonsten 3 Fragen: - wie wird Zaehler initialisiert - werden vorher panels erstellt (außerhalb vom timer) - hast du mit dem debugger schon 10 in der variable gesehen? denn: mit jedem erstellten panel wird der Zähler dekrementiert (geht übrigends mit dec(zaehler) kürzer). selbst wenn du alle panels wegklickst wirst du so nie 10 Punkte erreichen, da diese 10 punkte vorher schon vom Zähler abgezogen wurden.
Delphi-Quellcode:
HTH Frank
procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer; begin Panel:= TPanel.Create (FPanel1); Panel.Color:= clYellow; Panel.Caption:= 'F'; Panel.Width:= 49; Panel.Height:= 33; Panel.Left:= Random(ShSpiel.Width-60)+30; Panel.Top:= Random(ShSpiel.Height-50)+30; Panel.Parent:= FPanel1; Panel.OnClick:= PanelWeg; Zaehler:= Zaehler-1; for i:=ComponentCount-1 downto 0 do begin if Components[i] is TPanel then begin if Panel.Visible= True then begin TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30; TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30; Edit1.Text:=IntToStr(Zaehler)+' '+'Punkte'; end else begin TPanel(Components[i]).Destroy; end; end; if Zaehler = 0 then begin Timer1.Enabled:=False; ShowMessage('Verloren'); break; end else if Zaehler = 10 then begin Timer1.Enabled:=False; ShowMessage('Gewonnen'); break; end; end; //for end; |
Re: Panel Spiel => Panel automatisch erzeugen?
Hi,
hab die IF Abfrage aus der Schleife rasugenommen. Der Zaehler wird bei FormCreate auf 5 gesetzt (da man am Anfang 5 Punkte haben soll). Der Timer wird beim drücken des Start Buttons aktiviert und es werden 5 Panels erstellt (Bei StartClick). Vom Debugger hab ich keine Ahnung. Wie guckt man da nach? 10 Punkte hatte ich aber auf jedenfall, da die Punkte in einem Seperaten Memofeld angezeigt werden. Es fehlt dann halt nur die Meldung "Gewonnen". Hier mal der komplette Quellcode:
Delphi-Quellcode:
unit UFang1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, UPunkte; type TFPanel1 = class(TForm) BStart: TButton; ShSpiel: TShape; Panel: TPanel; Timer1: TTimer; procedure BStartClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure PanelWeg(Sender:TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FPanel1: TFPanel1; zaehler: integer; implementation {$R *.dfm} procedure TFPanel1.BStartClick(Sender: TObject); var i: integer; begin Timer1.Enabled:= True ; for i:= 0 to 4 do begin Panel:= TPanel.Create (FPanel1); Panel.Color:= clYellow; Panel.Caption:= 'F'; Panel.Width:= 49; Panel.Height:= 33; Panel.Left:= Random(ShSpiel.Width-60)+30; Panel.Top:= Random(ShSpiel.Height-50)+30; Panel.Parent:= FPanel1; Panel.OnClick:= PanelWeg; end; Punktefenster:=TPunktefenster.Create(self); Punktefenster.show; Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte'); end; procedure TFPanel1.FormCreate(Sender: TObject); begin randomize; Zaehler:=5; end; procedure TFPanel1.Timer1Timer(Sender: TObject); var i: integer; begin Panel:= TPanel.Create (FPanel1); Panel.Color:= clYellow; Panel.Caption:= 'F'; Panel.Width:= 49; Panel.Height:= 33; Panel.Left:= Random(ShSpiel.Width-60)+30; Panel.Top:= Random(ShSpiel.Height-50)+30; Panel.Parent:= FPanel1; Panel.OnClick:= PanelWeg; Zaehler:= Zaehler-1; for i:=ComponentCount-1 downto 0 do begin if Components[i] is TPanel then begin if Panel.Visible= True then begin TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30; TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30; Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte'); end else begin TPanel(Components[i]).Destroy; end; end; end; if Zaehler = 0 then begin Timer1.Enabled:=False; ShowMessage('Verloren'); //break; end else if Zaehler = 10 then begin Timer1.Enabled:=False; ShowMessage('Gewonnen'); //break; end; end; procedure TFPanel1.PanelWeg(Sender:TObject); begin TPanel(Sender).Hide; Zaehler:= Zaehler+1; Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte'); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 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