Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

1

01.02.2011, 19:26

[C++ & SDL] Timer erstellen?

Hallo Leute,

Ich habe da mal eine Frage und zwar, wie man jetzt einen Timer in C++ und der SDL Programmieren kann. Habt ihr da vielleicht ein kleines Tutorial für mich da? Ich hab schon bei Youtube und Google geschaut, aber nicht wirklich was "gutes" gefunden.

Naja hoffentlich könnt ihr mir helfen.


Mit freundlichen Grüßen



Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

2

01.02.2011, 20:28

Schau doch mal hier .

Gruß
SaRu_

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

3

01.02.2011, 23:34

Hallo,

danke erstmal für die Antwort, aber ich verstehe das nicht so ganz. Angenommen ich möchte ein Spiel machen, wo ein Objekt einfach nur nach unten "fällt", sich also nach unten bewegt. Dieses Objekt wird dann aber immer schneller ( also wie beim freien Fall ). Wie genau lasse ich denn nun die Zeit in Sekunden berechnen?


Mit freundlichen Grüßen



Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

01.02.2011, 23:39

Wie in dem Link von SaRu beschrieben liefert dir SDL_GetTicks() die Anzahl der seit Programmstart vergangenen Millisekunden. Wo genau liegt jetzt dein Problem damit die Zeit zu berechnen?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

5

01.02.2011, 23:52

Ok, gut zu wissen. Hab ich wohl ein wenig überlesen. Sorry. ^^
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

02.02.2011, 08:11

Ums noch ein wenig deutlicher zu machen: sobald dein Objekt fällt, holst du dir die derzeitige vergangenen Millisekunden. Nun kannst du mit dieser Info bei jedem Durchlauf/Frame testen, wielange dein Objekt bereits fällt und dies für den immer schneller werdenden freien Fall lösen, indem du bspw. die vergangene Zeit mal 0.0981 rechnest (Warum nicht 9.81? ginge auch, aber da wir in den Millisekunden schnell in die 1000, 2000 kommen, also 1 bzw. 2 Sekunden, sollten wir mit 0.0x Werten rechnen oder die vergangenen Millisekunden zur Berechnung noch einmal durch 100 bzw. 1000 (je nachdem was du für richtig hälst) teilen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

7

02.02.2011, 09:37

Ich hab da noch einmal eine Frage und zwar wollte ich mir so eine Art Test-Pong schreiben, um die ganzen Sachen rund um SDL_Rect und den Timer zu lernen und jetzt scheitere ich grade an einer Sache:

Wie lasse ich den Ball oben und unten die ganze zeit abprallen?

Ich habe meine Surfaces nach oben und unten gelegt ( also zwei Balken ) und einen "ball", der in der Mitte spawned. Dazu habe ich noch eine Art Kollisionsabfrage geschrieben, die auch funktioniert, wenn der Ball nur einmal gegen den Balken oben oder unten kommt. Wie schaffe ich es also, den Ball nach der Kollision in die entgegen gesetzte Richtung zu befördern und dann die Kollisionsabfrage wieder aufzurufen, damit der Ball ständig an den Balken abprallt? Hier erstmal mein Test-Pong Programm: http://codepad.org/lAwIUZyg

Die Bewegung des "Balls" und die "Kollisionsabfrage" befinden sich in der "Spielschleife" ganz am Anfang. Ich weiß nicht genau ob das so richtig ist, deswegen hoffe ich, dass ihr mir helfen könnt.


Mit freundlichen Grüße



Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jawaiica« (02.02.2011, 11:50)


8

02.02.2011, 16:07

Du solltest deinem Ball einen Richtungsvektor verpassen: § \begin{pmatrix} dx \\ dy \end{pmatrix}§
Dabei stellt dx die Bewegung in x-Richtung dar und dy analog dazu die in y-Richtung. Also wenn beides z.B. 100 wäre, dann würde sich dein Ball pro Frame um 100 * FrameTime Pixel nach rechts und um gleichen Betrag nach unten bewegen. (Wenn man den Koordinatenursprung in der linken, oberen Ecke annimmt.) So kannst du einerseits die Richtung des Balls mit Hilfe dieses Vektors festlegen und gleichzeitig auch dessen Geschwindigkeit, die abhängig von der Länge des Vektors (Pythagoras) ist.
Bei einer Kollision oben oder unten, also sozusagen auf der y-Achse, multiplizierst du einfach die y-Komponente dieses Vektors mit -1 und bei einer Kollision links oder rechts, auf der x-Achse also, machst du gleiches mit der x-Komponente des Vektors. Das ist alles. Du musst also lediglich bei der Kollisionsüberprüfung zwischen "x- & y-Kollision" unterscheiden und das Vorzeichen der entsprechenden Vektorkomponente umdrehen.

In deinem Fall könnte das so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(Ball.x <= Spielfeld.x || Ball.x + Ball.width >= Spielfeld.x + Spielfeld.width)  // Kollision am linken oder rechten Rand des Spielfelds (also auf x-Achse)
{
    Ball_Richtungsvektor.dx *= -1;
}

if(Ball.y <= Schlaeger.y + Schlaeger.height || Ball.y + Ball.height >= Schlaeger.y)  // Kollision am oberen oder unteren Rand eines Schlägers (also auf y-Achse)
{
    Ball_Richtungsvektor.dy *= -1;
}

// Später den Ball bewegen
Ball.x += Ball_Richtungsvektor.dx * FrameTime;
Ball.y += Ball_Richtungsvektor.dy * FrameTime;


Gruß
SaRu_

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »SaRu« (02.02.2011, 16:14)


Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

9

02.02.2011, 21:06

Hallo,

danke für die Antwort, ich werde sie morgen gleich mal testen, doch nun quält mich wieder einmal ( ^^ ) ein anderes Problem und zwar wollt ich einen Hintergrund bewegen lassen, wenn ich mit einem Rect in die Nähe des Bildendes komme. Soweit so gut, ich hab auch schon ein wenig geschafft, jedoch nicht alles. Was mir noch fehlt ist folgendes:

Wenn ich mit dem Recht nach Links gehe, dann Bewegt sich der Hintergrund ja nach Rechts, nur andersrum geht dies nicht! Ich komme nicht unter die (0|0) von meinem Fenster. Nur wie soll ich so das Hintergrundbild nach Links bewegen lassen? Ich kann ja auch nicht in der Mitte des Bildes anfangen, da wenn ich einen -x Wert benutze, dieser automatisch auf 0 gesetzt wird.

Habt ihr vielleicht eine Idee?



Mit freundlichen Grüßen




Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

10

02.02.2011, 21:41


(Link)


Einfach nicht bei 0|0 beginnen.

Werbeanzeige