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

11

02.02.2011, 21:51

Ok, aber wie genau mach ich das denn? Wie kann ich denn nur einen bestimmten bereich anzeigen lassen?
"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

12

02.02.2011, 22:27

Mit SDL_BlitSurface kannst du ebenfalls ein Rechteck des zu zeichnenden Bereichs deines Bildes übergeben. Dieses Rechteck schiebst du dann quasi hin und her um den Sichtradius zu verändern.

C-/C++-Quelltext

1
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

Zitat

If srcrect is NULL, the entire surface is copied[...]
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

13

15.02.2011, 16:11

Hallöchen,

ich wollte jetzt nicht unbedingt ein neuen Thread für mein kleines Problem aufmachen, weshalb ich diesen nochmal kurz nach oben "pushe". Hier mal mein Problem:

Ich habe mir eine Variable angelegt, die die Zeit in Sekunden speichert ( SDL_GetTicks() / 1000.f ). Was ich jetzt machen wollte ist, diese Zeit ausgeben, und nach einer bestimmten Bedingung gleich null setzen, damit diese Variable die Zeit wieder von vorne zählen kann. ( Zum Beispiel bei einer Uhr, wenn die Sekunden 60 sind, dann soll die Minute um 1 erhöht werden und die Sekunden wieder auf Null gestellt werden und das ganze geht wieder von vorn los. ) Ich weiß jetzt nicht, wie ich weiter machen soll =( ... Ich hab auch noch ein zweites "Zeit" Problem und zwar wollte ich für mein Pong eine art "pause" einfügen, die am Anfang 3 Sekunden runter zählt, bis das Spiel gestartet wird. Diese Pause soll dann jedesmal aufgerufen werden, wenn der Ball im aus war, und das Spiel "Reseted" wurde.

Habt ihr da vielleicht ein paar Tipps für mich? Ich hab mir schon ein paar Gedanken gemacht ( z.B. SDL_Delay( ) oder Sleep ( ) von der Windows header, aber das bringt ja nichts, da das Spiel ja dann um so viel ms langsamer läuft ).


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."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

15.02.2011, 17:05

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int delay = 0;
int minute = 0;

// Game Loop

delay++;

if ((delay / 1000) >= 60) {
    delay = 0;
    minute += 1;
}

Das sollte den gewünschten Effekt bringen. Und auch in dieser Art kannst du dein 3 Sekunden Pause Problem angehen.
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

15

16.02.2011, 18:37

Ich versteh das nicht so ganz... wieso denn delay / 1000 ? Wenn ich das so teste, dann ist delay ~6 bei 60 Sekunden. Wenn ich delay / 100 mache, dann ist delay ~62 bei 60 Sekunden. So genau ist das ja dann leider nicht =(
"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

16

16.02.2011, 19:32

Eine Sekunde sind 1000 Millisekunden. Deswegen, willst du 60 Sekunden, brauchst du 60000 Millisekunden.
Kannst du mal deinen Code posten?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

17

16.02.2011, 19:37

Das ist schon richtig Architekt, aber warum erhöhst du delay immer um 1 pro Schleifendurchgang. Man sollte das dann um die Zeit seit dem letzten Frame (in ms) erhöhen. ;)

Zum Beispiel so (habs lediglich in Sekunden - also float - geschrieben):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
float frametime; // Zeit pro Frame
float delay = 0.0f;

// Game Loop
delay += frametime;

if(delay >= 3.0f) // Länger als 3 Sekunden gewartet?
{
    std::cout << "3 Sekunden sind um. Jetzt tu etwas!" << std::endl;
    delay = 0.0f; // Zurücksetzen
}


Gruß
SaRu_

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

18

16.02.2011, 19:54

Oh, hab ich tatsächlich, sorry, mein Fehler (;
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

19

16.02.2011, 20:25

Hallo und danke für die Antworten, nur eine Frage ( hoffentlich die letzte^^ ) hätte ich da noch und zwar, wie berechne ich die Zeit seit dem letzten Frame?

also ich hab ja die aktuelle Zeit ( aktZeit = SDL_GetTicks() / 1000.f; )

muss ich die Zeit dann einfach an eine Variable weiter geben und die dann von einander abziehen oder was?^^ Also zb so:

aktZeit = SDL_GetTicks() / 1000.f;
iwasZeit = aktZeit;
altZeit = iwasZeit - SDL_GetTicks() / 1000.f;


ach ich hab keine Ahnung =(
"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."

20

16.02.2011, 22:55

Ja so ungefähr.

Du speicherst einfach bei jedem Schleifendurchlauf die aktuelle Zeit und hast die dann auch noch beim nächsten Schleifendurchgang zur Verfügung um die Frametime zu berechnen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
float last_time;

// Game Loop
while(...)
{
    float time = SDL_GetTicks() / 1000.0f; // Aktuelle Zeit holen
    float frametime = time - last_time;  // Frametime ist die Differenz aus der "letzten Zeit" und der aktuellen Zeit
    last_time = time; // "Letzte Zeit" aktualisieren

    // Mach etwas...

}



Gruß
SaRu_

Werbeanzeige