AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi mmTimer mit Paintbox-Problem bei Icy-Tower-Clon
Thema durchsuchen
Ansicht
Themen-Optionen

mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

Ein Thema von Homunkulus · begonnen am 15. Jul 2008 · letzter Beitrag vom 16. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Homunkulus

Registriert seit: 31. Jan 2008
6 Beiträge
 
#1

mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 02:29
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 02:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 02:57
Zunächst mal: Wilkommen hier im Forum Homunkulus!

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 von Homunkulus:
2:habe ich Delphi kaputt gemacht oder Windows (oder doch mein Projekt)?
Vermutlich sind es Fehler in deinem Projekt

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 von Homunkulus:
4:Ist die Technik mit der Paintbox ineffizient oder hat das mit meinen Algorithmen zu tun?
Beides

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 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.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Homunkulus

Registriert seit: 31. Jan 2008
6 Beiträge
 
#4

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 04:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 12:52
Häng dein Projekt doch einfach mal hier an. Du hast uns ja schon vorgewahnt, dass es "unschön" ist aber dann können wir dir evtl. einige Fehler aufzeigen und dir mit Sicherheit eher helfen als so.

Gruß Lars

EDIT:
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.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Homunkulus

Registriert seit: 31. Jan 2008
6 Beiträge
 
#6

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 15. Jul 2008, 17:45
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.
Angehängte Dateien
Dateityp: zip jumper_131.zip (1,23 MB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 16. Jul 2008, 03:21
Du hast da einen bösen Fehler drin:
destructor loeschealles; // in Unit steuerung - Klasse T_Steuerung Der Destruktor muss IMMER so aussehen:
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 16. Jul 2008, 05:00
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
  Mit Zitat antworten Zitat
Homunkulus

Registriert seit: 31. Jan 2008
6 Beiträge
 
#9

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 16. Jul 2008, 22:45
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

Zuletzt noch eine Frage zu Timern für die ich im Web keine Antwort gefunden hab :
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.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: mmTimer mit Paintbox-Problem bei Icy-Tower-Clon

  Alt 16. Jul 2008, 22:59
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!!
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:01 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