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.05.2017, 10:49

C#, XNA Wie kann ich die Erscheinungsposition eines Gegners errechnen?

Ich habe ein rotes Rechteck das sich um 360° drehen kann. Das Rechteck wird nach einer bestimmten Zeit an einem zufälligen Winkel stehen bleiben und dann soll am Ende des Rechtecks ein Gegner erscheinen. Der blaue Kreis soll die Erscheinungsposition des Gegners darstellen.
Wie kann man die Position des blauen Kreises bei einem zufälligen Winkel des roten Rechtecks errechnen?

Beispiel: Wenn der Winkel 45° beträgt, dann sieht das bei mir so aus, was jedoch falsch ist da der blaue Kreis an der falschen Position gezeichnet wird. Der Kreis muss immer am Ende des roten Rechtecks gezeichnet werden.
Bei Winkel 45°:
http://www.directupload.net/file/d/4722/64fpwwx7_png.htm

Nur wenn der Winkel 0° beträgt wird der Kreis bei mir an die richtige Position gezeichnet. Was muss ich an meinen Berechnungen ändern damit der Kreis auch bei anderen Winkeln(z.B. bei 45°) an die richtige Position gezeichnet wird?
Bei Winkel 0°:
http://www.directupload.net/file/d/4722/wa3maaj9_png.htm

Mein Code:

Quellcode

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
public class Game1 : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D RechteckTextur, KreisTextur;
        Vector2 RechteckPosition, KreisPosition;
        float Winkel;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.IsFullScreen = true;
        }


        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            RechteckTextur = Content.Load<Texture2D>("Rechteck");
            KreisTextur = Content.Load<Texture2D>("Kreis");
            RechteckPosition = new Vector2(400, 200);
            Winkel = MathHelper.ToRadians(45);
            KreisPosition = new Vector2(RechteckPosition.X, RechteckPosition.Y - RechteckTextur.Height/2 - KreisTextur.Height/2);
        }


        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            spriteBatch.Draw(RechteckTextur, RechteckPosition, null, Color.White, Winkel, new Vector2(RechteckTextur.Width / 2, RechteckTextur.Height / 2), 1.0f, SpriteEffects.None, 1.0f);
            spriteBatch.Draw(KreisTextur, KreisPosition, null, Color.White, Winkel, new Vector2(KreisTextur.Width / 2, KreisTextur.Height / 2), 1.0f, SpriteEffects.None, 1.0f);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }

2

15.05.2017, 15:57

Hey Big Santa!

Ich verstehe deinen Code zwar nicht, da ich noch nie mit C# bzw. mit XNA gearbeitet habe, aber ich versuche dir trotzdem zu helfen.

Meine erste Frage:
Welcher Punkt des Rechtecks ist die RechteckPosition? Das heißt um welchen Punkt dreht sich das Rechteck? Ich nehme anhand der zweiten zeichnung an, dass dieser Punkt auf der Hälfte der unteren Kante liegt. Liege ich da Richtig in meiner Annahme?

Ich sehe in deinen Berrechnungen nirgends einen Sinus oder Cosinus, welcher aber meiner Meinung nach unverzichtbar ist, wenn man die Position eines Objektes um einen gewissen Drehpunkt drehen will.

Um eine Drehung des Punktes A um den Punkt M (Position des Rechtecks) um den Winkel §\varphi§ im Uhrzeigersinn zu drehen, musst du folgende Formel verwenden:
§x = M_\text{x} - (A_\text{x} - M_\text{x}) * \cos (\varphi) + (A_\text{y} - M_\text{y}) * \sin (\varphi)§
§y = M_\text{y} - (A_\text{x} - M_\text{x}) * \sin (\varphi) - (A_\text{y} - M_\text{y}) * \cos (\varphi)§

In deinem Fall hat der zu drehende Punkt A die Koordinaten (§M_\text{x}§ | Höhe des Rechtecks + §M_\text{y}§ + Radius des Kreises)

