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

11

16.01.2010, 12:19

Irgendwie so, du musst es natürlich noch einbauen

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
float speedY=0;//Geschwindigkeit auf der Y-Achse

int Y = 1;//Höhe   

bool isJump=false
const int grav=10;//Gravitation(Die Bewegung nach unten)

const int maxY=30;//Maximale Höhe

    
int main() {
    while(1) {
        grav();
        if(App.GetInput().IsKeyDown(sf::Key::Space))
           {
              speed+=15;//den Wert musst du ausprobieren

                 } 
        }
        
}

void grav() {
    float ElapsedTime = App.GetFrameTime();//Verstrichene Zeit

    speed-=grav * ElapsedTime;//Runterziehen

    Y+=speed * ElapsedTime;//Neue Position für Y berechnen

    if((Y>=0) AND (maxY>Y)) {//Wenn Y nicht unter dem Boden ist und auch nicht über der Decke ist

        sprites[0].Move(0, Y);  //Übertragen

        }
    else if(Y>=0) { //Wenn Y die Maximalhöhe überschritten hat

        Y=maxY;
        sprites[0].Move(0, Y);  //Übertragen

        speed=0;
        }
    else { //Wenn Y unter dem Boden ist

        Y=0;
        sprites[0].Move(0, Y);  //Übertragen

        speed=0;
    }       
        
}


Frage einfach, wenn du es nicht verstehst(es könnten auch Fehler drin sein)
[/code][/cpp]

12

17.01.2010, 17:31

So, hab jetzt den Code genommen, bissel berichtigt,
aber trotzdem funzt es nicht, nichts passiert, nichtma ne bewegung.

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
void CJumper::Jump(void)
{ 

float speedY=0;//Geschwindigkeit auf der Y-Achse

int blub = 0; //jaja ich weiß solche nahmen sind nicht gerade toll, 

//sollte aber nur zum test sein.


float Y = 1; //Höhe   

bool isJump=false;
const int grav=10; //Gravitation(Die Bewegung nach unten)

const int maxY=30; //Maximale Höhe 

float ElapsedTime = App.GetFrameTime(); //Verstrichene Zeit


if(blub == 0)
{
    if(App.GetInput().IsKeyDown(sf::Key::Space))
    {
        speedY = +15;//den Wert musst du ausprobieren

    }
}      
speedY -=grav * ElapsedTime; //Runterziehen

Y =+ speedY * ElapsedTime; //Neue Position für Y berechnen

if((Y>=0) && (maxY>Y)) //Wenn Y nicht unter dem Boden ist und auch nicht über der Decke ist

{
    Sprites[0].Move(0, Y);  //Übertragen

}
else if(Y>=0) //Wenn Y die Maximalhöhe überschritten hat

{ 
    Y=maxY;
    Sprites[0].Move(0, Y);  //Übertragen

    speedY=0;
}
else //Wenn Y unter dem Boden ist

{        
    Y=0;
    Sprites[0].Move(0, Y); //Übertragen

    speedY=0;
}   
}


Was istn da jetze noch falsch?
Hab auch schon ein bisschien rum getestet
ging dann aber immer noch nicht.. :?

13

17.01.2010, 19:22

Es funktioniert aus einen einfachen Grund nicht:
Du definierst die Variablen Y und speedY bei jedem aufruf neu, so bleibt dein Sprite immer auf Position 1 hängen.
(Was soll eigentlich die Variable blub bewirken :) )

Ich würde übrigens das Sprinngen nd die Gravitation voneinander trennen
Also:

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
class CJump 
{
    private:
    
        float speedY=0;//Geschwindigkeit auf der Y-Achse

        int Y = 1;//Höhe   

        const int grav=10;//Gravitation(Die Bewegung nach unten)

        const int maxY=100;//Maximale Höhe 

        
    public:
    
        void jump();
        void grav();
        
};

void CJump::jump() {
    if(App.GetInput().IsKeyDown(sf::Key::Space))
    {
        speed+=15;//den Wert musst du ausprobieren

    } 
}

void CJump::grav() {
    float ElapsedTime = App.GetFrameTime();//Verstrichene Zeit

    Y+=speed * ElapsedTime;//Neue Position für Y berechnen

    if((Y>=0) && (maxY>Y)) {//Wenn Y nicht unter dem Boden ist und auch nicht über der Decke ist

        sprites[0].Move(0, Y);  //Übertragen

        }
    else if((Y>=0) && (maxY<Y)) { //Wenn Y die Maximalhöhe überschritten hat

        Y=maxY;
        sprites[0].Move(0, Y);  //Übertragen

        speed=0;
        }
    else { //Wenn Y unter dem Boden ist

        Y=0;
        sprites[0].Move(0, Y);  //Übertragen

        speed=0;
    }   
    speed-=grav * ElapsedTime;//Runterziehen

}

int main() {
    //GANZ VIEL CODE

    CJump Jumper;
    while(1) {
        Jumper.jump();
        Jumper.grav();
    }
    //GANZ VIEL CODE

}

14

17.01.2010, 20:20

Danke schonmal, aber immer wenn ich versuche Variablen
private du Defenieren/Deklarieren kommt das hier:

