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

15.02.2016, 18:05

2D Bullet bewegung

Hey,

Ich habe so eine Art Schiff, welches Schüsse in Mauszeigerrichtung verschießen soll. Das Klappt soweit auch alles, doch leider hatte ich einen kleinen Denkt fehler drinne, so dass je nach Mausposition im verhältnis des Ursprunges die Geschwindigkeit stark variiert.

Programmiert ist es in C# mit dem XNA framework:

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
        public Shoot(Vector2 start, Vector2 mousePos)
        {
            this.Position = start;
            this.Texture = Content_Manager.getInstance().Textures["schuss"];
            origin = new Vector2(Texture.Width / 2, Texture.Height / 2);
            activ = true;

            direction = mousePos - Position;
            angle = (float)Math.Atan2(direction.Y, direction.X); //zum drehen der bullets "laser schüsse"

            //float forceX = 0; //Hier müsste dan noch etwas gemacht werden so dass die Bullets alle gleich schnell sind
            //float forceY = 0;

            //if (direction.X <= 0) forceX += -1f;
            //if (direction.X >= 0) forceX += 1f;

            //forceY = direction.X / direction.Y;

            //direction = new Vector2(forceX, forceY);
        }

        public void Update(GameTime gameTime)
        {
            this.Position += direction * MOVEMENTSPEED * (float)gameTime.ElapsedGameTime.TotalSeconds * 0.005f; //Unschön und auch fehlerhaft. Aber so ähnlich sollte es aussehen
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(Texture, new Rectangle((int)Position.X, (int)Position.Y, Shoot.WIDTH, Shoot.HEIGHT), null, Color.White, angle + (float)(Math.PI * 0.5), origin, SpriteEffects.None, 1);
        }


Meine Gedanken bisher waren:
- Der Steigung eine Maximale geben. Als Beispiel 100. Mit dem umgestellten Pytagoras kommt man auf eine Fehlende Seite. // Klappt nicht :/
- Verhältnis bestimmen und um etwa 100 einpegeln lassen. (x > 100 && y > 100 dann vector*0.5 beim gegenteil *2) Klappte außer bei den Quadranten 1 und 3. (Schiff als Ursprung)
- x auf 1 setzen und y im verhältnis dazu. Will irgendwie nicht :/

2

15.02.2016, 18:22

Du schnappst dir den Vektor Start->CursorPosition und normalisierst ihn. Dann jeden Frame ihn mit dem Bewegungsschritt multipliziert zur Position addieren.

3

15.02.2016, 18:48

Schnell schmerzlos und einfach, besten dank dafür! Hat geklappt :-)

Werbeanzeige