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

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

51

12.04.2009, 18:26

Ok, is eine scheiß methode! :? Nimm doch die zuvor her. Aber komm noch nicht ganz klar damit

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool framefunc() 
{ 
g_fCurrenTime = timeGetTime(); 

(...)  //1

return false; 
} 

bool Renderfunc() 
{ 
g_fElapsedTime = timeGetTime(); 

//Zeit Differenz ausrechnen! 

g_fTime = static_cast<float>((g_fElapsedTime-g_fCurrenTime)/1000.0f); 

(..) 
return true; 
}

kommt zwischen den Klammern(....) was wichtiges rein??

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

52

12.04.2009, 18:29

Ich denke nicht das du so einen Gameaufbau hast^^

Bei dir sieht es denke ich eher so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool MyGameLoop()
{

//Hier die Anfangszeit nehmen:

g_fCurrenTime = timeGetTime(); 

//Verarbeitung der Spiele Parameter

Player->Update(..);
Map->Render(..)
//usw...


//Hier die Schlusszeit nehmen

g_fElapsedTime = timeGetTime();

//DIfferenz ausrechnen

g_fTime = static_cast<float>((g_fElapsedTime-g_fCurrenTime)/1000.0f); 

return true;
}


D.h in g_fTime steht die Vergangene Zeit vom Anfang der Game Loop bis zum Ende sprich die DIfferenz, wie oben aufgezeigt.

Jetzt schreibst du dir eine Funktion die diesen Wert in seiner Signatur (Parameterliste) als Parameter hat. Diese Funktion addiert z.b die Zeiten und in deiner Shoot-Funktion deines "BulletManagers" überprüfst du wann dieser Wert die 2 erreicht hat (Hab oben schon durch 1000 geteilt d.h du rechnest hier mit sekunden!).

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

53

12.04.2009, 18:38

hoho, glaub das dieser Code wirclich ein bisschen mega für mein kleines konsolenspiels ist. Hab jetzt überhaupt keine Ahnung wie ich das jetzt einbauen soll. Hier mal der Code:

C-/C++-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
#include<stdlib.h>
#include<stdio.h>
#include<conio2.h>
#include<conio.h>
#include<iostream>
#include<windows.h>
#include<dos.h>
#include<time.h>
#include<list> 

#include"Raumschiffmodell.hpp"

using namespace std;

void gotoxy(int x,int y) 
{......} 

void clrscr()
{.......}

class Geschoss{........}; 

int main(){
    int x=40, y=21, xs=0, ys=0, kx=0, ky=0;     //Startposition und Kugelposition, Raumschiffposition

    int xg=79, yg=23;                           //Spielfeld

    int ib=2, beamer;                           //Beamer Zähler                   

    char antwort;
    list<Geschoss> kugeln1;                     //Liste1

    list<Geschoss> kugeln2;                     //Liste2

    list<Geschoss>::iterator iter; 

    srand (time_t(NULL));
    
   
    while(1){
    Sleep(70);
    beamer=rand()%xg;
    if(GetAsyncKeyState(0x41)){x--;}
    if(GetAsyncKeyState(0x57)){
        if(){         //Hier brauchte ich was mit dem timer

                kugeln1.push_back(Geschoss(x,y)); 
           
                } 
        } 
    if(GetAsyncKeyState(0x44)){x++;} 
    if(GetAsyncKeyState(0x53)){
            if(ib>=1){
               x=beamer;
               ib--;
               }
            }                                                  
    if(GetAsyncKeyState(0x1B)){exit(0);};
    
    gotoxy(x,y);
                                                                            
    clrscr();
    schiff(xs, ys, x, y);
    for (iter = kugeln1.begin(); iter != kugeln1.end(); ++iter) { 
            if(iter->Bewegung()) 
                kugeln2.push_back(*iter); 
            } 
    swap(kugeln2,kugeln1); 
    kugeln2.clear();           
    }
    _getch();
}
wie würdet ihr es machen?? mfg

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

54

12.04.2009, 18:46

Erst mal solltest du alles in deiner Mainfunktion kapseln. D.h das du dort nur noch Funktionsaufrufe drin hast und die Logik sich hinter den Klassen versteckt. Z.b so:

C-/C++-Quelltext

1
2
3
4
5
6
7
int main()
{
//Überprüft Tasteneingabe

Player->CheckInput();
//Rendert SPielefeld

Map->Render();
}


Dann ist das ganze einfach übrsichtlicher. Wenn du das soweit hast dann fügst du die Zeit Routinen hinzu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int main()
{
g_fCurrenTime = timeGetTime(); 
//Überprüft Tasteneingabe

Player->CheckInput();
//Rendert SPielefeld

Map->Render();
g_fElapsedTime = timeGetTime(); 

g_fTime = static_cast<float>((g_fElapsedTime-g_fCurrenTime)/1000.0f); 
}


So nun hast du schon mal die Zeit die dein Spiel für einen Durchlauf der Gameloop braucht. Jetzt musst du nur noch die Sache mit dem Geschoss regeln:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[cpp]
int main()
{
g_fCurrenTime = timeGetTime(); 
//Überprüft Tasteneingabe

Player->CheckInput();
//Rendert SPielefeld

Map->Render();
g_fElapsedTime = timeGetTime(); 

g_fTime = static_cast<float>((g_fElapsedTime-g_fCurrenTime)/1000.0f); 
g_pShoot->AddTime(g_fTime);
}

void CBulletManager::AddTime(float fTime)
{
this->m_fTime+=fTime;
}


So in deinem m_fTime steckt nun immer jeweils die vergangene Zeit. Hoffe ich konnte helfen.[/cpp]

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

55

12.04.2009, 18:52

Cool, werd das mal versuchen in die Tat umzusetzten. Danke für deinen ausführlich erklärten Vorschlag!!!

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

56

12.04.2009, 18:58

mhm, wie linkt man den Winmm.lib?? :( :oops:

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

57

12.04.2009, 19:01

Welche IDE?

VS08: Projekt Properties -> Linker -> Input -> Additional Dependencies

Achtung: Die Funktion TimeGetTime() gibt die die Aktuelle Systemzeit in Millisekunden! (10^-3)

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

58

12.04.2009, 19:05

MS VC++ 2008 exprss
Und welchen Datentyp hat g_fElapsedTime
mfg

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

59

12.04.2009, 19:08

die Notation impliziert den Datentyp

g_fElapsedTime .. g steht für global^^ f steht für float

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

60

12.04.2009, 19:10

danke, war mir nicht mehr sicher

Werbeanzeige