Zitat

CJumper::speedY": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.

...usw.


hab auch ein static davor gemacht, geht aber nicht.

C-/C++-Quelltext

1
2
3
4
5
6
private:

   static float speedY=0;//Geschwindigkeit auf der Y-Achse

   static int Y = 1;//Höhe   

   static const int grav=10;//Gravitation(Die Bewegung nach unten)

   static const int maxY=100;//Maximale Höhe 


Ich weiß nicht ob ich spinne, aber sonst hat das doch immer
funktioniert... liegts daran das ich Visual Studio 2010 Beta 2 installiert
hab? Ist das ne neuerung, oder bin ich nur blöd?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

15

17.01.2010, 20:28

wie wärs wenn du dir nochmal die grundlagen der klassen anschaust?
initialisiere die variablen im konstruktor und nicht bei der klassendeklaration
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

16

17.01.2010, 20:51

Ach, ich trottel :roll: (Das kommt davon wenn man Copy/Past benutzt)
Hier nochmal richtig:

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
const int gravi=10;//Gravitation(Die Bewegung nach unten)

const int maxY=100;//Maximale Höhe


class CJump
{
    private:
   
        int speedY;//Geschwindigkeit auf der Y-Achse

        int Y;//Höhe   

       
    public:
   
        void jump();
        void grav();
    CJump();
       
};

CJump::CJump() {
        speedY=0;
        Y=1;
}
void CJump::jump() {
    if(App.GetInput().IsKeyDown(sf::Key::Space))
    {
        speedY+=15;//den Wert musst du ausprobieren

    }
}

void CJump::grav() {
    float ElapsedTime = App.GetFrameTime();//Verstrichene Zeit

    Y+=speedY * ElapsedTime;//Neue Position für Y berechnen

    if((Y>=0) && (maxY>Y)) {//Wenn Y nicht unter dem Boden ist und auch nicht über der Decke ist

        sprites[0].Move(0, Y);  //Übertragen

        }
    else if((Y>=0) && (maxY<Y)) { //Wenn Y die Maximalhöhe überschritten hat

        Y=maxY;
        sprites[0].Move(0, Y);  //Übertragen

        speedY=0;
        }
    else { //Wenn Y unter dem Boden ist

        Y=0;
        sprites[0].Move(0, Y);  //Übertragen

        speedY=0;
    }     
    speedY-=gravi * ElapsedTime;//Runterziehen

}

int main() {
    //GANZ VIEL CODE

    CJump Jumper;
    while(1) {
        Jumper.jump();
        Jumper.grav();
    }
    //GANZ VIEL CODE

}

17

17.01.2010, 21:02

Ok, jetzt gehts, wenn ich aber Leertaste drücke fliegt er nach unten
und macht nicht wirlich ein Sprung, ganzam anfang wenn ich das
Spiel öffne rutscht er auch ein bissian runter.

Außerdem, wenn ich while(1) benutze, stürtz das Spiel ab,
deswegen nehme ich immer das:

C-/C++-Quelltext

1
2
3
4
5
        int blub = 0;
        if(blub == 0) { 
        Jumper->Jump();
        Jumper->grav();
        }


Variablen sind jetzt Konstant. Trotzdem fliegt
der runter wenn ich leertaste drüce, und wenn ich den
Wert umkehre also hier:
Sprites[0].Move(0, -Y); //Übertragen

Fliegt er nach oben, aber desto länger ich die leertaste drücke
desdo schneller er hoch geht, und runter kommt er auch nicht.

... :?

18

17.01.2010, 21:34

Das while(1) war ja auch nur als Beispiel zu verstehen, es ist klar, dass du es so nicht verwenden kannst.
Er rutscht am Anfang etwas nach unten, weil Y=1 ist und er erst bei 0 stoppt
Ja, mir ist gerade aufgefallen, dass du

C-/C++-Quelltext

1
maxY>Y

durch

C-/C++-Quelltext

1
maxY>=Y

ersetzen musst, damit dürfte er nicht mehr hängen bleiben
Zu dem schneller werden:
Das ist verständlich, weil bei jdem durchgang 15 hinzuaddiert wird.
Du musst einfach eine boolsche Variable erstellen, wo drin gespeichert ist, ob dein Männchen gerade springt.
Also:

C-/C++-Quelltext

1
2
3
4
5
6
7
if(!isJump) {
if(App.GetInput().IsKeyDown(sf::Key::Space))
    {
        speedY+=15;//den Wert musst du ausprobieren

        isJump=true;
    } 
}

und wenn Y gleich 0 ist, setzt du es auf false
(Darauf hättest du aber auch selber drauf kommen können, ich kann dir nicht alles harklein erklären)[/cpp]

19

17.01.2010, 21:43

jaa :), habs auch noch vor deinem post hinbekommen, ehrlich. 8)
Wollte gerade schreiben das ichs gelöst hab, warst aber schneller. :D

Jetzt Jump ich mal ein bissian rum weil ich dazu gelernt hab. :D
Danke für alles!
Bis zum nächsten Problem. :badgrin:

20

17.01.2010, 21:47

Kein Problem :)

Werbeanzeige