Thema: Delphi 2d game:ping-pong

Einzelnen Beitrag anzeigen

Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#26

Re: 2d game:ping-pong

  Alt 9. Apr 2005, 12:49
Zitat:
was bedeutet in diesem fall outside?
Mein Programm ist in C++ geschrieben und verwendet DirectX.
Es geht dabei um eine Box mit 4 Seitewänden, und einem Ball der drinnen hin- und herrollt. Die Box ist 20*14 groß (wenn ich mich recht erinnere...), wenn man annimmt dass die Box genau in der Mitte ist ergeben sich folgende Konstanten:
Code:
const integer LinkeWand = -10;
const integer RechteWand = 10;
const integer ObereWand = 7;
const integer UntereWand = -7;
Wenn der Ball an der linken Wand abprallt, muss ich einfach die x-Komponente der Bewegungsrichtung ändern. Da gibts nur ein Problem: Der Ball wird jedes Frame weiterbewegt, und die Bewegung ist bei jedem Frame verschieden: dauert das Frame länger, bewegt sich auch der Ball weiter.
Ich überprüfe, ob die Koordinaten des Balls plus Ballradius bereits außerhalb der Box sind. Wenn ich dann die y-Komponente der Bewegungsrichtung umdrehe, kann es passieren dass der Ball zwei Frames braucht um wirklich wieder in der Box zu sein. Und während dieser zwei Frames wird die Bewegungsrichtung des Balles ständig umgedreht! Er hüpft dann hin- und her und kommt nicht mehr in die Box zurück. Um das zu verhindern, verwende ich die Variable outside. Wenn sie auf true ist, dann heißt das dass der Ball gerade außerhalb der Box ist - in dem Fall drehe ich die Bewegungsrichtung nicht um, solange bis er wieder drinnen ist.

Zitat:
udn wie kriege ich die position des balls raus, bzw woher kriege ich solche x- und y-achsen?
Indem du DirectX, OpenGL oder evt. auch die WinAPI verwendest. Bedenke dass DirectX und OpenGL (aber insbesondere DirectX) äußerst kompliziert sind und dass man zunächst die Sprache, in der man programmiert, gut beherrschen sollte um mit sowas anzufangen.


Zitat:
Beim klassischen Ping-Pong wird das doch berücksichtigt oder irre mich da?
Ich glaube nicht dass das beim Computer-Ping-Pong berücksichtigt wird, aber vielleicht meinen wir zwei unterschiedliche Spiele.
Mein Code ist natürlich nur für den Fall dass die Flächen an denen der Ball abprallt achsenparallel sind. Nur dann ist es so einfach.

Zitat:
und^^...wie lasse ich den ball fliegen...
Wieder etwas Pseudocode, ich hoffe du kannst meine Mischung aus Delphi, C++ und Deutsch lesen ^^
Code:
VerwendeteVariablen:
   double TimeCorrectionFactor;
   float FrameTime;
   __int64 PerformanceFrequency;
   __int64 PerformanceCounter;
   float StartTime; // Zeitwert bei Programmstart
   float LastTime; // Der Zeitwert beim letzten Frame
   float CurrentTime; // Derzeitiger Zeitwert in Sekunden


// Beim Programmstart aufrufen, aber möglichst knapp vor dem Berechnen des ersten Frames:
QueryPerformanceFrequency(PerformanceFrequency);
TimeCorrectionFactor=1/PerformanceFrequency;
QueryPerformanceCounter(PerformanceCounter);
StartTime=PerformanceCounter*TimeCorrectionFactor;
LastTime=StartTime;

// Jedes Frame:
QueryPerformanceCounter(PerformanceCounter);
CurrentTime=PerformanceCounter * TimeCorrectionFactor;
FrameTime=(CurrentTime-LastTime);
LastTime=CurrentTime;

// Bewegen eines Objekts unter der Annahme dass objekt.bewegung und objekt.dimension beides zweidimensionale Vektoren mit Gleitkommazahlen sind und die verwendete.... ich sag mal "Grafik-Engine" (z.B. ein TBitMap, die WinAPI oder DirectX oder OpenGL.....) Gleitkommazahlen unterstützt. Auf ein Bitmap kannst du nicht mit Kommazahlen zeichnen, da gibts nur ganze Pixelnummern!
objekt.position = objekt.position + objekt.bewegung * FrameTime
Zitat:
wenn der ball gegen ein hindernis stößt, zb. eine wand, dann soll der einfallswinkel = ausfallswinkel sein, weist du was ich damit meine?
Ja, weiß ich. Ich weiß aber nicht auswendig wie man es berechnet weil ich es noch nie gebraucht habe. Du findest aber sicher Informationen bzw. Formeln dazu im Internet. Ist nicht soooo kompliziert.


Ich weiß nicht was du von den Informationen brauchen kannst, aber die oben geschilderte Methode zur Zeitmessung und framerate-unabhängigen Objektbewegung funktioniert äußerst gut, sofern die dort erwähnten Bedingungen gegeben sind.
Lukas
  Mit Zitat antworten Zitat