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

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

1

24.05.2014, 14:37

[gelöst] SDL 1.2 Sprite bewegen (gedrückte Taste)

Ich wollte mal Fragen wie man das macht, damit man wenn man z.B die w Taste drückt und gedrückt hält ein Sprite mit einer bestimmten Geschwindigkeit z.B. nach oben bewegt wird. Ich habs bisher nur hibekommen, dass ich der Sprite 1x pro Tastendruck um den von mir festgelegten Wert in die gewollte Richtung verschiebt. Auch wenn ich die Taste gedrückt lasse, bewegt er sich nur dieses kleine Stück und bleibt stehen, er soll sich aber solange bewegen, bis die Taste nicht mehr gedrückt wird. Kann mir jemand helfen?

Hier erstmal meine eventschleife, wo ich das reingebastelt habe:

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
while (isrunning == true)   //solange spiel käuft
    {

        while (SDL_PollEvent (&event))  //solange man events bekommt
        {
            if (event.type == SDL_QUIT)
            {
                isrunning = false;
            }

            switch(event.type)
            {
            
            case SDL_KEYDOWN:
              keyPressed[event.key.keysym.sym] = true;
               break;
            case SDL_KEYUP:
               keyPressed[event.key.keysym.sym] = false;
              break;
            }


            if(keyPressed[SDLK_a]    && spieler.xpos > 0)      
            {
                spieler.moveplayerleft ();  // Bild nach links bewegen.
                karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                spieler.renderplayer (screen);
                SDL_Flip (screen);
            }
            if(keyPressed[SDLK_d]   && (spieler.xpos + 32) < 1280) 
            {
            
                spieler.moveplayerright ();  // Bild nach rechts bewegen.
                karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                spieler.renderplayer (screen);
                SDL_Flip (screen);
                
            }
            if(keyPressed[SDLK_w]      && spieler.ypos > 0) 
            {
                spieler.moveplayerup ();  // Bild nach oben bewegen.
                karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                spieler.renderplayer (screen);
                SDL_Flip (screen);
            }
            if(keyPressed[SDLK_s]    && (spieler.ypos + 32) < 960)  
            {
                spieler.moveplayerdown ();  // Bild nach unten bewegen.
                karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                spieler.renderplayer (screen);
                SDL_Flip (screen);
            }
            if(keyPressed[SDLK_ESCAPE])                                             
            {
                isrunning = false;        // Programm beenden.
            }

            }

    }


Ich bedanke mich schonmal für die Antworten!

MfG Khodos
Aktuelles Projekt: World of Kienz

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Khodos« (25.05.2014, 09:30)


2

24.05.2014, 15:22

Du bekommst ja auch mit Sicherheit nur ein Event, wenn die Taste gedrückt wurde (einzelnes Ereignis), aber nicht wenn sie gedrückt IST (Status). Da musst du schon die Eventabfrage rausnehmen an der Stelle ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

3

24.05.2014, 16:59

Ok, der Sprite bewegt sich zwar jetzt fast so wie er sollte, aber er hält nicht an, wenn ich die Taste loslasse, sondern erst, wenn er den Bildschirmrand erreicht hat.
Hat dafür jemand ne Lösung?
Wahrscheinlich bin ich einfach zu doof zum Programmieren :)
Aktuelles Projekt: World of Kienz

4

24.05.2014, 17:16

Dann hast du deine Logik dabei falsch durchdacht. Alternativ kannst du auch das KeyUp-Event abfangen, um die Bewegung zu stoppen.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

5

24.05.2014, 18:13

Mit SDL_KEYUP hab ich schon versucht, hat auch nicht funktioniert. An welche Stelle muss das genau? Ich hatte es hinter SDL_KEYDOWN gemacht.

Hier mein derzeitiger 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
while (isrunning == true)   //solange spiel käuft
    {
        timer.update ();

        if (SDL_PollEvent (&event)) //solange man events bekommt
        {
            if (event.type == SDL_QUIT)
            {
                isrunning = false;
            }

            if (event.type == SDL_KEYDOWN)
            {

                while (event.key.keysym.sym == SDLK_a && spieler.xpos > 0)      
                {
                    timer.update();
                    spieler.moveplayerleft ();  // Bild nach links bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }
                while (event.key.keysym.sym == SDLK_d   && (spieler.xpos + 32) < 1280) 
                {
            
                    spieler.moveplayerright ();  // Bild nach rechts bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                
                }
                while (event.key.keysym.sym == SDLK_w      && spieler.ypos > 0) 
                {
                    spieler.moveplayerup ();  // Bild nach oben bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }
                while (event.key.keysym.sym == SDLK_s    && (spieler.ypos + 32) < 960)  
                {
                    spieler.moveplayerdown ();  // Bild nach unten bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }
                if (event.key.keysym.sym == SDLK_ESCAPE)                                             
                {
                    isrunning = false;        // Programm beenden.
                }
    
            }

                    //hier hatte ich SDL_KEYUP reingebaut
        }

    }


Kanns auch sein, dass es an meiner Bewegungsfunktion liegt?

C-/C++-Quelltext

1
2
3
4
void CPlayer::moveplayerup ()
{
    ypos -= 1;   //Sprite um 1 nach oben verschieben 
}



Sorry, dass ich nerv, aber ist halt mein 1. Spiel und ich hab noch nicht so viel Erfahrung mit der SDL.
Aktuelles Projekt: World of Kienz

6

24.05.2014, 18:30

Pseudocode

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
while (bIsRunning)
{
    if (keyPressed[...])
        MovePlayerOrWhatever(...);       

    while (PollEvent(...))
    {
        // Update keyPressed[] here  ...
    }
}
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

24.05.2014, 19:17

Wirf einen Blick auf SDL_GetKeyState.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

8

25.05.2014, 09:32

Vielen Dank, Leute! Es funktioniert!

Hier nochmal der Code für alle, die das selbe Problem haben:

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
Uint8 *keystate = SDL_GetKeyState(NULL);

while (isrunning == true)   //solange spiel käuft
    {
        timer.update ();

        
                if (keystate[SDLK_a] == 1 && spieler.xpos > 0)      
                {
                    timer.update();
                    spieler.moveplayerleft ();  // Bild nach links bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }

                if (keystate[SDLK_d] == 1   && (spieler.xpos + 32) < 1280) 
                {
            
                    spieler.moveplayerright ();  // Bild nach rechts bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                
                }

                if (keystate[SDLK_w] == 1      && spieler.ypos > 0) 
                {
                    spieler.moveplayerup ();  // Bild nach oben bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }

                if (keystate[SDLK_s] == 1    && (spieler.ypos + 32) < 960)  
                {
                    spieler.moveplayerdown ();  // Bild nach unten bewegen.
                    karte.rendermap (gras, holz, sand, stein, ziegel, screen);
                    spieler.renderplayer (screen);
                    SDL_Flip (screen);
                }

        while (SDL_PollEvent (&event))  //solange man events bekommt
        {
            if (event.type == SDL_QUIT)
            {
                isrunning = false;
            }

            if (event.type == SDL_KEYDOWN)
            {

                
                if (event.key.keysym.sym == SDLK_ESCAPE)                                             
                {
                    isrunning = false;        // Programm beenden.
                }
    
            }

        }

    }
Aktuelles Projekt: World of Kienz

Werbeanzeige