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);   //speichert den Pfad der Exe-datei in einer String-variable (ein "/" ist dabei schon hintendran)
.
.
.
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

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:

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              // Collision mit den Außenwänden?    
        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                                                      // Oder Collision mit einem der Hindernisse?
      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));          // Oder berührt der Mittelpunkt des Spielballs das Loch?

    Gameball.m := V2d.add(Gameball.m, V2d.scale(Gameball.v, timestep));                        // Berechnet die neue Position
    end;

  Paintbox1.Invalidate;


  if (V2d.length(Gameball.v) < 600and 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                                      // Geschwindigkeitsabnahme:
      begin
      QueryPerformanceCounter(Gameball.tn);                                 // Zählt Schwingungen zu diesem Moment
      Gameball.t := (Gameball.tn - Gameball.t0) / Frequency;                // Berechnet Zeit von Beginn des Schusses bis jetzt
      Gameball.length := (-200) * Gameball.t + V2d.length(Gameball.v0);     // Länge = Wiederstand(variabel) * Zeit + Geschwindigkeit am Anfang des Schusses
      Gameball.v := V2d.scale(V2d.normalize(Gameball.v), Gameball.length);  // Ermittelt per neue Länge den neuen Vektor

      if Gameball.length < 0.2 then                                         // Damit er nicht ins unendlich Minimale geht, wird ab 0.2 auf 0 gerundet
        begin
        Gameball.v := V2d.scale(Gameball.v,0);
        Moving := False;
        end;
      end;

  if (V2d.length(Gameball.v) = 0then Moving := False                      // Bewegt sich die Kugel?
    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

user profile iconKleinesPferd hat folgendes geschrieben Zum zitierten Posting springen:
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;                     // Dieses MinigolfForm soll dann durch die "Minigolf-unit" erstellt
  Barricades: array[1..1of TBarricade;         // Hindernisse
  Circles: array[1..1of TCircle;                 // runde Hindernisse
  Pushareas: array[1..1of TBarricade;           // "Schubgebiete"
  Lines: array[1..4of TLine;                   // 4 Außenwände
.
.
.
procedure TMainform.OnCreate;
begin
...                                              // liest Daten aus Textdatei
SetLength(Barricades,...); 
SetLength(Circles,...);
SetLength(Pushareas,...);
if Barricades[0] = 0 then                        // falls das Level keine Hindernisse beinhaltet, dann wird der anfang auf 0 gesetzt und keine Hindernisse werden deklariert
  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:

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
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:

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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
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). ;-)

ButtonThemes

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

user profile iconrushifell hat folgendes geschrieben Zum zitierten Posting springen:
- 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

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
- 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

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
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:
{
Version: 2.3.0.2
Initialisieren: StartBass;
Beenden: EndBass;
Sound Laden: LoadMusicData  //0..128 mögliche Streams
Sound freigeben: FreeMusicData //0..128 mögliche Streams
}


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..128of HSTREAM;    //Maximum an Streams

Function StartBass:Boolean;
Begin
Result:=True;
IF (HIWORD(BASS_GetVersion) <> BASSVERSION) then
   Result:=False else
IF not(BASS_Init(-14410000nil))then
   Result:=False;
End;

Procedure EndBass;
Begin
BASS_Free();
End;

//Playloop => Spielt Sound in Endlosschleife
Function LoadMusicData(Dateiname:String; Index:Byte; Playloop:Boolean):Boolean;
Begin
  IF Playloop then
     strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 00, BASS_SAMPLE_LOOP) else
     strs[Index] := BASS_StreamCreateFile(False, Pchar(Dateiname), 000);
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;

//0 = Stopped; 1 = Playing; 2 = Stalled; 3 = Paused
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 :/


jaenicke - Do 28.04.11 12:17

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
und Delphi-Hilfe hab ich auch nicht :/
Erstens gibt es die auch online und zweitens:
Wenn dir nur das WinHlp32-Update [http://www.microsoft.com/downloads/de-de/details.aspx?FamilyID=258aa5ec-e3d9-4228-8844-008e02b32a2c] fehlt, weil du Vista/7 und Delphi 7 oder älter hast, dann installier das Update einfach...


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);

Delphi-Quelltext
1:
EndBass;                    

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:
//Einmaliges Laden aller Streams beim Programmstart, bis zu 129 im Beispiel.
LoadMusicData(Dateiname+'aufprall.ogg',0,False); //Durch False nur einmal gespielt.
LoadMusicData(Dateiname+'hintergrundmusik.ogg',1,True); //Durch True in Endlosschleife gespielt
...
For i:=0 to 1 do
    Music_SetVolume(i,Volume); //relative Lautstärke festlegen (müsste zwischen 0 und 100 liegen (in Prozent))
...
IF Aufprall then //Abspielen des Soundeffekts im Spiel
   PlayMusic(0);
...
For i:=0 to 1 do //Freigeben der Streams beim Programmende
    FreeMusicData(i);

Kannst ja über Konstanten zur noch besseren Übersicht den Streams noch Namen geben.


beastofchaos - Fr 29.04.11 00:04

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
http://www.un4seen.com/
(der Download-Button ist ganz oben auf der Seite - for "non-commercial use")


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

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
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..5of TLine; //5 Linien;

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^^)