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

son of Rizzo

Frischling

  • »son of Rizzo« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Hanau

Beruf: Schüler

  • Private Nachricht senden

1

13.05.2008, 14:57

Ball fallen lassen

Hallo Community.
Ich hätte da mal ein Problem. Ich möchte mit der SDL (v.1.2.8 ) ein kleines programm schreiben , bei dem der benuzter die höhe eines balls bestimmt und wenn er auf die leertaste drückt, der ball runterfällt. An sich ein kleines progrämmelchen, doch ich scheitere daran, zu programmieren, dass der ball unten wieder hochspringt. Ich schaffe es immer nur so, dass der ball mal 5 pixel aus dem bild herausfällt mal landet er genau auf der linie und beim nächsten mal fällt er 25 pixel aus dem bild heraus, ehe er hochspringt. (der ball ist 40 pixel und mein Bildschirm ist 900 pixel hoch)
Es soll ja praktisch dynamisch berechnet werden wann er hochspringen muss, doch wie gesagt schaffe ich das nicht. Hat jemand eine Idee wie sowas funktioniert? :?:
Danke schonmal im voraus für die antworten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

13.05.2008, 15:11

Du musst halt für jeden folgenden Frame die Distanz zwischen Kollisionsebene und Ball testen. Liegt die Zielposition hinter der Ebene musst du die Strecke verkürzen.
@D13_Dreinig

3

13.05.2008, 16:31

Zitat

mal landet er genau auf der linie und beim nächsten mal fällt er 25 pixel aus dem bild heraus

du könntest die kollisions abfrage vor dem rendern machen

son of Rizzo

Frischling

  • »son of Rizzo« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Hanau

Beruf: Schüler

  • Private Nachricht senden

4

13.05.2008, 18:51

hallo danke für die schnellen antworten erstmal.
Ich hab es bis jetzt so gemacht:

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
while (!ende)
    {
        SDL_Delay (25);
        ballXY.y = ballY;
        SDL_FillRect(screen, &resetscreen,SDL_MapRGB(screen->format, 0, 0, 0));
        SDL_BlitSurface (ball, NULL, screen, &ballXY);
        SDL_Flip(screen);
        if (ballY == 860 || ballY > 860)
        {
            ende = 1;
            break;
        }
        if (ballY < 860)
        {
            ballY = ballY + counter;
            counter++;
        }
        if (ballY == 830)
        {
            ballY = ballY + 30;
            zaehler++;
        }   
        
            
    }


ich hab noch viel mehr sachen ausprobiert aber das hat alles in etwa zum selben ergebnis geführt.

Mein Hauptproblem ist:
Angenommen die Ball-Y-Koordinate ist 824.
Und der Counter ist nun bei bsp. 40. (Er erhöht sich ja, da der ball im fallen schneller wird)
Beim nächsten frame ist die Y-Koordinate dann bei 864. => Der ball hängt 4 pixel aus dem bild. (der ball hat ja eine höhe von 40 pixeln mein bildschirm 900)
Wenn ich dieses system "statisch" machen würde, wär das alles gar kein problem. Doch beim "dynamischen" (also wenn der ball immer eine andere höhe hat) ist die ball-Y-Koordinate vllt. beim nächsten mal bei 834, danach vllt bei 799 usw...

5

13.05.2008, 19:45

wenn ich das problem nicht komplett falsch verstanden hab dann würde es doch helfen die kollision vors rendern zu stellen und bei einer kollision die position zu korrigieren bevor es gerendert wird.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if (ballY >= 830)
{
   ende = 1;
   ballY = 830;
   break;
}
//[...]

//rendern


-waba

son of Rizzo

Frischling

  • »son of Rizzo« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Hanau

Beruf: Schüler

  • Private Nachricht senden

6

13.05.2008, 20:11

oh sorry. ich hab nicht aufgepasst.

C-/C++-Quelltext

1
2
3
4
5
if (ballY == 830)
        {
            ballY = ballY + 30;
            zaehler++;
        }    

hat da nichts zu suchen.
----------------------------------------------------------------------------------
Wenn ich die kollisionsabfrage oben hin setze hab ich ich immer noch das problem.
Angenommen der ball ragt 4 pixel aus dem bild, dann kann ich das ja einfach so machen

C-/C++-Quelltext

1
2
if (BallY > 860)
      BallY = 860;


mal angenommen die vorherige position war 840.
Und der counter ist bei 40.
Dann ist der ball bei 880 nach dem rendern, und damit 20 pixel aus dem bild gefallen.
wenn ich jetzt BallY = 860; mache, dann fliegt der ball zur hälfte aus dem Bild und wird dann wieder zurückgesetzt. (Sieht reichlich seltsam aus.)
Ich habe mir mal gedacht, dass man den ball einfach immer um 1 pixel bewegt, dafür halt die Wiederholrate beschleunigt. (Anstatt SDL_Delay (25)
SDL_Delay (2) oder so. ich werds gleich mal ausprobieren. obwohl ich schon üble erfahrungen mit zu schnellen wiederholraten gemacht hab.

son of Rizzo

Frischling

  • »son of Rizzo« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Hanau

Beruf: Schüler

  • Private Nachricht senden

7

13.05.2008, 20:51

So hab mal das hier gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (!ende)
    {
        SDL_Delay (counter);
        ballXY.y = ballY;
        SDL_FillRect(screen, &resetscreen,SDL_MapRGB(screen->format, 0, 0, 0));
        SDL_BlitSurface (ball, NULL, screen, &ballXY);
        SDL_Flip(screen);
        if (ballY == 860)
        {
            ende = 1;
            break;
        }
        if (ballY < 860)
        {
            ballY = ballY + 10;
            counter = counter / 2;
        }
        
        
            
    }


Die Idee ist, dass der ball 10 pixel in 1/40 sekunde zurücklegt. Wenn er dann aber 10 pixel in 1/20 sekunde zurücklegt (also dann 20 pixel pro 1/40 sekunde) müsste er ja immer doppelt so schnell werden wie vorher.

Funktioniert aber nicht, weil SDL_Delay nur int-werte aktzeptiert.
Der counter ist erst bei 40 ( am Anfang)
und dann nach dem :
1. Durchlauf bei 20
2. Durchlauf bei 10
3. Durchlauf bei 5
4. Durchlauf bei 2 (5 : 2 = 2.5 abrunden => 2)
5. Durchlauf bei 1
6. Durchlauf bei 0 (1 : 2 = 0.5 abrunden => 0)

Ab dem 6. Durchlauf hat der ball auch keine Beschleunigung mehr, so wie es in meinem 1. Code war.:?
So funktionierts wohl nicht. Hat einer von euch noch eine Idee?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

14.05.2008, 06:43

C-/C++-Quelltext

1
2
ende = 1;
            break;


Das ist hier irgendwie doppelt gemoppelt!
@D13_Dreinig

son of Rizzo

Frischling

  • »son of Rizzo« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Hanau

Beruf: Schüler

  • Private Nachricht senden

9

14.05.2008, 09:35

Guten morgen.
Gibt es vielleicht irgendeine Formel oder funktion, die den abstand zwischen ball und boden misst und dann die beschleunigung so regelt, dass der ball immer beim boden hochspringt?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

14.05.2008, 10:16

Möglich wäre eine physikalische Betrachtung bzw. Beschreibung. Dann stellt sich halt die Frage, wieviel Ahnung du schon von Physik hast, wie sehr dich eine entsprechende Lösung interessieren würde und welche Fälle abgedeckt werden sollen (nur freier Fall auf senkrechte Ebene oder auch schiefe Ebene, Energieerhaltung usw.).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige