Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi mmTimer mit Paintbox-Problem bei Icy-Tower-Clon (https://www.delphipraxis.net/117267-mmtimer-mit-paintbox-problem-bei-icy-tower-clon.html)

Homunkulus 15. Jul 2008 02:29


mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Kurze Einleitung in mein Problem:

Ich versuche gerade ein kleines Minigame zu programmieren bei dem man Icy tower ähnlich einen EndlosTurm
Balken für Balken hochsteigen muss.
Den Spielablauf selber hab ich zum größten Teil fertig, nur häufen sich jetzt die Probleme bei der Ausgabe.
Ich habe bereits am Anfang beschlossen die Grafikausgabe über eine Paintbox laufen zu lassen,
statt dem Standart Timer hab ich den MMTimer benutzt da der Standart-Timer (das war mein subjektiver Eindruck, belehrt mich falls es falsch ist) in verschiedenen Sitationen unterschiedliche Geschwindigkeiten hatte.

Das Problem ist etwas seltsam, deshalb fang ich mal chronologisch von vorne an:

Da mir auffiel dass das Spiel fast bis 100% die CPU belastete wollte ich es testweise auf einem anderen PC ausprobieren.
Dort zeigte die .exe, die ich rüberkopiert hatte aber ein ganz anderes Verhalten als auf dem ursprünglichen PC:

Bild wurde manchmal nicht gezeichnet, Spiel blieb hängen, stürzte ab...
(womit wir bei der 1.Frage wären: ist die kompilierte .exe im Projektordner schon das endgültige Ergebnis oder braucht sie irgendwie noch eine spezielle Laufzeitumgebung?)

Zurück an Delphi versuchte ich das Problem, das es nur am anderen PC gab zu beheben; experimentierte rum, stellte versuchsweise den MMTimer auf 5 ms - ein paar sekunden kam ein rukkeliges Bild, danach ging gar nichts, ich meine wirklich gar nichts, bild frierte einfach ein, Musik im Hintergrund ging in Endlosschleife. Musste den PC neu starten.

Obwohl das Projekt natürlich das alte ist, mit der alten Timerfrequenz 25 und alles sonst auch unverändert, hat nun die PaintBox angefangen zu flackern, bzw. die Bilder innerhalb der Paintbox. Die IDE zeigt jetzt Fehlermeldungen an wo vorher keine waren, Projekt lässt sich trotzdem kompilieren, spiel löst dann aber manchmal "Systemfehler" oder so aus, manchmal schmiert es aber auch nur ab, manchmal muss es mit taskmanager abgeschossen werden...

Wenn ich wieder den Standart-Timer verwende läuft es seltsamerweise besser (aber auch nicht fehlerfrei)

Das seltsame ist eben das jetzt selbst ältere versionen die ich seperat abgespeichert hatte und die problemlos liefen nun Probleme verursachen.

Die verschiedenen Fragen:
2:habe ich Delphi kaputt gemacht oder Windows (oder doch mein Projekt)?
XOR
3:speichert Delphi zu einem Projekt selber irgendwas sodass alle Versionen davon betroffen sind?
4:Ist die Technik mit der Paintbox ineffizient oder hat das mit meinen Algorithmen zu tun?

Details: OS: WindowsXP
IDE: Delphi Turbo Explorer

Mir ist das ganze ziemlich unangenehm, wenn sich keine Lösung findet müsste ich wohl notgedrungen ein neues Projekt anfangen und die .pas dateien dorthin kopieren.. :|
Bin Dankbar für jede Antwort

sx2008 15. Jul 2008 02:53

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Du hast mit Bordmitteln min. 5 Alternativen:
1.) auf einem Image zeichen
- kann flackern
2.) auf einer Paintbox zeichnen
- flackert
3.) abwechselnd auf 2 Bitmaps zeichnen. Das Bitmap, auf dem nicht gezeichnet wird, steht bereit um auf einer Paintbox ausgegeben zu werden
das ist double buffering selbst gemacht
4.) man zeichnet auf ein Bitmap und kopiert es als Ganze in ein Image
5.) Image vor Updates sperren, auf Image zeichnen, Sperre aufheben

Wichtig ist, dass deine Zeichenprocedure ein TCanvas-Objekt als Input entgegennimmt.
Damit bleibst du flexibel und kannst jede der obigen Alternativen ausprobieren.

Hast du denn die Paintbox richtig verwendet??
Gezeichnet wird nur und auschliesslich im Event OnPaint!
Wenn man will, dass die Paintbox neu gezeichnet wird, muss man Paintbox.Invalidate aufrufen.