Du musst dann nur noch den Kreis an den Koordinaten die du herausbekommst zeichnen.

Ich hoffe ich konnte dir helfen.

Grüße Patrick
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

3

15.05.2017, 17:31

Hey Big Santa!
Meine erste Frage:
Welcher Punkt des Rechtecks ist die RechteckPosition? Das heißt um welchen Punkt dreht sich das Rechteck? Ich nehme anhand der zweiten zeichnung an, dass dieser Punkt auf der Hälfte der unteren Kante liegt. Liege ich da Richtig in meiner Annahme?

Nein. Die RechteckPosition ist der Mittelpunkt(RechteckTextur.Width/2, RechteckTextur.Height/2) der RechteckTextur.


Um eine Drehung des Punktes A um den Punkt M (Position des Rechtecks) um den Winkel §\varphi§ im Uhrzeigersinn zu drehen, musst du folgende Formel verwenden:
§x = M_\text{x} - (A_\text{x} - M_\text{x}) * \cos (\varphi) + (A_\text{y} - M_\text{y}) * \sin (\varphi)§
§y = M_\text{y} - (A_\text{x} - M_\text{x}) * \sin (\varphi) - (A_\text{y} - M_\text{y}) * \cos (\varphi)§

In deinem Fall hat der zu drehende Punkt A die Koordinaten (§M_\text{x}§ | Höhe des Rechtecks + §M_\text{y}§ + Radius des Kreises)

Ich verstehe nicht was Punkt A ist. In meinem Fall würde die Formel ja so aussehen:
x = RechteckPosition.X - (Ax - RechteckPosition.X) * cos(Rotation des Rechtecks) + (Ay - RechteckPosition.Y) * sin(Rotation des Rechtecks)
y = RechteckPosition.Y - (Ax - RechteckPosition.X) * sin(Rotation des Rechtecks) - (Ay - RechteckPosition.Y) * cos(Rotation des Rechtecks)

Sind die Koordinaten von Punkt A in meinem Fall(wenn RechteckPosition der Mittelpunkt von RechteckTextur ist) immer:
X-Koordinate = RechteckPosition.X
Y-Koordinate = RechteckTextur.Height / 2 + RechteckPosition.Y + Radius des Kreises?

Was ist "Radius des Kreises"? Ist der Radius des Kreises in meinem Fall nicht auch "RechteckTextur.Height / 2" ?

4

15.05.2017, 17:41


Ich verstehe nicht was Punkt A ist. In meinem Fall würde die Formel ja so aussehen:
x = RechteckPosition.X - (Ax - RechteckPosition.X) * cos(Rotation des Rechtecks) + (Ay - RechteckPosition.Y) * sin(Rotation des Rechtecks)
y = RechteckPosition.Y - (Ax - RechteckPosition.X) * sin(Rotation des Rechtecks) - (Ay - RechteckPosition.Y) * cos(Rotation des Rechtecks)

Sind die Koordinaten von Punkt A in meinem Fall(wenn RechteckPosition der Mittelpunkt von RechteckTextur ist) immer:
X-Koordinate = RechteckPosition.X
Y-Koordinate = RechteckTextur.Height / 2 + RechteckPosition.Y + Radius des Kreises?

Was ist "Radius des Kreises"? Ist der Radius des Kreises in meinem Fall nicht auch "RechteckTextur.Height / 2" ?

Das mit den Koordinaten hast du richtig verstanden.

Mit "Radius des Kreises" meine ich einfach den Radius des blauen Kreises. Dieser Radius wird wahrscheinlich KreisTexture.Height / 2 sein. (bzw. KreisTexture.Width / 2, da die Kreistexture wahrscheinlich quadratisch ist)
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

5

17.05.2017, 15:04

Danke, es funktioniert so :)

6

17.05.2017, 16:06

Kein Problem :D
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Werbeanzeige