Entwickler-Ecke
Freeware Projekte - Minigolf
beastofchaos - Sa 26.03.11 02:01
Titel: Minigolf
Hallo Leute,
ich heiße Thomas und bin 15. Bin seid einem halben-dreiviertel Jahr mit Delphi vertraut und hatte schon nach 2-3 Wochen angefangen, mich an mein erstes großes Projekt zu hocken: Minigolf mit Delphi xD
Habe viel geschrieben und auch durch viiiele Tipps im Forum es endlich geschafft. Ich schätze jetzt meine Arbeitszeit auf über 250 Stunden mind, da ich schon kurz vor Silvester angefangen habe und fast täglich dran gearbeitet habe :)
Dann kann ich nicht mehr viel sagen, außer dass das Spiel noch in der Beta-Phase' ist. Also wenn euch gravierende Fehler auffallen -> Bescheid sagen ;)
'Beta-Phase: Eigentlich sind ja alle Spiele in der Beta, weil sie alle immer noch Fehler enthalten :)
Jetzt kann ich nur sagen
ENJOY!
Grüße, Thomas alias Beast
PS:
1.Problem vorweg ist, dass das Einlochen noch nicht glatt verläuft, das muss ich nochmal iwie korrigieren.
(2.Problem: Es könnte auch bei nicht sehr fitten PCs sein, dass der Ball mal über ein Hindernis hüpft oder dass alles stockend ist - das ist halt von der Computergeschwindigkeit abhängig
( arbeite mit OnIdle ))
Version2 : Neue Version beinhaltet jetzt Bilder, aber noch keinen Sound bei Kontakten mit Wand - kommt vll noch)
Version3 : Sound bei Wandkollision, perfektionierte Ballbewegung bei Lochberührung, Ball wird kleiner bei Ball im Loch
Version4 : Editor für eigene Level ( -> Wechsel zwischen Editor und Spiel möglich )
Version5 : Awards haben besseres Design - Editor ist verbessert
Version6 : einige Probleme entfernt (siehe Beitrag vom 11.04)
Version7 : Handling zum Vergrößern/etc. verbessert
Version8 : Bug entfernt bei "an Wand liegend"
Version9 : blinkende Hindernisse bei Berührung, Quelltext verbessert (jetzt mit Objekten), um leichter Verbesserungen einzubauen :P
Version10: schönere Awards; TON - Zwei Hintergrundlieder und Kollisionssound, der noch nicht perfekt läuft bei vielen Kollisionen
PS: Wegen zu großem Ordner muss ich nun(ab Version 9) auf eine andere Seite überspringen zum Upload:
http://www.megaupload.com/?d=GW7NP0X3
Th69 - Sa 26.03.11 11:58
Hallo Thomas,
schöne Idee!
Hast du evtl. vergessen, einige Bilder mitzugeben (s. Anhang)? Bei "Verkleinern" findet er auch die Bitmap "Pictures\Maximize.bmp" nicht.
Und die Textbox (was ist das für eine Zahl?) scheint auch etwas verrutscht zu sein - zumindestens bei meiner Auflösung von 1024x768...
Würde mich über weitere Level freuen...
Gruß
Th69
beastofchaos - Sa 26.03.11 12:33
Mmh, das ist mir jetzt ein rätsel, wieso der da schon wieder meckert.
Wenn man auf Verkleinern z.B. klickt passiert (unteranderem) folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TMainForm.FormCreate(Sender: TObject); begin path := ExtractFilePath(Application.ExeName); . . . end;
procedure TMainForm.BitBtn2Click(Sender: TObject); begin . . . with BitBtn2 do begin Glyph.LoadFromFile(path + 'Pictures\Maximize.bmp'); Caption := 'Vollbild'; end; . . . end; |
Bei mir funktioniert das Verfahren einwandtfrei, weswegen ich jetzt auch keine Lösung für das Problem weiß :/
Die Zahlen im Editfenster geben die Entfernung zwischen der jetzigen zu zeichnenden Position und der vorherigen Position des Balls. Hatte ich gebraucht, um zu schauen, wie viel Pixel zwischen den beiden Punkten liegen ( für meine Berechnungen teilweise ). Ist jetzt weg ;)
edit: ach mist bin ich doof. Ich hab ja nur die Exe-datei geschickt, ich müsste das Spiel immer mit dem ganzen ordner verschicken. Ich pack das schnell mal in nen zip-ordner ( ohne Quelltext ) und lads neu hoch
Th69 - Sa 26.03.11 13:00
Hi,
super, nun bin ich zufrieden ;-) ... und perfekt!
beastofchaos - Sa 26.03.11 13:30
:DD
Den besten Award,d en man bisher erreichen kann ist: "1 Versuch und mind 5 Kontakte" - Ist aber auch fast unmöglich.
Ich mach dann nach meiner Schul-präsentation am Donnerstag an dem Programm noch einiges. Auch wenn ich heute abend ein zweites Level mache, muss ich die Übergänge gestalten, vll mach ich auch noch Highscore-listen aktualisierend per MySQL, was für mich ein total unbekanntes Terraint ist. Textdatei schreiben und verändern kann ich schon, aber das dann auf MySQL-Basis ist was ganz anderes :p
Übrigens wird das zweite Level auch Schubfelder haben ;)
Und das erste Level werd ich noch verändern. Die Hindernisse sind ja nur so gesetzt zum Ausprobieren :p
KleinesPferd - Sa 26.03.11 15:21
beastofchaos hat folgendes geschrieben : |
PS: 1.Problem vorweg ist, dass das Einlochen noch nicht glatt vreläuft, das muss ich nochmal iwie korrigieren. |
So zum nachdenken, Und für 15 Jahre ist das ein dickes Brett zum Sägen:
Wie machst du das mit dem langsamer werdenden Ball? Basiert die Geschwindigkeit auf einer mathematischen Formel? Somit könntest du doch im Bereich des Lochs die Geschwindigkeit und den Winkel ermitteln.
Daraus liese sich dann mit dem Lochdurchmesser, der Geschwindigkeit und der Trägheit des Balles, doch relativ leicht ermitteln, ob der Ball nun ins Loch fallen würde oder nicht.
Klingt kompliziert, ist es auch.
Es sind glaub 3 Fälle die du Abfangen musst.
1. Wann Prüfe ich ob der Ball das Loch erreicht hat. (glaub am schwersten)
2. Mittig kommender Ball
-> wenn Geschwindigkeit stimmt -> Versenkt,
-> wenn zu Schnell -> Etwas von der Geschwindigkeit wegnehmen und weiter rollen lassen. Wieviel von der Geschwindigkeit weggenommen wird, hängt von der Geschwindigkeit selber ab. Als Hausnummer sag ich mal, bei 5 Km/h prallt der gegen die gegenüberliegende Kante und verliert nahezu 80% an Speed. Bei 50Km/h ist dem Ball das Loch egal und der Schiesst hienaus ^^
3. Ermittlung wie weit 'aussermittig' der Ball auf dein Loch trifft. Somit liesse sich anhand der 'ReinfallTiefe' und der Trägheit der Austrittswinkel ermitteln.
Um 1. kommst du nicht drum herum. Und um Trägheit und ob der Ball das Schlagloch wahrnimmt (Reinfalltiefe)) wohl auch nicht.
Ich würde meinen Physik und Mathe Lehrer auf dieses Problem ansprechen. Bringt erstmal Bonuspunkte bei den Lehrern und zweitens ist dies endlich mal eine Schulaufgabe mit praktischen Hintergrund den wohl jeder Mitschüler nachgehen mag. Mehr als: Ein Skifahrer fährt einen Hang mti 35% Neigung (1. Hürde, da 100% == 45° entsprechen) und einem Gleitwiderstand von µ=0,08 herunter...
Soviel erstmal von meiner Seite ;)
Grüße
beastofchaos - Sa 26.03.11 17:47
@KleinesPferd:
Mein IdleHandler sieht erst mal so aus:
Meine vielen Funktionen hier müsst ihr nicht wissen, erschließt sich von selbst...
z.B:
v2d.normalize(v1: TVector2D): TVector2D -> normalisierter Vektor
Außerdem ist TVector2D ein Typ bestehend aus zwei extendeds und der Typ TLine besteht aus Ortsvektor(p) und Richtungsvektor(r) - darauf basiert alles in meinem Programm
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| procedure TMainForm.IdleHandler(Sender: TObject; var Done: Boolean); var i: integer; tmp, ReflectionLine: TLine; P1, P2: TVector2D; Collision: Boolean; begin Collision := False; timestep := CalcTimestep(CalcTime, Frequency); if moving then begin tmp := to_line(Gameball.m, V2d.scale(Gameball.v, timestep));
for i := 1 to 4 do if not Collision and V2d.BallLineCollision(Gameball, tmp.r, lines[i]) then begin Gameball.v := V2d.Reflect(Gameball.v, lines[i].r); Gameball.contacts := Gameball.contacts + 1; Collision := True; end;
for i := high(Barricades) downto 1 do if v2d.BallBarrCollision(Gameball, tmp.r, Barricades[i], ReflectionLine) then Gameball.v := v2d.reflect(Gameball.v, ReflectionLine.r);
if not Collision and V2d.BallHoleTouch(Gameball, Goal) then Gameball.v := V2d.add(Gameball.v, V2d.sub(Goal.m, Gameball.m)); Gameball.m := V2d.add(Gameball.m, V2d.scale(Gameball.v, timestep)); end;
Paintbox1.Invalidate;
if (V2d.length(Gameball.v) < 600) and V2d.BallInHole(Gameball, Goal) then begin Moving := True; Application.OnIdle := Nil; CLf := 80; Paintbox1.Invalidate; showawards; BitBtn3.Enabled := True; end;
if not Moving then Paintbox1.Cursor := crCross else if Moving then begin QueryPerformanceCounter(Gameball.tn); Gameball.t := (Gameball.tn - Gameball.t0) / Frequency; Gameball.length := (-200) * Gameball.t + V2d.length(Gameball.v0); Gameball.v := V2d.scale(V2d.normalize(Gameball.v), Gameball.length); if Gameball.length < 0.2 then begin Gameball.v := V2d.scale(Gameball.v,0); Moving := False; end; end;
if (V2d.length(Gameball.v) = 0) then Moving := False else Moving := True; |
Was er addiert bei "BallHoleTouch" ist der Vektor vom Spielballmittelpunkt zum Lochmittelpunkt. Weiß nicht, ob das so richtig ist, aber es sieht realistisch aus. Das macht er im Moment nur, wenn der Ball sich bewegt. Denn wenn er halb im Loch liegt und sich nur noch wenig bewegt, würde er zwar die Geschwindigkeit erhöhen, aber nur so minimal, dass die Geschwindigkeitsabnahme das schon wieder wegrechnet. Ich muss jetzt weg, aber wenn in einer Stunde wiederkmme, änder ich das, dass auch bei keiner Bewegung die Geschwindigkeit sich erhöht. Ich lads euch dann hoch. Bis dann ;)
KleinesPferd - Sa 26.03.11 21:21
Als erstes: Hut Ab! Respekt!
Ich habe mit sehr vielem gerechnet, aber nicht mit einem so sauberen Quelltext. Sehr leicht verständlich, obwohl ich noch nicht mal einen Blick auf die Variablendeklaration geworfen habe.
Und das du mit Vektoren arbeitest, finde auch ich sehr positiv.
Sehe ich das Richtig, auf Gameball.v (Geschwindigkeit?) und V2d.length(Gameball.v) (Restweglänge bei der aktuellen Geschwindigkeit?) basiert deine Geschwindigkeit, bzw der noch zurückzulegende Weg? Ich würde gernen einen Blick in die V2d.length Funktion werfen.
Ich versuch mir mal selber eine Funktion auszudenken, mit der ich meine Vorschläge von weiter oben, dir näher bringen könnte. In wie weit mir das gelingen wird, ist fraglich. Bin Momentan zeitlich arg eingebunden.
Zum Nachdenken hätte ich ein paar Kleinigkeiten.
Bis auf die leichtere Lesbarkeit, ist es glaub weniger nötig, zwischen Aussenwänden und Hindernissen einen Unterschied zu machen. Somit würde eine Kollisionsberechnung universell einsetzbar sein.
Um den Ball zu versenken, MUSS dessen Mittelpunkt unbedingt, den Mittelpunkt des Loches erwischen?
Und Collision ist mit Gameball.contacts>0 gleichzusetzen ;)
Schöne Grüße
beastofchaos - Sa 26.03.11 22:40
KleinesPferd hat folgendes geschrieben : |
Als erstes: Hut Ab! Respekt!
Ich habe mit sehr vielem gerechnet, aber nicht mit einem so sauberen Quelltext. Sehr leicht verständlich, obwohl ich noch nicht mal einen Blick auf die Variablendeklaration geworfen habe.
Und das du mit Vektoren arbeitest, finde auch ich sehr positiv.
|
Dankeschön, ist auch sehr mühsam, aber leichter als meine anfänglich Idee von der Trignometrie - da gäbe es hundert sonderfälle, bei denen die normalen Rechnungen nicht funktionieren würde :p
Zur Lesbarkeit: Meinst du, dass ich Kommentare am Rand habe? die hab ich schnell noch für euch dazu gedichtet oder meinst du das Einrpcken? :P
Zitat: |
Sehe ich das Richtig, auf Gameball.v (Geschwindigkeit?) und V2d.length(Gameball.v) (Restweglänge bei der aktuellen Geschwindigkeit?) basiert deine Geschwindigkeit, bzw der noch zurückzulegende Weg? Ich würde gernen einen Blick in die V2d.length Funktion werfen.
|
v2d.length besteht aus einer Zeile(Satz des Pythagoras):
Delphi-Quelltext
1: 2: 3: 4:
| class function V2d.Length(v: TVector2d): extended; begin result := sqrt(v.x * v.x + v.y * v.y); end; |
Zitat: |
Ich versuch mir mal selber eine Funktion auszudenken, mit der ich meine Vorschläge von weiter oben, dir näher bringen könnte. In wie weit mir das gelingen wird, ist fraglich. Bin Momentan zeitlich arg eingebunden.
|
Meine Rechnung läuft ja folgendermaßen: Wenn Berühren mit Loch dann "Gameball.v := Gameball.v + Entfernung zum Mittelpunkt der Lochs"
Zitat: |
Bis auf die leichtere Lesbarkeit, ist es glaub weniger nötig, zwischen Aussenwänden und Hindernissen einen Unterschied zu machen. Somit würde eine Kollisionsberechnung universell einsetzbar sein.
|
Naja, auf Grund der Ecken bei den Hindernissen, ist die Kollisionsprüfung ein bisschen anders strukturiert, als bei Linien :/ Deswegen muss ich das trennen
Klar könnte ich auch eine Funktion erstellen, die würde aber als erstes die beiden arrays(4 linien, mehrere Barrikaden) übernehmen müssem und dann halt beide einzelnd auf Kollision überprüfen (später auch arrays für Kugeln, Schubgebiete, Wasser und Eisfläche)
Zitat: |
Um den Ball zu versenken, MUSS dessen Mittelpunkt unbedingt, den Mittelpunkt des Loches erwischen?
|
-> Nö, das ist nur, wenn der Ball "im Loch" ist, sprich wenn er ganz im Loch ist und kein bisschen übersteht. Wenn das Loch größer als die Kugel ist, dann gibt es mehrere Probleme. Wenn die Kugel größer als das Loch ist, bleibt sie logischerweise stecken - so sähe das auch bei mir aus (schon ausprobiert)
Zitat: |
Und Collision ist mit Gameball.contacts>0 gleichzusetzen ;)
|
Nö, weil
-Collision ist gleichzusetzen mit "Trifft er in DIESEM moment die Wand"
-Contacts zählt nur die bisherigen Kollisionen. Angenommen ich hätte eine wand getroffen ( contacts := 1 ), dann würde er das ganze Spiel über denken, dass er etwas trifft, auch wenn er auf
einer freien Wiese ist
Grüße, Thomas - Danke, dass du dich so aktiv mit meinem Programm beschäftigst ;) Das hilft mir, weiter über Probleme nachzudenken :p
beastofchaos - Sa 26.03.11 23:04
So, hab jetzt neue Version hochgeladen - sie enthält:
- Sound bei jeder Wandcollision - Problem: es hängt meist leicht, wenn er den Sound abspielt
- perfektionierte Ballbewegung bei Lochberührung
- Ball wird kleiner bei Ball im Loch
Meine nächsten Ziele sind:
1. Bisher arbeit mein Programm mit einer temporären Unit, die alles (teilweise objektorientiert) zur Vektorrechnung beinhaltet. Nun will noch eine temporäre Unit erstellen, die alle zusätzlichen Prozeduren (z.B. Paintbox1.OnPaint/ Showawards/ BitBtn1.OnClick) und die Positionen der Buttons,etc. beinhaltet -> das erspart mir, für jedes Level alle Prozeduren dazu zu schreiben.
Dann müsste ich in dem Programm nur schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| uses Windows, ..., Vectors(Vektor-unit), Minigolf( geplante Minigolf-unit); . var TMainForm: MinigolfForm; Barricades: array[1..1] of TBarricade; Circles: array[1..1] of TCircle; Pushareas: array[1..1] of TBarricade; Lines: array[1..4] of TLine; . . . procedure TMainform.OnCreate; begin ... SetLength(Barricades,...); SetLength(Circles,...); SetLength(Pushareas,...); if Barricades[0] = 0 then begin Barricades[1] := ... . . . |
2. Um mehrere Levels einzubinden, soll alles in einem Programm läuft, aber es soll die Daten(Anzahl/Position/Art der Hindernisse) zu den unterschiedlichen Levels aus extenernen Text-Datei auslesen.
beastofchaos - So 03.04.11 11:37
Neue Version ist online - die neuen Features:
- Man kann beim Spielen zum Editor wechseln, der aber nur ein neues Level an die "Level-Reihe" anhängt.
- Editor speichert die Levels als MGo-Dateien ( ->.txt ) mit sehr einer übersichtlichen Auflistung der Hindernisse.
(-> Minigolf-Programm kann diese Text-Dateien auslesen und interpretieren)
- Powerschubfelder sind in Level 2 vorhanden, aber lassen sich selber (noch) nicht mit Editor einfügen.
- Dasselbe gilt auch für Kreis-Hindernisse, bei denen aber überraschenderweise die Kollision nicht immer perfekt funktioniert
Werde noch weiter dran arbeiten und in spätestens in 2 Wochen werde ich eine Version mit einem perfekten Editor hochladen ;)
Was meint ihr eigentlich zu einem Editor? Soll man mit ihm auch das aktuelle Level ändern können? Das würde iwie ustig sein, aber dann könnte man jedes schwere Level einfach umstellen :/
Grüße, Thomas ;)
Edit: Der Editor löscht die etzte gezeichnete Barrikade iwie wieder und außerdem wird Start und Ziel verwechselt - das hab ich bis heute abend geändert ;)
Xion - So 03.04.11 11:59
Coole Sache :zustimm:
beastofchaos hat folgendes geschrieben : |
Was meint ihr eigentlich zu einem Editor? Soll man mit ihm auch das aktuelle Level ändern können? Das würde iwie ustig sein, aber dann könnte man jedes schwere Level einfach umstellen :/ |
Naja, an sich kann man ja immer die Level-Datei verändern um zu gewinnen. Vielleicht wäre es am besten, dass man zwar im Editor diese Level laden kann, aber sie nicht überspeichern kann. Du sagst deinem Programm also, du hast 5 Level. Der Editor verhindert dann, dass man auf Level 1-5 was drüberspeichert. (Man würde dann als Level6 speichern).
Achja, man kriegt die "mehr als 10mal Wand berührt" Meldung auch bei genau 10 Berührungen ;) Da ist irgendwo ein = zuviel :mrgreen:
beastofchaos - So 03.04.11 12:37
Jep, dann arbeite ich noch in der Richtung am Editor - im moment gibt es imemr 2 feste Levels.
Ich lade jetzt eine neue Version hoch:
- Die eigenen Levels werden temporör gespeichert und am Ende wieder gelöscht, wenn man will kann man sie auch extra speichern (Extra-button)
- Die Verwechslung zwischen Ziel und Ende ist korrigiert
- Genauso auch behoben, dass die letzte barrikade immer nicht gespeichert wird
- Awardfehler auch schnell korrigiert ;)
Danke für deinen Tipp :P
FURIOS - Di 05.04.11 13:43
Das Spiel macht aufjedenfall fun ;)
beastofchaos - So 10.04.11 22:11
Neuste Version ist drinne
- Awards sind etwas 3-dimensionaler gehalten ;)
- Editor lässt sich besser bedienen
Teekeks - So 10.04.11 23:28
Hallo!
Tolles Programm, läuft auch unter Wine!
Aber: wenn ich [ctrl]+c drücke (in meiner Linux-Konsole bedeutet das "Prozess beenden") dann meldet sich dein Programm mit ner Meldung "ctrl-c hit", auch wenn das Fenster NICHT den Focus hat und die Tastenkombination wird nicht ausgefürt!
Was machst du da bitte? :)
Thom - So 10.04.11 23:59
Unter Windows zeigt Strg+C überhaupt keine Wirkung - was ja auch zu erwarten ist. Alt+F4 schließt das Programm - genau, wie es sein soll. Liegt also wahrscheinlich irgendwie an Deinem Wine... :lol:
Allerdings habe ich zwei andere kleine Fehler gefunden:
- Der Button "Neustart" startet das Level neu - ich hätte aber erwartet, daß das Spiel ab Level 1 neu gestartet würde. Das geht aber leider nicht. Da hilft nur Spiel beenden und neu öffnen.
- Wird das Fenster mit "Vergrößern" vergrößert und klickt man doppelt auf die Überschrift, wird das Fenster wieder verkleinert. Das ist das normale Verhalten. Nur wird das Spielfeld dabei leider nicht angepaßt und alle Buttons sind außer Reichweite. Da hilft dann nur noch Alt+F4 zum Beenden des Spiels.
Aber ansonsten: Tolle Sache,
Thomas! Respekt: Ich würde mir mehr 15-jährige mit Deiner Geduld und Ausdauer wünschen! Mach' weiter so! :zustimm:
beastofchaos - Mo 11.04.11 14:21
Jep, ich glaube auch, dass das nicht an meinem programm liegt - sicher könnte man das Problem umgehen, indem man das Betriebssystem rausfindet und dann entsprechend auf die Kombination Strg+C reagiert, aber das wäre ein Featrue, das ic hganz am Ende behebe.
Habe in der letzten halben Stunde Prozedur FormResize eingeführt und zwar genau so, dass man bei Doppelklick auf die FormCaption auch alle bjekte entsprechend ausrichtet. Funktioniert also jetzt schon mal einwandtfrei.
Der Neustart startet ab jetzt immer bei Level 1 wieder. Eigentlich woltel ich iwann auch noch einbauen, dass man auf alle bereits gespielten Levels greifen kann -> Unter dem Spielfeld eine Leiste mit allen Ziffen von 1 bis zum letzten Level. Das wird auch noch bei Version 10 oder so kommen ;) Erstmal bau ich den Editor noch weiter aus (Kreise und Powerschübe mit drinne).
Hab noch einen Fehler gefunden: wenn man einlocht, dann auf Editor geht und dann gleich wieder auf "Weiterspielen" dann hat sich die Kugel ein kleines bisschen vom Loch entfernt und man kann schießen :/ Problem bei neuer Version behoeb
Vielen Dank für euer Lob, das gibt mir auf jeden Fall Ansporn für noch größere Projekte :P Aber werde erstmal nach Minigolf Java und C+ in den Grundzügen lernen, da ich in 3 Monaten ein Schulpraktikum bei einer Softwarefirma mache - danach bekommt ihr sicher noch mehr zu sehen ;)
beastofchaos - Sa 16.04.11 16:15
So, da ich durch kleine (eigentlich unwichtige) Hindernisse Probleme mit der Leiste oben dran habe, werde ich dasauf bsNone setzen und selber per Canvas eine Leiste malen :)
Dazu hätte ich gerne ein Feedback, ob ihr das bisher gut fandet, dass das Programm sich verkleinern/vergrößern lässt. Denn ich würde dann lieber immer auf Vollbild arbeiten - Das heißt man könnte das Programm nicht verkleinern :/ Wüsste gern, was ihr davon haltet - sonst bleib ich bei der Möglichkeit, dass man zwischen den Möglichkeiten wechseln kann
jaenicke - Sa 16.04.11 16:31
Am besten wäre, wenn man es einfach in der Größe verändern könnte wie man es will. Denn so macht das Spiel auf einem normalen Full-HD Bildschirm gerade einmal ein Drittel der Höhe und Breite aus.
Und warum nutzt du nicht einfach die System-Knöpfe zum Maximieren / Wiederherstellen / Schließen? So ist das nicht gerade intuitiv.
Und dann fehlt noch die Benutzung der Laufzeitthemes (XP-Style), so sehen die Buttons doch ziemlich hässlich aus. ;-)
Von der Umsetzung des Spielbereichs an sich sieht es wirklich richtig gut aus, aber das Drumherum weniger. ;-)
Mr_Emre_D - Sa 16.04.11 16:38
Ähm, wo kann man das runterladen?
Edit: Oh, jetzt ist es da =|
jaenicke - Sa 16.04.11 16:39
Im ersten Beitrag als Anhang? ;-)
EDIT: Ja, manchmal hilft einmal aktualisieren. :D
beastofchaos - Sa 16.04.11 17:37
jaenicke hat folgendes geschrieben : |
Am besten wäre, wenn man es einfach in der Größe verändern könnte wie man es will. Denn so macht das Spiel auf einem normalen Full-HD Bildschirm gerade einmal ein Drittel der Höhe und Breite aus.
Und warum nutzt du nicht einfach die System-Knöpfe zum Maximieren / Wiederherstellen / Schließen? So ist das nicht gerade intuitiv.
Und dann fehlt noch die Benutzung der Laufzeitthemes (XP-Style), so sehen die Buttons doch ziemlich hässlich aus. ;-)
|
Also wäre vll wirklich angenehmer, wenn man die Größe verändern kann. Mach ich rein ;)
Genauso werde ich den selbst gemachten X- und die anderen Buttons entfernen (ich wollte eigentlich noch alle (Bit)Btn in Images umwandeln und vll in anderen Farben/Formen etc. machen :P Muss aber nicht)
Was meisnt du mit Laufzeitthemes? :) Und welche Buttons, die häßlich aussehen, meinst du jetzt, die (Bit)Buttons oder die in der Leiste?
jaenicke - Sa 16.04.11 17:51
beastofchaos hat folgendes geschrieben : |
Was meisnt du mit Laufzeitthemes? :) |
Rechts deine, links die mit Laufzeitthemes (das sind normale TButtons, aber mit denen geht das erst ab Delphi 2010 oder so, vorher eben TBitBtns wie bei dir). ;-)
Dafür reicht es in den Projektoptionen unter Anwendung die Laufzeitthemes zu aktivieren (ab Delphi 2007) oder die Unit XPMan in die uses einzubinden (ab Delphi 7) oder manuell eine Manifestdatei als Ressource einzubinden (Delphi 6 und früher).
Tilman - Sa 16.04.11 18:12
Hübsches Spiel, erinnert mich an das Minigolf auf Playray.de, hast du dich daran orientiert? :)
rushifell - Sa 16.04.11 18:19
Mir gefällt Dein Spiel auch :-)
Ein paar Kleinigkeiten:
- Bei mir wird das Formular beim Starten des Programms immer zu weit nach unten gesetzt (Bildschirm-Auflösung 1280*768 Widescreen ;-))
- Ich höre keinen Sound. Habe Windows Vista.
Gruß rushifell
jaenicke - Sa 16.04.11 18:27
rushifell hat folgendes geschrieben : |
- Ich höre keinen Sound. Habe Windows Vista. |
Einen Sound höre ich weder mit Windows 7 noch mit Windows XP im virtuellen PC. ;-)
rushifell - Sa 16.04.11 18:39
Dachte, der Sound wäre implementiert.
beastofchaos hat folgendes geschrieben: |
Sound bei jeder Wandcollision - Problem: es hängt meist leicht, wenn er den Sound abspielt. |
Probier's doch vielleicht mal mit der Bass.dll. Aber für einen Soundeffekt lohnt sich das nicht gerade.
Tilman - Sa 16.04.11 18:41
Das Soundfile lässt sich nichtmal mit VLC abspielen. Nur wenn ich's in Winamp starte, dann hör ich was.
beastofchaos - Sa 16.04.11 21:38
@rushifell:
Die Sound-datei ist eine wav-Datei, das hatte ich gebraucht, weil ich das nicht über einen Mediaplayer machen wollte und die andere Möglichkeit ging nur mit wav...
Ich hab schon einiges von diesem bass.dll gehört, ich schau mir dazu gleich mal ein paar Topics an und versuch mich da mal ran ;)
Übrigens die 3/4 Zeilen für Sound hab ich als Kommentar gekennzeichnet, da das halt mit dem Hängen nervt - deswegen hörst du nichts :) Kann mir ja noch ein Lied bei YT suchen und im Hintergrund spielen lassen :P
Formular setz ich gleich ma so, dass es in der Mitte erscheint ;) neue Version bekmmt in einer Stunde spätestens
@Tilman:
Und ja hab ich :) Das Spiel ist aber unmöglich grafisch gemacht :) Wenn du mal bei mir die Schübe anschaust (Hellgrüne Pfeile auf Grüner Fläche) und sie dann mal mit Playray vergleichst... Bei ihnen sind die Pfeile an den Hintergrundrasen angepasst -> heißt, dass sie nicht einfarbig sind, sondern jeder Pixel mal dunkler, mal heller ist - keine Ahnung, wie ich das nachmachen könnte :/
@jaenicke:
Gut, das schau ich mir auch mal bei Delphi XE an
Danke für eure vielen Antworten und Tipps,
Grüße Thomas
beastofchaos - Sa 16.04.11 22:17
Ich hab grad versucht wieder den eigenen X-Button zu entfernen und dachte mir, dass dabei doch nur die eine Form geschlossen wird und die andere im Hintergrund unsichtbar(Hint) noch läuft, aber bei Prozesse ist Minigolf.exe dann weg (?) - Closed dieser X-Button oben rechts vll alle Forms?
Bei der Hauptform ist das sogar so, aber wenn ich die Editorform schließe bleibt der Prozess/ die Anwendung erhalten. Werde einfach bei EditorForm.OnClose ein MainForm.Close einbauen unter der Bedigungen, dass das Close durch die EditorForm aufgerufen wird :) mal schaun
Edit: Es reicht auch, wenn ich ein MainForm.Close hinzusetze - alles suppi :)
beastofchaos - Sa 16.04.11 23:18
Neue Version ist ab jetzt drinne:
- Die Leiste oben ist wieder aktiviert -> kein eigener X-Button etc.
- Fenster kann vergrößert/ verkleinert werden
- Fenster wird am Anfang mittig angeordnet
(- Wenn die Funktion 'QueryPerformanceCounter(Frequency)' False ausgibt, wird eine Meldung angezeigt und das Programm beendet)
Ein Problem wäre da noch. Wer Win7/Vista hat kennt sicher die Funktion, dass man z.B. das Fenster nach oben schiebt und es dann automatisch maximiert wird ( geht auch mit Doppelklick auf Leiste ). Wenn man es dann wieder verschiebt wird die alte Größe angenommen, das heißt er hat iwie die Breite und Höhe vor dem Maximieren gespeichert, bloß wo? Denn wenn man das Maximiert und dann den Editor aufruft, wird dieser nicht maximiert aber ist dann genauso groß - muss man dann leider selber wieder verkleinern. Habe in dem ordner die Exe "Minigolf_Anzeige" mitgeliefert - nochmal das Spiel - bloß, dass in der Caption immer die Breite und Höhe der Form angezeigt werden. Damit kann man sich das mal anschauen
Mir fällt grad auf, dass geht auch auf XP etc., da man es einfach nur iwie maximieren muss - in jedem Fall werden die Maße vom verkleinerten Modus iwo gespeichert.
PS: Anhang wäre zu groß wegen zweiter Exe, aber das ist sowieso unwichtiger, dass die Größen angezeigt werden, kann man schließlich erahnen :P
jaenicke - So 17.04.11 07:31
beastofchaos hat folgendes geschrieben : |
- Fenster kann vergrößert/ verkleinert werden |
Ich meinte eigentlich, dass sich das Spielfeld daran anpassen sollte. ;-)
Sich also skalieren sollte. Also so wie hier (ist alles eine Paintbox bis auf die Leiste oben):
http://www.delphi-forum.de/viewtopic.php?p=557541
beastofchaos hat folgendes geschrieben : |
Denn wenn man das Maximiert und dann den Editor aufruft, wird dieser nicht maximiert aber ist dann genauso groß - muss man dann leider selber wieder verkleinern. |
Da musst du aber selbst was dran drehen, das ist kein Standardverhalten. ;-)
Siehe Beispiel in PN.
beastofchaos - So 17.04.11 10:46
Vorher wurde die EditorForm von Größe und Position ja immer an die MainForm angepasst. Habs jetzt korrigiert - EditorForm wird imemr mittig angezeigt und hat eine feste Größe. Wenn aber MainForm maximeirt ist, wird auch die EditorForm maximiert und andersrum ;)
Deswegen ist jetzt neue Version drinne
jaenicke - So 17.04.11 11:53
Was noch nicht optimal ist, ist, dass neue Level hier gespeichert werden (das Programm liegt unter
c:\Program Files (x86)\Minigolf):
Quelltext
1:
| C:\Users\Sebastian\AppData\Local\VirtualStore\Program Files (x86)\Minigolf\Levels\Not_Delete |
Denn im eigenen Ordner hat das Programm logischerweise keine Schreibrechte. Solange du jetzt die Laufzeitthemes nicht aktivierst, geht Windows davon aus, dass es sich um ein altes Programm für Windows 9x handelt und korrigiert Schreibzugriffe automatisch in den genannten Ordner. Sobald du die Themes aber aktivierst, gibt es beim Speichern schlicht Fehler.
Normalerweise gehören solche Daten ins
Anwendungsdatenverzeichnis [
http://www.delphi-library.de/viewtopic.php?p=548600].
beastofchaos - So 17.04.11 12:43
Also was empfiehlst du mir jetzt gegen das Problem zu machen?
Ich hab grad ne Stunde dran gesessen, um Bild neu zu machen und alle BitBtns in Buttons und ImageLists umgewandelt. Aber erst nur auf der MainForm, später oder morgen auf der EditorForm auch noch ;)
Edit Link nicht gesehen^^ ich schaus mir an
Tilman - So 17.04.11 12:58
Ich hab einen Bug gefunden: wenn man direkt an eine Bande ranspielt, und dann versucht mit dem nächsten Schlag gegen die Bande zu spielen, dann wird das Level neu gestartet. Allerdings beginnt die Kugel dann oben links, und nicht im Startfeld, was in Level 2 zu einem Deadlock führt, weil oben links das Pfeilfeld ist, und der Ball automatisch beschleunigt wird.
beastofchaos - So 17.04.11 13:09
Gut, das wäre dann auch mal entfernt. Das lag daran, dass ich eig eingestellt habe:
Wenn BallWandKollision und sich der Ball nicht bewegt, dann Neustart...^-^
beastofchaos - Do 28.04.11 00:36
Also wie gesagt, ist jetzt eine neue Version drinne. Auffallend für euch sind warsch nur die blinkenden Hindernisse bei Kollision. Und zwar werden sie der Farbe Weiß angenähert. Mit "Paint.Net" Hab ich mir mal verschiedene Farbe angeschaut, aber ob ich sie Gelbd/Weiß/Schwarz/Rot aufleuchten lasse - Es sieht nciht wirklich gut aus. Weiß ist noch iwie das beste :) Vll habt ihr da einen Vorschlag für eine gute Farbe. Zu meinem Minigolf passen halt so rote Farben nicht so gut.
Beim Aufleuchten erwarten sicher viele einen Ton... Das werde ich in der nächsten Woche versuchen mit bass.dll rneizumachen. Vll habt ihr ein gutes Tutorial, das ich mir morgen mal reinziehen kann :)
rushifell - Do 28.04.11 04:50
Ich poste mal meine Support-Unit für die Bass.dll. Keine Ahnung, ob's mit der aktuellen Version noch funktioniert. Der Bass.dll liegen aber immer sehr gute und einfache Beispiele in Delphi bei, auf denen diese Unit basiert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
|
unit MyBass_Unit;
interface
Function StartBass:Boolean; Procedure EndBass; Function LoadMusicData(Dateiname:String; Index:Byte; Playloop:Boolean):Boolean; Procedure FreeMusicData(Index:Byte); Function PlayMusic(Index:Byte):Boolean; Function StopMusic(Index:Byte):Boolean; Function MusicPlaying(Index:Byte):Integer; Function Continue_Music(Index:Byte):Boolean; Function PauseMusic(Index:Byte):Boolean; Function Music_GetVolume(Index:Integer):Integer; Function Music_SetVolume(Index:Integer; Volume:Integer):Boolean;
implementation Uses Windows, Bass; Var strs: array[0..128] of HSTREAM; Function StartBass:Boolean; Begin Result:=True; IF (HIWORD(BASS_GetVersion) <> BASSVERSION) then Result:=False else IF not(BASS_Init(-1, 44100, 0, 0, nil))then Result:=False; End;
Procedure EndBass; Begin BASS_Free(); End;
Function LoadMusicData(Dateiname:String; Index:Byte; Playloop:Boolean):Boolean; Begin IF Playloop then strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 0, 0, BASS_SAMPLE_LOOP) else strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 0, 0, 0); End;
Procedure FreeMusicData(Index:Byte); Begin BASS_StreamFree(strs[Index]); End;
Function PlayMusic(Index:Byte):Boolean; Begin Result:=True; IF not(BASS_ChannelPlay(strs[Index], True)) then Result:=False; End;
Function Continue_Music(Index:Byte):Boolean; Begin Result:=True; IF not(BASS_ChannelPlay(strs[Index], False)) then Result:=False; End;
Function MusicPlaying(Index:Byte):Integer; Begin Result:=Bass_ChannelisActive(strs[Index]); End;
Function StopMusic(Index:Byte):Boolean; Begin BASS_ChannelStop(strs[Index]); End;
Function PauseMusic(Index:Byte):Boolean; Begin BASS_ChannelPause(strs[Index]); End;
Function Music_GetVolume(Index:Integer):Integer; Var Freq, Vol:Cardinal; Pan:Integer; Begin Bass_ChannelGetAttributes(Strs[Index],Freq,Vol,Pan); Result:=Vol; End;
Function Music_SetVolume(Index:Integer; Volume:Integer):Boolean; Var Freq, Vol:Cardinal; Pan:Integer; Begin Result:=False; Bass_ChannelGetAttributes(Strs[Index],Freq,Vol,Pan); Vol:=Volume; IF Bass_ChannelSetAttributes(Strs[Index],Freq,Vol,Pan) then Result:=True; End;
end. |
beastofchaos - Do 28.04.11 12:06
In deinem Kommentar redest du vom Initialisieren, Laden, Freigeben udn Beenden, aber mit was gisbte das aus? Ich vermute jetzt einfach mal die Funktion "Musicplaying". Ich werd mir mal deinen Quelltext kopieren und in Ruhe anschauen, da ich schließich keine der Funktionen kenne... und Delphi-Hilfe hab ich auch nicht :/
beastofchaos - Do 28.04.11 13:24
Dankeschön :D
edit: Wo bekomme ich die Bass-Unit? Habe schon gegooglet, aber bin nicht fündig geworden :/
Th69 - Do 28.04.11 14:18
http://www.un4seen.com/
(der Download-Button ist ganz oben auf der Seite - for "non-commercial use")
rushifell - Do 28.04.11 20:34
beastofchaos hat folgendes geschrieben: |
In deinem Kommentar redest du vom Initialisieren, Laden, Freigeben udn Beenden, aber mit was gisbte das aus? Ich vermute jetzt einfach mal die Funktion "Musicplaying".
|
Ganz einfach: Beim Programmstart (z.B. ins FormCreate):
Delphi-Quelltext
1:
| IF not(StartBass) then ShowMessage('Bass konnte nicht initialisiert werden!'); |
Beim Programmende (z.B. ins FormClose);
Danach musst Du die Streams einzeln laden und später (beim Programm-Ende) wieder freigeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| LoadMusicData(Dateiname+'aufprall.ogg',0,False); LoadMusicData(Dateiname+'hintergrundmusik.ogg',1,True); ... For i:=0 to 1 do Music_SetVolume(i,Volume); ... IF Aufprall then PlayMusic(0); ... For i:=0 to 1 do FreeMusicData(i); |
Kannst ja über Konstanten zur noch besseren Übersicht den Streams noch Namen geben.
beastofchaos - Fr 29.04.11 00:04
Hab auf der Seite schonmal geguckt. Ganz oben steht doch "Platform: Win32, OSX" und darunter 2 Download-Buttons (mit WIndows- und Apple-Zeichn jeweils dran). Ich vermute, du meinst das.
Weiter unten im Text schon nur einmal unter "Licensing":
"BASS is free for non-commercial use. If you are a non-commercial entity (eg. an individual) and you are not making any money from your product (through sales, advertising, etc), then you can use BASS in it for free."
Aber wo Download sonst wäre, weiß ich nicht.
Die Platform hab ich jetz mal runtergeladen, aber ich komm mit den vielen Ordner nicht klar. Ist nicht einfach eine Bass-Unit dabei, die ich in meinen Programmordner lege, und dann hat sich das?
@rushifell:
Einmal hast du die Hitnergrundmusik. Wird die automatisch abgespielt ab dem Moment, wo du sie mit "LoadMusicData" lädst? Ich vermute das liegt dann an dem "True". Wenn ich auf "False" in den Parametern setze, kann ich das einzelnd mit "PlayMusic" abspielen, oder?
rushifell - Fr 29.04.11 00:35
Hab gerade die aktuelle Bass.dll ausprobiert. Funktioniert leider nicht mit meiner Unit. Das hatte ich schon befürchtet, weil ich das schon oft bei Updates der Bass.dll erlebt habe. Ein Grund auch für mich, nicht ständig die neueste Version zu benutzen. Musst die Unit leider an die Änderungen anpassen.
Nein, Du musst einfach mit PlayMusic die Hintergrundmusik starten. "True" ist nur, wenn Du das Lied bzw. den Soundeffekt in einer Endlosschleife abspielen möchtest. Bei "False" wird der Soundeffekt bzw. die Musik nur einmal abgespielt. Probier's am besten einfach aus.
jaenicke - Fr 29.04.11 06:03
beastofchaos hat folgendes geschrieben : |
Hab auf der Seite schonmal geguckt. Ganz oben steht doch "Platform: Win32, OSX" und darunter 2 Download-Buttons (mit WIndows- und Apple-Zeichn jeweils dran). Ich vermute, du meinst das. |
Genau, auf dieser Seite ist dort oben der Download:
[url]
http://www.un4seen.com/bass.html[/url]
Da warst du wohl schon richtig.
Und in diesem Thread habe ich gestern ein winziges Beispiel gepostet, das ich kurz mit der aktuellen Bass-Version (dynamisch eingebunden) erstellt hatte:
http://www.delphi-forum.de/viewtopic.php?p=639463#639463
beastofchaos - Fr 29.04.11 11:42
Aber mein Problem ist ja, dass eure Units in uses "Bass" stehen haben... und ohne Bass.pas bez Bass.dcu kann ich da ncihts machen. Diese "Platform", die ich da runter geladen habe, sieht so aus:
s. Anhang
Th69 - Fr 29.04.11 14:21
Hallo beastofchaos,
du kennst schon den Unterschied zwischen Windows und MacOS-X, oder? ROFL
Du sollst ja auch die Win32-Datei (bass24.zip) runterladen und dort ist dann im Ordner "Delphi" die Datei "bass.pas" bzw. die gesamten Delphi-Projekte (bass.dpg) dabei.
beastofchaos - Fr 29.04.11 22:24
Klar weiß ich den Unterschied zwischen Windows und Mac...
Bloß iwie kam ich da nciht drauf^^ War mir ziemlich sicher, auf Windows geklickt zu haben^^
beastofchaos - So 01.05.11 17:44
Also habe jetzt mal ein Hintergrund-Lied eingebaut und Sounds bei Kollision eingebaut. Doch wenn zwischen 2 Kollision vll eine halbe Sekunde liegt, wird der zweite Sound nciht abgespielt. Würde es helfen, wenn ich ein dynamisches Array von Audiostreams baue? Im Moment habe ich 2 - Hintergrundmusik und Kollisionssound...
Um aber dann nicht mehr laufende Streams zu löschen, weiß ich keine Funktion, die das prüft. Gibt es da bei Bass.dll eine spezielle Funktion (ich benutze dynamic_bass), die das prüfen kann?
Außerdem hab ich noch eine Frage. Wo bestehen noch Vorteile an globalen Variablen? Ich habe eine Funktion in meiner Unit "Vectors", die prüft, ob ein Ball einen Kreis trifft. Sie enthält auch folgendes internes statisches Array.
Delphi-Quelltext
1: 2:
| var X: Array[1..5] of TLine; |
Da es bei der aktuellen Version bei einem starken Schuss möglich ist über ein Kreishindernis zu springen, hab ich die Funktion mal kopiert, in meine Main-Unit gepackt als Funktion des Haupt-Formulars, um ein bisschen rumzuprobieren. Da hab ich einfach mal dieses Array in die globalen Variablendeklaration gelegt und prompt funktioniert alles total glatt... (?) Weiß jem Rat, wieso das so ist?
Grüße, Thomas alias beast.
PS: Die neuste Version kommt vll heute abend, bei der dann auch dieKollision läuft und ein Lied für 3/4 Minuten im Hintergrund läuft. Ob ich Lautstärkereglung schon hinbekomme, ist eine Frage der Zeit :P
beastofchaos - So 01.05.11 23:23
Ich hab jetzt die neue Version hochgeladen (siehe Linke im ersten Post). Neu:
+ Sound (mit + und - Lautstärke einstellen
+ besser aufblinkende Hindernisse
+ bessere Awards
+ Fehlermeldungen verbessert
- Ordner kann noch nicht in "Programme" sein wegen Schreibrechten beim Editor. Der muss halt dann ausgelassen werden. Problem werd ich auch noch iwie in Griff kriegen ;)
Grüße, beast alias Thomas
Girofox - Mo 02.05.11 18:28
Ich bin auch 15 und hab seit genauso langer Zeit angefangen, mit delphi zu arbeiten, wie du. Tolle Arbeit!
beastofchaos - Mi 04.05.11 21:26
Ok jetzt hab ich wieder ein Problem, das ich nicht verstehe. Die Form mit dem SPiel ist meine Hauotform und der Editor ist "untergeordnet" und kennt die bass.dll nicht sozusagen, aber wenn ich von Minigolf zum Editor wechsel, läuft das Lied weiter und, wenn ich dann den Editor schließe, läuft das Lied einfach weiter. Im OnClose-Ereignis vom Editor steht "MainForm.Close" und in diesem wiederum steht "Unload_BASSDLL;". Also müsste das Lied doch beendet sein.
edit: Wenn ich in dem OnClose-Ereignis vom Editor Application.Terminate einfüge funktioniet es, aber das ist keine gute Lösung, weshalb ich das lieber iwie mit Unload_Bassdll lösen will. Wer kann mir helfen?
edit2: Ok, da steht MainForm.Close, obwohl ich in uses die UMain nicht stehen habe, da das eig einen Fehler von wegen "Circular Reference" ergibt und Delphi das nicht mag... Also hab ich in UMain uses UEditor stehen und lass dann einfach beim Editor alles vom Hauptformular als Variable speichern (vorm Wechsel zum Editor -> FCaller := MainForm).
Also hab ich einfach FCaller.Close hingeschrieben und es funktioniert ;)
beastofchaos - So 22.05.11 17:49
Also bei mir ist inzwischen einiges besser geworden. Statt den grauen öden Buttons hab ich nun ein MainMenu, das einem auch Einstellungen ermöglicht und Musik hochladen lässt. Bloß gibts da zwei Fragen von mir:
1. Es ist ja eig. so ein Minigame, was man nebenbei spielt - wäre da eine extra Hintergrundmusik nicht zu nervig bzw. überflüssig?
2. Ich arbeite ja mit einer OnIdle-Prozedur, die immer so schnell wie möglich arbeitet (-> kein fester Intervall, aber meist um den Intervall 36 herum bei mir, hab ich mal berechnet).
Der hat aber leider ein paar Hänger. Einige haben sich shcon mein minigolf ausprobiert - nun schießt mal und dann verschiebt mal, während die Kugel rollt, das Fenster. Was passiert? Während ihr die Maustaste auf dem oberen Leiste gedrückt haltet, stoppt der IdleHandler. Wenn ihr dann wieder loslasst kommt er iwo weiter weg an oder möglicherweise im Aus(wo ihr eine Fehlermeldung bekommen dürftet).
Ich könnte das Problem sicher mit einem Timer(auf Intervall 1, dann arbeitet er auch immer so schnell wie möglich) aus der Welt schaffen, aber ich würde gerne bei meinem IdleHandler bleiben :(
Wisst ihr Rat?
Gruß, Thomas
PS: Ich werde jetzt noch ein bisschen basteln und in 1 bis 2 Wochen die neue Version hochladen mit MainMenu, Soundsteuerung und ähnlichem. Ob ich die Hintergrundmusik dann wegmache, überleg ich dann noch... ;)
Avoliq - So 12.06.11 13:27
Also ich habe dein Minigolf jetzt auch mal getestet und muss erstmal sagen macht echt laune ;-)
allerdings habe ich auch noch nen Fehler entdeckt und zwar habe ich mir im Editor ne Map mit ziemlich vielen kleinen Barrieren gebastelt nun stellt das prog i-einen fehler im lvl fest und meldet, dass dieses neu geladen werden muss. soweit so gut jetzt kommt dann allerdings eine fehlermeldung namens 3. fehlermeldung die das nächste level laden will weil dieses probleme macht allerdings ist kein weiteres lvl vorhanden und ich hänge in einem ewigen kreis aus diesen beiden fehlermeldungen die sich nun ständig abwechseln
mfg Avoliq
(sry für zeichensetzung,rechtschreibung,groß-klein schreibung bin ziemlich verkatert^^)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!