Zu deinen Fehlern und Abstürzen ist zu sagen, das liegt wahrscheinlich an einer unsauberen Programmierung.
Ausserdem ist ein Timerinterval von 1/25 oder gar 5ms zu schnell für eine normale VCL-Anwendung.

Hador 15. Jul 2008 02:57

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Zunächst mal: Wilkommen hier im Forum Homunkulus!

Zitat:

Zitat von Homunkulus
(womit wir bei der 1.Frage wären: ist die kompilierte .exe im Projektordner schon das endgültige Ergebnis oder braucht sie irgendwie noch eine spezielle Laufzeitumgebung?)

Nein, sie ist sozusagen "fertig".

Zitat:

Zitat von Homunkulus
2:habe ich Delphi kaputt gemacht oder Windows (oder doch mein Projekt)?

Vermutlich sind es Fehler in deinem Projekt :wink:

Zitat:

Zitat von Homunkulus
3:speichert Delphi zu einem Projekt selber irgendwas sodass alle Versionen davon betroffen sind?

Wenn du eine Sicherheitskopie angelegt hast (komplettes Projekt kopiert hast) dann ist es auch auf dem alten Stand.

Zitat:

Zitat von Homunkulus
4:Ist die Technik mit der Paintbox ineffizient oder hat das mit meinen Algorithmen zu tun?

Beides :stupid:

Das Zeichnen auf der Paintbox ist für Spiele recht ineffizient. Besser wäre es, das ganze über Direct X oder OpenGL zu lösen. Für soetwas gibt es Grafikengines wie bspw. Andorra. Such einfach mal hier im Forum.

Zitat:

Zitat von Homunkulus
... da der Standart-Timer (das war mein subjektiver Eindruck, belehrt mich falls es falsch ist) in verschiedenen Sitationen unterschiedliche Geschwindigkeiten hatte.

Der TTimer garantiert dir (wie eigentlich jeder), dass die zeitintervalle nicht kürzer als eingestellt sind. Wenn der CPU das nicht mitmacht, oder andere Prozesse dazwischenfunken, können die Intervalle durchaus etwas langsamer sein. Aber das hast du afaik bei anderen Timern auch. Es stimmt aber, dass er nicht sehr Performant ist. Er ist auch eigentlich eher nicht für Spiele gedacht.

EDIT:
@sx2008: Die Methoden, die du ansprichst sind alle recht ineffizient und für schnelle Spiele kaum zu gebrauchen. Für sowas führt meist kein Weg an DX OGL vorbei. Zumindest, wenn Grafikmäßig einiges geschieht es einigermaßen laufen soll.

Homunkulus 15. Jul 2008 04:24

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Danke für die nette Begrüßung und die schnellen, guten Antworten (um diese Uhrzeit...:))

@Hador: den Tipp mit OpenGL,DX... werd ich beherzigen, aber erst fürs nächste spielprojekt. Dieses hier möcht ich nicht noch mal von vorn programmieren, zu viel frust:(. Möcht es jetzt einfach nur schnell fehlerlos fertigbringen.

Zu den Abstürzen: ich weiß das mein Programmierstil nicht der beste ist aber diesmal lag es höchstwahrscheinlich nicht daran:
Die alten Sicherheitskopies, die ja zumindest fehlerlos funktionierten stürzen nun ab-> folglich hab ich irgendwas geschrottet, unabhängig vom Projekt.
Eine Andere möglichkeit kann es doch nicht geben, oder?

@sx2008:
Zitat:

Du hast mit Bordmitteln min. 5 Alternativen:
1.) auf einem Image zeichen
- kann flackern
2.) auf einer Paintbox zeichnen
- flackert
Bisher hat es bei mir mit PaintBox nicht geflackert (bis zum FEHLER (ich sprech es schon ehrfüchtig aus)), und auch sonst bin ich eher der Ansicht das PaintBox eingesetzt wird um eben dieses flackern con Images zu unterbinden.

Und ich vermute wenn man eine Endlosschleife hat die immer wieder einen Canvas in die Paintbox kopiert ist das onPaint-Event unnötig, bei mir klappt es hervorragend (ähm...bis zum FEHLER)

Zitat:

Ausserdem ist ein Timerinterval von 1/25 oder gar 5ms zu schnell für eine normale VCL-Anwendung.
5 ms schon, aber 25 scheinen mir schon angebracht.

Hador 15. Jul 2008 12:52

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Häng dein Projekt doch einfach mal hier an. Du hast uns ja schon vorgewahnt, dass es "unschön" ist :wink: aber dann können wir dir evtl. einige Fehler aufzeigen und dir mit Sicherheit eher helfen als so.

