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

Anonymous

unregistriert

1

24.05.2006, 23:29

Jump Funktion

Unglaublich, ich fummel schon seit über einer Woche an dieser blöden
Jump Fuktion für mein Mario Game rum und kriege es einfach nicht hin!!!
Ich denke mal, dass ich jetzt genug rumgefummelt habe und frage jetzt
einfach mal nach Hilfe, ich hoffe der Code ist selbsterklärend...Mario soll
halt einfach solange hochspringen und sich nach rechts bewegen
solange A und die rechte Pfeiltaste gedrückt ist, wenn er bei
y = 865 angelant ist, soll er ganz einfach wieder runterfallen. Aber
stattdessen, bleibt er einfach in der Luft hängen und geht eventuell noch
höher oder er wechselt ganz schnell immer zwischen ca. 850 und 865...
Woran es liegt, dass y so hoch sein muss weiß ich nicht genau, jedenfalls
funktioniert die Funktion, wenn man einfach nur auf A drückt einwandfrei und
Mario bleibt auch auf den Boden stehen ohne Probleme, wenn man nichts
macht.

Naja hier ist der Code, Fragen beantworte ich selbstverständlich.

Läuft ohne Probleme:

Quellcode

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
else if(key[KEY_A] && !joypad->button[Joypad::RIGHT] && !joypad->button[Joypad::LEFT])
            {
                yn = mario->getY();

                if(right)
                {
                    mario->setDirection(Sprite::UP);
                }
                if(left)
                {
                    mario->setDirection(Sprite::DOWN);
                }

                if(yn >= 865 && !oben)
                {
                     yn -= 5;

                     mario->setY(yn);

                     if(yn <= 865)
                     {
                         oben = TRUE;
                     }
                }

                if(yn <= 970 && oben)
                {
                    yn += 5;

                    mario->setY(yn);

                    if(yn >= 970)
                    {
                        oben = FALSE;

                        if(right)
                        {
                            mario->setDirection(Sprite::RIGHT);
                        }
                        if(left)
                        {
                            mario->setDirection(Sprite::LEFT);
                        }
                    }
                }
            } 


Funktioniert nicht:

Quellcode

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
else if(key[KEY_A] && joypad->button[Joypad::RIGHT] && !joypad->button[Joypad::LEFT])
            {
                xright = mario->getX();
                yright = mario->getY();

                mario->setDirection(Sprite::UP);

                if(yright >= 865 && !rechtsoben)
                {
                    yright += 0.5;
                    xright += 5;

                    if(yright <= 865)
                    {
                        rechtsoben = TRUE;
                    }
                }
                
                if(yright <= 970 && rechtsoben)
                {
                    xright += 5;

                    if(yright >= 970)
                    {
                        rechtsoben = FALSE;
                    }
                }

                mario->setX(xright);
                mario->setY(yright);
            }


Levelkollisionsabfrage, funktioniert soweit auch ganz gut!

Quellcode

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
#include "lvlcollisions.h"

void lvl1(Sprite * mario)
{
    int y, x;
    
    x = mario->getX();
    y = mario->getY();

    if((x <= 330 && y >= 970))
    {
        y = 970;
    }

    if(x >= 330)
    {
        y += 5;

        if(x <= 332)
        {
            x = 332;
        }
    }
    
    mario->setY(y);
    mario->setX(x);
}


Das sollte ausreichen...

Hoffe ihr könnt mir helfen, mir ist es unerklärlich.

MfG DarkRaider.

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

2

25.05.2006, 00:23

ohne den code vollständig zu durchblicken (einfach zu müde)

bei rechtsoben wird doch nirgendwo das y wieder verringert oder irre ich mich. also ich sehe da zu mind kein y -= ...

ich hoffe ich hab da nichts übersehen...
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Anonymous

unregistriert

3

25.05.2006, 09:39

Das wird ja in der Levelkollisionsabfrage erledigt, ich hab es auch schon
in der Tastaturabfrage probiert, liefert das gleich ergebnis, in der einfachen
Jump Funktion, wo man nur A drückt, werde ich es wohl auch noch
rausnehmen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.05.2006, 09:43

Die ganze Vorgehensweise ist ... naja.
Hier mal ein Tipp, wie man es normalerweise macht: du hast eine vy-Variable, in welcher die vertikale Geschwindigkeit von Mario gespeichert wird. Wenn sie null ist, bleibt er auf derselben Höhe. Ist sie größer als null, fällt er, ist sie kleiner als null, fliegt er hoch (oder umgekehrt, je nach Koordinatensystem).
Jetzt gibt es die Schwerkraft, die in jedem Frame die vy-Geschwindigkeit erhöht, Mario also zum Fallen bringen will. Wenn unter ihm Boden ist, geht das natürlich nicht, und vy wird direkt wieder auf null gesetzt. Und wenn er nach oben gegen eine Wand springt, wird vy ebenfalls auf null gesetzt.
Springen funktioniert jetzt ganz einfach: wenn du die Springen-Taste drückst und Mario sich gerade nicht in der Luft befindet, dann wird vy auf einen bestimmten Wert gesetzt, z.B. -50. Mario springt dann also anfänglich mit 50 Pixeln pro Sekunde nach oben. Die Schwerkraft sorgt dafür, dass er irgendwann wieder runterfällt. Die Sprunghöhe kannst du verändern, indem du den Wert (hier -50) veränderst.
Wenn du eine variable Sprunghöhe machen willst, dann kannst du den Spieler erlauben, durch Gedrückthalten der Sprungtaste die vy-Geschwindigkeit immer noch ein kleines ins Negative zu "vergrößern", aber nur begrenzt, weil Mario sonst unendlich hoch springen könnte.
Die vy-Variable wird nun in jedem Frame dazu verwendet, die y-Koordinate von Mario anzupassen. y' = y + dt * vy, wobei dt die vergangene Zeit seit dem letzten Frame ist, in Sekunden.
Ich hoffe, das war verständlich.

Anonymous

unregistriert

5

25.05.2006, 09:53

Jo das hört sich logisch an :) ich werde es baldmöglichst ausprobieren
Danke!

Anonymous

unregistriert

6

26.05.2006, 21:51

Funktioniert einwandfrei, vielen Dank, hast mir echt geholfen ;)

Werbeanzeige