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