Gruß Lars

EDIT:
Zitat:

Zitat von Homunkulus
5 ms schon, aber 25 scheinen mir schon angebracht.

Die mögliche Zeit hängt immer vom Code ab, der zu der Zeit ausgeführt werden soll.

Homunkulus 15. Jul 2008 17:45

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich wollte es euch eigentlich nicht zumuten...
Und wie geagt: ich bin immer noch der Ansicht das ich mit diesem Projekt irgendwas in meinem OS beschadigt hab, deshalb übernehm ich keine verantwortung wenn es einem anderen ähnlich ergeht.

Ich weiß das manche Sachen besser hätten gelöst werden können (insbesondere das mit den Images auf der Form->ist mein erstes Projekt solcher Art) aber das dürfte ja keinen Einfluss auf das Problem haben.

EDIT: Die Unit MMTimer ist nicht von mir.

sx2008 16. Jul 2008 03:21

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Du hast da einen bösen Fehler drin:
Delphi-Quellcode:
destructor loeschealles; // in Unit steuerung - Klasse T_Steuerung
Der Destruktor muss IMMER so aussehen:
Delphi-Quellcode:
destructor Destroy;override;
Also niemals beim Destruktor das Wörtchen override weglassen oder einen anderen Namen als Destroy verwenden!
Delphi-Quellcode:
destructor T_Steuerung.Destroy;
begin
   // Hier dein Code
   inherited; // das muss IMMER der letzte Befehl sein !!!!
end;
Noch ein Problem: NIEMALS Destroy direkt aufrufen!! Immer nur indirekt über die Methode Free aufrufen. (FreeAndNil ist auch erlaubt)
Delphi-Quellcode:
derSpieler1.Destroy; // Verboten !!
derSpieler1.Free;    // so ist's ok
Ich denke du hast jetzt erstmal Änderungsbedarf ;-)

Zacherl 16. Jul 2008 05:00

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Die Paintbox ist erstmal einfach zu lahm. Einfacher Umstieg und vollkommen ausreichend für den Projekt: DelphiX. Eine alte DirectX Kapselung, die aber wunderbar funktioniert.

Zum zweiten musst du deinen Programmcode mal generalüberholen. Das was sx2008 gesagt hat sind schonmal grobe Fehler, die einfach nicht passieren dürfen bei so einem Projekt. Klar, dass dir dann der Speicher vollläuft oder ähnliches.

Habe mir den Code nicht näher angeguckt, aber beim Beenden erhalte ich z.b. eine ungültige Zeigeroperation. Vielleicht guckst du dir nochmal paar Grundlagen an (bezogen auf die Destroy Sache .. könnten ja noch mehr solcher Fehler drinnen sein) und lädst dir dann mal DelphiX runter.

Auf dem Surface von DelphiX kannst du praktisch wie auf der PaintBox zeichen, nur dass halt alles viel performanter ist. Auch eigene Klassen für die Figuren, bräuchte man nicht, da DelphiX eine TSprite Klasse zur verfügung stellt. Einige Demos sind im Paket enthalten.

Gruß Zacherl

Homunkulus 16. Jul 2008 22:45

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Danke für die Tipps, ich glaube bei diesem Projekt ist im Angesicht der groben Programmfehler ( thx an sx2008 :)) und der Ansatzschierigkeiten ein neuer Anlauf vonnöten, aber zumindest was dazugelernt :-D

Zuletzt noch eine Frage zu Timern für die ich im Web keine Antwort gefunden hab :glaskugel: :
Falls der Programmcode nicht in einem Intervall abgearbeitet werden kann, kann es dann sein dass der Timer einfach eine neue Instanz der onTimer-Prozedur startet oder vielleicht die alte abbricht? Anders gefragt: hat man wirklich die Garantie dass alles wohlgeordnet Durchlauf für Durchlauf abbläuft?
Ich weiß ja nun das der Timer seine Instanz variieren kann, will aber nur sichergehen.

lbccaleb 16. Jul 2008 22:59

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
ausserdem ist das programm schon jetzt viel zu gro?!!!
auch an der datei größe kann man noch ein wenig arbeiten...
auch ich empfehle dir auf Bei Google suchendelphix umzusteigen!!

Zacherl 16. Jul 2008 23:08

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
 
Nein, mit dem Timer sollte es keine Probleme geben. Bei DelphiX ist ein eigener Timer dabei, den du dann auch verwenden solltest. Wie gesagt, guck dir mal ein Beispiel dazu an!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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 by Thomas Breitkreuz