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

02.12.2012, 23:48

Problem mit der Flugbahn

Meine Spielfigur(Delphin) soll so ähnlich springen können wie in diesem Video: http://www.youtube.com/watch?v=ooU6cTeirlQ
Mein Delphin soll sich dabei nicht so viel in der Luft drehen, sondern nur so viel wie er sich auch in Wirklichkeit drehen würde. Mein Spiel soll etwas realistischer sein.
Was muss ich an meinem Code ändern damit sich der Delphin viel schneller bewegt und dabei viel kürzere Sprünge macht? Im Moment legt der Delphin extrem lange Sprünge hin da er eine halbe Ewigkeit in der Luft bleibt :(
Außerdem habe ich noch ein weiteres Problem mit dem Sprung. Wenn der Delphin sehr hoch springt kommt er auf einmal nicht mehr normal nach unten. Er wird zuerst langsam nach oben gezogen und fällt dann langsam nach unten. Ich vermute dass die Schwerkraft ab einer gewissen Höhe zuerst entgegengesetzt wirkt(der Delphin wird durch die Kraft hochgezogen), bevor sie danach wieder normal wirkt und der Delphin langsam nach unten fällt. Ich weiß aber nicht warum das passiert ?(
Die Rotation(Blickrichtung des Delphins) ändert sich im Moment auch noch nicht richtig während des Sprungs. Der Delphin dreht sich manchmal um 180° anstatt dauernd nur um wenige Grad(wie es in Wirklichkeit ist).
Was muss ich an der Rotation ändern damit der Delphin sich nicht um 180° dreht?

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
public class Game1 : Microsoft.Xna.Framework.Game 
{ 
        GraphicsDeviceManager graphics; 
        SpriteBatch spriteBatch; 
        Texture2D image, wasser; 
        float Gravity = 10.0F; 
        float JumpStrength = 40.0F; 
        Vector2 Position = new Vector2(1200,620); 
        Vector2 Velocity; float rotation = 0; 

        public Game1() 
        { 
            graphics = new GraphicsDeviceManager(this); 
            Content.RootDirectory = "Content"; 
            graphics.PreferredBackBufferWidth = 1280; 
            graphics.PreferredBackBufferHeight = 720; 
        } 

        protected override void Initialize() 
        { 
            base.Initialize(); 
        } 
        
        protected override void LoadContent() 
        {    
            spriteBatch = new SpriteBatch(GraphicsDevice); 
            image = Content.Load<Texture2D>("delphingrau"); 
            wasser = Content.Load<Texture2D>("meerwasser"); 
        } 
      
        protected override void Update(GameTime gameTime) 
        { 
            float time = (float)gameTime.ElapsedGameTime.TotalSeconds; 
            KeyboardState kbState = Keyboard.GetState(); 

            if(kbState.IsKeyDown(Keys.Left)) 
            { 
                Velocity.X -= 200.0F; 
            } 

            if(kbState.IsKeyDown(Keys.Right)) 
            { 
                Velocity.X += 200.0F; 
            } 
  
            // der Sprung darf nur ausgeführt werden wenn der Delphin ein kleines Stück unter Wasser ist 
            if(Position.Y >= 670) 
            { 
                if (kbState.IsKeyDown(Keys.A)) 
                    Velocity.Y = -JumpStrength; 
            } 
            else 
            { 
                Velocity.Y += Gravity * time; 
            } 

            Position += Velocity * time; 
            Velocity.X = 0; 
            if (Position.Y + image.Height/2 > graphics.PreferredBackBufferHeight) 
                Position.Y = graphics.PreferredBackBufferHeight - image.Height/2; 
            rotation = (float)Math.Atan2(Velocity.Y, Velocity.X); 
            base.Update(gameTime); 
        } 
    
        protected override void Draw(GameTime gameTime) 
        { 
            GraphicsDevice.Clear(Color.CornflowerBlue); 
            spriteBatch.Begin(); 
            spriteBatch.Draw(wasser, new Rectangle(0, graphics.PreferredBackBufferHeight -100, graphics.PreferredBackBufferWidth, 100), Color.White); 
            spriteBatch.Draw(image, Position, null, Color.White, rotation, new Vector2(image.Width/2, image.Height/2), 1, SpriteEffects.None, 1); 
            spriteBatch.End();            

            base.Draw(gameTime); 
        } 
    }


Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

03.12.2012, 10:57

Dein Ansatz die Geschwindigkeit einfach immer um +-200 beim Tastendruck zu ändern ungeachtet der Zeitabstände zwischen den Update-Aufrufen könnte problematisch sein. Das Gleiche beim JumpStrength. Realisier das lieber als Beschleunigungen ähnlich der Gravitation.
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.

3

03.12.2012, 12:54

Das würde ich auch so machen..
neben deiner Gravity hast du dann z.B. noch eine Beschleunigung a..

wenn links gedrückt..
vx += a*t
rechts..
vx -= a*t

unten..
vy += a*t
oben..
vy -= a*t

wobei t die Framezeit ist

den Winkel w musst du in Abhängikeit der Vorzeichen von vx und vy berechnen..
w = atan(y/x)
wenn vorzeichen xy =..
++ : w + 0°
-+ : w + 180
-- : w + 180
+- : w + 360

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.12.2012, 13:07

Dein Problem mit den langen Sprüngen ist eigentlich recht simpel. Bewegung ist in Horizontale und Vertikale Bewegung gesplittet. Das machst du bei dir ja schon richtig. Für die Flugdauer ist es an sich egal, ob der Delphin sich auf der X-Achse bewegt. Interessant ist nur die Bewegung auf der Y-Achse. Bei dir im Code wird der Y-Wert des Velocity Vektors so lange verringert, wie der Delphin unter der Wasseroberfläche ist und gleichzeitig der Knopf dafür gedrückt wird. Das passiert also nicht nur einen Frame, sondern sehr viele. Es gibt Situationen, wo so etwas gewollt ist, dann müsstest du nur mit den Werten Spielen. Dabei könnte es auch hilfreich sein zwischen Gravitation und Sprungkraft zu unterscheiden. Oft möchte man jedoch auch, dass der Sprung nur im ersten Frame erkannt und verarbeitet wird. Nur im ersten Frame, in welchem die Sprungtaste gedrückt wird, wird die Beschleunigung nach oben berechnet. Ansonsten ist das aber allgemein sehr sehr viel ausprobieren bis man vernünftige Werte hat und das ganze entsprechend aussieht. Was natürlich hilfreich sein kann ist mit Physikalisch korrekten Werten zu beginnen und sich dann in di Richtung weiter zu entwickeln, in welche man gehen möchte. Meistens sind Sprünge in Spielen ja übertriebener als in der Realität.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

04.12.2012, 10:50

Ich habe meinen Code jetzt stark verändert. Wichtig. Ich möchte es nun so machen dass der Delphin nicht mehr die Spielfigur ist.
Leider habe ich noch ein Problem mit der Geschwindigkeit. Wenn sich der Delphin in eine Richtung(links oder rechts) bewegt kommt er einfach nicht zum Stehen wenn man die Taste(links oder rechts) loslässt. Man wird dann gezwungen in die entgegengesetzte Richtung zu drücken damit der Delphin langsamer wird. Was muss ich ändern damit die Geschwindigkeit viel schneller abnimmt wenn der Delphin zum Stehen kommen soll?

Wie berechne ich die maximale Sprunghöhe des Delphins? Ich möchte wissen an welcher maximalen y-Position sich der Delphin befinden kann. Wäre das in meinem Fall 720-40f= 680 ? Oder ist die Rechnung falsch?
Ich möchte es nämlich so machen dass der Delphin im fertigen Spiel nicht die Spielfigur ist, sondern nur ein Tier das sich im Hintergrund(unter der Wasseroberfläche) bewegt und manchmal ein paar Sprünge ausführt. Ich dachte mir das so mit der Rotation:
Beim Absprung wird der Delphin um 45° gedreht, am höchsten Punkt des Sprungs wird die Rotation auf 0 gesetzt, kurz danach wird die Rotation auf -45° gestellt. Was haltet ihr von der Rotations-Idee? Ist sicher noch nicht perfekt, sieht aber wahrscheinlich schon nicht schlecht aus.

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
117
public class Game1 : Microsoft.Xna.Framework.Game     { 
        GraphicsDeviceManager graphics; 
        SpriteBatch spriteBatch; 
        Texture2D image, boden; 
        float Gravity = 5.0F; 
        float beschleunigung = 20.0F; 
        Vector2 Position = new Vector2(1200,720); 
        Vector2 Velocity; 
        float rotation = 0; 
        SpriteEffects flip; 
        Vector2 Speed = new Vector2(0, 0); 

        public Game1() 
        { 
            graphics = new GraphicsDeviceManager(this); 
            Content.RootDirectory = "Content"; 
            graphics.PreferredBackBufferWidth = 1280; 
            graphics.PreferredBackBufferHeight = 720; 
        } 

        protected override void Initialize() 
        { 
            base.Initialize(); 
        } 
        
        protected override void LoadContent() 
        {    
            spriteBatch = new SpriteBatch(GraphicsDevice); 
            image = Content.Load("delphingrau"); 
            boden = Content.Load("background"); 
            flip = SpriteEffects.None; 
        } 

        protected override void UnloadContent() 
        { 
            // TODO: Unload any non ContentManager content here 
        } 
      
        protected override void Update(GameTime gameTime) 
        { 
            float VelocityX = 0f; 
            float VelocityY = 0f; 

            float time = (float)gameTime.ElapsedGameTime.TotalSeconds; 
            KeyboardState kbState = Keyboard.GetState(); 
            if(kbState.IsKeyDown(Keys.Left)) 
            { 
                rotation = 0; 
                flip = SpriteEffects.None; 
                VelocityX += -5f; 
            } 

            if(kbState.IsKeyDown(Keys.Right)) 
            { 
                rotation = 0; 
                flip = SpriteEffects.FlipHorizontally; 
                VelocityX += 5f; 
            } 
  
            // der Sprung darf nur ausgeführt werden wenn der Delphin ein kleines Stück unter Wasser ist 
            if(Position.Y >= 670) 
            { 
                if (kbState.IsKeyDown(Keys.A)) 
                {      
                    if (flip == SpriteEffects.None) 
                    { 
                      rotation = 45; 
                      VelocityY += 40f; 
                    } 
                    else 
                    { 
                      rotation = -45; 
                      VelocityY += 40f; 
                    } 
                } 
            } 
            else 
            { 
                VelocityY += -10f; 
            } 

            // Geschwindigkeitsänderungen 
            float deltaY = 0; 
            float deltaX = 0; 

            // Gravitation wirken 
            deltaY = Gravity * (float)gameTime.ElapsedGameTime.TotalSeconds; 

            // Beschleunigung wirken lassen 
            deltaX += VelocityX * (float)gameTime.ElapsedGameTime.TotalSeconds * beschleunigung; 
            deltaY += -VelocityY * (float)gameTime.ElapsedGameTime.TotalSeconds * beschleunigung; 

            // Geschwindigkeitsänderung auf den Delphin anwenden 
             Speed = new Vector2(Speed.X + deltaX, Speed.Y + deltaY); 

            // Neue Position des Delphins ermitteln 
            Position += Speed * (float)gameTime.ElapsedGameTime.TotalSeconds; 

            Velocity.X = 0; 

            if (Position.Y + image.Height/2 > graphics.PreferredBackBufferHeight) 
                Position.Y = graphics.PreferredBackBufferHeight - image.Height/2; 

            base.Update(gameTime); 
        } 
    
        protected override void Draw(GameTime gameTime) 
        { 
            GraphicsDevice.Clear(Color.CornflowerBlue); 
            spriteBatch.Begin(); 
            spriteBatch.Draw(boden, new Rectangle(0, graphics.PreferredBackBufferHeight -100, graphics.PreferredBackBufferWidth, 100), Color.White); 
            spriteBatch.Draw(image, Position, null, Color.White, MathHelper.ToRadians(rotation), newVector2(image.Width / 2, image.Height / 2), 1, flip, 1); 
            spriteBatch.End();            

            base.Draw(gameTime); 
        } 
    } 

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.12.2012, 14:17

Deine Fragen sind nicht sehr konkret. Wenn der Delphin nicht gesteuert wird, kannst du die Bewegung auch einfach vorher festlegen. Wenn du die maximale Höhe haben willst, dann guck doch mal deinen Code an. Führ ihn doch einfach mal mit Zettel und Stift aus. Schreib dir die Variablen mit jeweiligem Wert auf und dann wiederholst du das für jeden Frame. Da bei der Bewegung die Zeit mit reinspielt, solltest du das mal für verschiedene Zeitintervalle versuchen. Vielleicht mal für zwei Frames pro Sekunde testen, dann mal für mehrere Frames pro Sekunde. Dann bekommst du das recht schnell raus.
Ansonsten scheint mir die Aufgabe aber vielleicht noch etwas zu hoch für dich zu sein. Deine Fragen gehen recht Grundlegende Probleme an, welche man mit ein wenig Erfahrung gut selbst lösen kann. Ohne dich von deinem Projekt abbringen zu wollen, solltest du bei deinen Projekten überlegen dir nicht zu viel vorzunehmen. Jeder sollte mal Spiele wie Pong, Breakout, Duckhunt, Tetris, Sokoban, Minesweeper etc gemacht haben. Das sind natürlich nur ein paar Beispiele, aber alles Spiele die nicht zu viel Logik besitzen (wobei Tetris und auch Minesweeper schon ein paar Kniffe benötigen).
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

04.12.2012, 14:42

Am Anfang wollte ich den Delphin selbst steuern. Nun möchte ich es aber so machen dass der Delphin sich selbständig bewegt. Dafür möchte ich per Zufall bestimmen wann, wie hoch und wie schnell der Delphin springt. Ich weiß nicht so recht ob ich dafür mit float oder integer Zahlen(für die Bewegungen) arbeiten soll. Ist es in meinem Fall besser mit float zu arbeiten?

8

04.12.2012, 14:43

Ja, vielleicht fehlten dir die physikalischen Zusammenhänge.
Hier werden Äpfel und Birnen zusammengerechnet. Obenderein, das Spiel läuft unterschiedlich schnell auf verschiedenen Rechnern. Die Änderung der Geschwindigkeit ist Frameabhängig, muss aber eine Funktion der Zeit sein f(Zeit/Frame).
Ich würde estmal versuchen bischen Ordnung reinzubringen. Ich würde mir 3 Beschleunigungen überlegen: eine für die waagerechte Bewegung und eine für die Senkrechte. Letztere ist dann also die für den Sprung und könnte daher um einiges größer sein als erstere. Die Sprungbeschleunigiung lässt du nur kurz wirken. Die 3. Beschleunigung resultiert aus dem Auftrieb unter Wasser.

nur mal so zum Probieren..

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
a1 = 20;//Waagerecht
a2 = 2000://Sprung
a3 = 15;//Auftrieb

if(kbState.IsKeyDown(Keys.Right)) 
{ 
    ...
    Speed.X +=  a1 * time; 
} 
    
if(Position.Y >= 670) 
{ 
    if (kbState.IsKeyDown(Keys.A)) 
    {    
        ... 
        Speed.Y -=  a2 * time; 
    }
}
else
{
    Speed.Y -= a3 *  time; //Nicht ganz ok, weil Auftrieb an jeder Position unter Wasser wirkt
}
    ...


...
Speed.Y +=  Gravity * time;//Gavitation ist allgegenwärtig

Position += Speed * time;

9

08.12.2012, 10:50

Ich möchte den Delphin jetzt springen lassen ohne dass ich dafür die Taste A drücken muss. Ich weiß aber nicht wie ich das machen soll. Müsste man dafür nicht vor dem Absprung eine maximale Sprunghöhe definieren? Die Sprungbewegung des Delphins ist eine Art Halbkreis, und der Delphin muss beim Absprung ja wissen wie hoch dass er springen soll.
Wie geht man hier vor?

Werbeanzeige