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

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

1

26.03.2011, 17:54

[SFML2] Die Länge eines Vectors auslesen

Moin!

Ich bin gerade dabei, die Kollisionserkennung für mein Spiel zu programmieren.
Ich verwende C# und SFML.NET 2.0, habe das Spiel aber schon mit XNA fertiggestellt.
Da ich es aber nicht jedem zumuten will, nur weil er/sie mein Spiel testen will, gleich
das XNA Redist installieren zu müssen, setze ich das ganze nochmal mit SFML.NET um.

Nun aber zur Frage: Die Kollisionserkennung ist sehr, sehr, sehr simpel gemacht und sieht
mit XNA so aus:

C#-Quelltext

1
2
3
4
5
6
7
8
public bool CollisionTest(Vector2 point, float radius)
{
    if ((point - position).Length() < this.radius + radius)
    {
        return true;
    }
    return false;
}

Aber SFML hat keine Methode "Vector2.Length()". Gibt's denn trotzdem irgendeine
möglichkeit, den selben Wert wie mit Vector2.Length() auch in SFML zu bekommen?

2

26.03.2011, 18:05

du könntest die Länge ja per Hand mit

C-/C++-Quelltext

1
int length = sqrt( a.x*a.x + a.y*a.y );

berechnen (wenn a dein Vektor ist)

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

3

26.03.2011, 18:39

habe es jetzt so versucht:

C#-Quelltext

1
2
3
4
5
Vector2 newPos = point - position;
double length = Math.Sqrt((newPos.X * newPos.X) + (newPos.Y * newPos.Y));
if (length < radius)
    return true;
return false;

Aber das scheint nicht zu funktioinieren...
Hab' ich da was vertascht?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

26.03.2011, 18:57

An der Rechnung ist nichts falsch, aber die Klammern sind überflüssig. Du musst auch eigentlich den Radius von beiden Objekten addieren (wenn position die Mitte der Objekte darstellt).

Was heißt überhaupt "scheint nicht zu funktionieren"? Was funktioniert genau nicht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

26.03.2011, 19:00

Schaut eigentlich nicht so schlecht aus. Die Wurzel kannst du dir übrigens sparen und stattdessen einfach mit dem Quadrat des Radius vergleichen.

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

6

26.03.2011, 19:47

Es hat geklappt!
Ich habe es jetzt so gemacht:

C#-Quelltext

1
2
3
4
5
6
7
8
public bool CollisionTest(Vector2 point, float radius)
{
    Vector2 newPos = point - position;
    double length = Math.Sqrt(newPos.X * newPos.X + newPos.Y * newPos.Y);
    if ((float)length < this.radius + radius)
        return true;
    return false;
}

Danke für eure Hilfe :)

// Edit:
Hätte jetzt aber noch eine Frage: Wie lässt sich am besten ein Wave-System verwirklichen?
Also zu Anfang werden z.B. 2 Gegner gespawnt. Wenn diese Tot sind, startet Wave 2 und es werden 5
Gegner gespawnt. Ich habe das bis jetzt mit einem Timer gemacht, aber da muss ich jede Wave einzeln
festlegen... Gibt's da eine möglichkeit, das ganze dynamischer umzusetzen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BLU3 L30PARD« (26.03.2011, 20:00)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

26.03.2011, 22:09

Natürlich, z.B. pro Runde/Zeitintervall die Gegnerzahl (musst du dir dann speicher, am besten als float) mit einem Faktor multiplizieren. Dann rundest du das und erzeugst nach dieser Zahl Gegner.

Ein Beispiel:

Zeitintervall: 1 Minute
Faktor: 1.5

1 Minute: 1.5 Gegner = 1 Gegner spawnt
2 Minuten: 1.5*1.5 = 2 Gegner spawnen
3 Minuten: 2.25*1.5 = 3 Gegner spawnen
4 Minuten: 3....*1.5 = 5 Gegner spawnen
...

Der Faktor ist jetzt vielleicht nicht ganz optimal, du kannst auch aus der Zeit noch Stufenweise eine Erhöhung der Gegneranzahl berechnen:

+Gegner = runde(Minuten/2)

Dann kommen alle 2 Minuten noch extra Gegner hinzu, die kannst du ja auf das float rechnen und der Faktor erhöht die Gegner dann noch stärker...

Nur eine Idee, gibt natürlich 1000 Möglichkeiten, aber so merkt der Spieler keine "regelmäßige" Erhöhung der Gegner, auch wenn es das vielleicht ist.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

8

27.03.2011, 00:50

Übrigens ist das Ziehen einer Wurzel verhältnismäßig langsam. Sollte jetzt nicht sonderlich relevant sein, aber dennoch ist es sinnvoll bei solchen Funktionen, wo man nicht unbedingt die Wurzel zu ziehen braucht mit der Länge als Quadrat zu rechnen.

Werbeanzeige