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

1

14.11.2007, 21:49

Seltsamer Laufzeitfehler beim Scrolling

hey.....

hab hier ne kleine funktion um Scrolling mit der SDL zu verwenden.

Dazu habe ich einfach ein Framerect für den Hintergrund erstellt und erhöhe x immer bei tastendruck von Pfeil rechts bis x größer als Framebreite - Bildschirmbreite ist, dann wird die figur bewegt...

das funktioniert auch.

Nach links sollte das gleiche nur andersrum passieren, aber wenn man nach einer zeit zurück geht, geht man aus dem frame raus auf einen schwarzen hintergrund und kommt nicht mehr zurück auf den Frame...
hier ist mal die funtion, hoffe jemand kann mir helfen.

ps.: ich weiß, unübersichtlich^^ hatte nur ne idee fürs scrolling und wollte das mal testen

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
void Game()
{
    SDL_Surface *Player;
    SDL_Surface *Background;
    SDL_Rect PlayerRect;
    SDL_Rect BackgroundRect;
    SDL_Rect Background_Frame;
    float CurTime, LastTime, Elapsed = 0;
    float jumpTime = 0;
    bool jumpLock = false;
    Player = SDL_LoadBMP("data\\Player_Male.bmp");
    PlayerRect.x = 1024/2 - 128/2;
    PlayerRect.y = 500;
    PlayerRect.w = Player->w;
    PlayerRect.h = Player->h;
    SDL_SetColorKey(Player, SDL_SRCCOLORKEY, SDL_MapRGB(Player->format, 255,0,255));
    Background = SDL_LoadBMP("data\\Tree.bmp");
    BackgroundRect.x = 0;
    BackgroundRect.y = 0;
    BackgroundRect.w = Background->w;
    BackgroundRect.h = Background->h;
    Background_Frame.x = 0;
    Background_Frame.y = 0;
    Background_Frame.w = 1024;
    Background_Frame.h = 768;
    bool exit = false;
    LastTime = SDL_GetTicks() / 1000.0f;
    while(!(exit))
    {
        CurTime = SDL_GetTicks() / 1000.0f;
        Elapsed = CurTime - LastTime;
        LastTime = CurTime;
        SDL_FillRect(Screen, NULL, SDL_MapRGB(Screen->format, 0, 0, 0));
        SDL_BlitSurface(Background, &Background_Frame, Screen, &BackgroundRect);
        SDL_BlitSurface(Player, NULL, Screen, &PlayerRect);
        SDL_Flip(Screen);
        if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
        {
            if(!(block))
            {
                exit = true;
                block = true;
            }
        }
        else
        {
            block = false;
        }
        if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
        {
            if(Background_Frame.x < 3072 - 1024)
            {
                Background_Frame.x += 300.0f * Elapsed;
            }
            else
            {
                if(PlayerRect.x + PlayerRect.w < 1024)
                {
                    PlayerRect.x += 300.0f * Elapsed;
                }
            }
        }
        if(GetAsyncKeyState(VK_LEFT) & 0x8000)
        {
            if(Background_Frame.x > 0)
            {
                Background_Frame.x -= 300.0f * Elapsed;
            }
            else
            {
                if(PlayerRect.x >= 0)
                {
                    PlayerRect.x -= 300.0f * Elapsed;
                }
            }
        }
        if(GetAsyncKeyState(VK_SPACE) & 0x8000)
        {
            jumpTime += Elapsed;
            if((jumpTime < 0.5f) && (!(jumpLock)))
            {
                PlayerRect.y -= 500.0f * Elapsed;
            }
            else if(jumpTime >= 0.5f)
            {
                jumpLock = true;
                jumpTime = 0;
            }
            else
            {
                jumpTime = 0;
                if(PlayerRect.y >= 500.0f)
                {
                    if(jumpLock = true)
                        jumpLock = false;
                }
                else
                {
                    PlayerRect.y += 500.0f * Elapsed;
                }
            }
        }
        else
        {
            if(PlayerRect.y >= 500.0f)
            {
                    if(jumpLock = true)
                        jumpLock = false;
            }
            else
            {
                PlayerRect.y += 500.0f *Elapsed;
            }
        }
    }
}

2

17.11.2007, 22:17

hat hier einfach keiner ne ahnung oder seid ihr mal wieder alle zu faul...?

3

17.11.2007, 22:42

Ich bin mir nicht ganz sicher ob ich Dein Problem verstanden habe aber ich probiers trotzdem ;)

Der Spieler bewegt sich selbst erst nach rechts wenn der Hintergrund quasi schon "ansteht". Ist man aber schon ein Stück nach rechts gegangen und möchte wieder zurück bewegt sich wieder erst der Hintergrund bis er bei 0 angelangt ist.

Ist das soweit richtig?

Wenn "Nach Links" gedrückt wird müsstest Du den Spieler immer dann nach links bewegen wenn er sich rechts vom Mittelpunkt befindet ODER der Hintergrund schon "ansteht". Ansonsten wird der Hintergrund bewegt. (für Rechts natürlich alles umgekehrt)

Ich hoffe es war nicht völlig am Thema vorbei ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

17.11.2007, 22:46

Faul && keine Ahnung :lol:

Aber ich würd es an deiner Stelle mal mit bedingten Breakpoints analysieren -> also welche die z.b. nur anschlagen, wenn deine Werte kurz vorm linken Bildrand sind, wenn du dann zur Analyse mehrere Schleifendurchgänge per F10 durchgehen musst dann denk dran, Elapsed entsprechend zu verkleinern und nicht einfach die riesigen Werte zu verwenden, die beim Debuggen entstehen ;)

Anonymous

unregistriert

5

17.11.2007, 23:13

[rewb0rn]

6

17.11.2007, 23:17

@mahe: das ist genau das, was ich gemacht hab (glaub ich, hab deine erklärung nicht ganz verstanden^^)

@grek40: gute idee

@Dämlicher Vollidiot: wenn die antwort so einfach is, sach sie mir doch :evil: ...

Anonymous

unregistriert

7

17.11.2007, 23:21

[rewb0rn]

8

17.11.2007, 23:28

Nomen est omen... :lol:

9

17.11.2007, 23:41

gut gesagt^^

EDIT:
*alles erbsenzählerische deleten*
END EDIT

und guckt euch mal die Signatur an... -.-

10

17.11.2007, 23:54

Du machst eben nicht genau das was ich gesagt habe sonder nur fast ;)

Ich habe mir das eher so vorgestellt:

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
        if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
        {
            if((Background_Frame.x < 3072 - 1024)&&(PlayerRect.x => 1024/2 - 128/2))
            {
                Background_Frame.x += 300.0f * Elapsed;
            }
            else
            {
                if(PlayerRect.x + PlayerRect.w < 1024)
                {
                    PlayerRect.x += 300.0f * Elapsed;
                }
            }
        }
        if(GetAsyncKeyState(VK_LEFT) & 0x8000)
        {
            if((Background_Frame.x > 0)&&(PlayerRect.x <= 1024/2 - 128/2))
            {
                Background_Frame.x -= 300.0f * Elapsed;
            }
            else
            {
                if(PlayerRect.x >= 0)
                {
                    PlayerRect.x -= 300.0f * Elapsed;
                }
            }
        } 


Damit sich der Spieler auch wieder zurück zur Mitte bewegen kann.

Da ich aber nicht den ganzen Code durchgesehen habe kann ich auch komplett daneben liegen ;)

Werbeanzeige