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

20.01.2020, 15:50

c++ Schuss richtung Muas Position bewegen

Hallo Leute,
Wie schon in der Beschreibung angegeben möchte ich das sich der schuss richtung der Mausposition bewegt.

Also ich bin so an die Sache rangegangen jedoch funktioniert das nicht so ganz (Schwer zu beschreiben was passiert wenn ich ein schuss abgebe) :dash: :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CShot::Update(float Player_x,float Player_y)
{
    double Delta_x, Delta_y;
    int mouse_x; 
    int mouse_y;
    SDL_GetMouseState(&mouse_x, &mouse_y);
    
    Delta_x = Player_x - mouse_x;
    Delta_y = Player_y - mouse_y;
    double Angle = (atan2(Delta_y, Delta_x) * 180.0) / 3.14159265;

    m_ShotAngleX = Player_x * cos(Angle);
    m_ShotAngleY = Player_y * sin(Angle);

    m_xPos += m_ShotAngleX + 10.0f * Timer->GetTimeElapsed();
    m_yPos += m_ShotAngleY + 10.0f * Timer->GetTimeElapsed();

}


Hat da jemand eine Idee was ich da falsch mache? ?(

Ich bedanke mich im voraus für eure Hilfe :)

2

20.01.2020, 20:54

Hab mal ein wenig drüber geschaut.

[1] Muss

Delta_x = Player_x - mouse_x;
Delta_y = Player_y - mouse_y;

nicht anders herum sein?

Delta_x = mouse_x - Player_x;
Delta_y = mouse_y - Player_y;

Damit verschiebt sich der Nullpunkt zur Spielerposition und Delta umkreist den Spieler.

[2] Warum rechnest du Bogenmaß zu Grad? Die atan2, cos und sin Funktionen dürften das selbe System benutzen.

[3] Mit cos und sin bekommt man die x, y Schussrichtung mit der Länge 1. Diese Schussrichtung musst du Speichern und in jedem Update mit der vergangenen zeit und der Geschwindigkeit Multiplizieren.
Also:

m_ShotAngleX = cos(Angle);
m_ShotAngleY = sin(Angle);

m_xPos += m_ShotAngleX * 10.0f * Timer->GetTimeElapsed();
m_yPos += m_ShotAngleY * 10.0f * Timer->GetTimeElapsed();

Also sollte es 2 Funktionen geben:

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
void CShot::StarteSchuss(float Player_x, float Player_y)
{
    double Delta_x, Delta_y;
    int mouse_x; 
    int mouse_y;
    SDL_GetMouseState(&mouse_x, &mouse_y);
    
    Delta_x = mouse_x - Player_x; //[Edit] hatte ich falschrum eingefügt
    Delta_y = mouse_y - Player_y; //[Edit] hatte ich falschrum eingefügt

    double Angle = atan2(Delta_y, Delta_x);

    m_ShotAngleX = cos(Angle);
    m_ShotAngleY = sin(Angle);

    m_xPos = Player_x;
    m_yPos = Player_y;
}

void CShot::UpdateSchuss()
{
    m_xPos += m_ShotAngleX * 10.0f * Timer->GetTimeElapsed();
    m_yPos += m_ShotAngleY * 10.0f * Timer->GetTimeElapsed();
}


Wenn ich nicht alles verzapft hab müsste es ungefähr so funktionieren.
Ich hoffe ich konnte dir helfen.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Hannes« (20.01.2020, 21:24)


3

20.01.2020, 21:29

Vielen lieben Dank hat geklappt :thumbsup:

Musste nur die Delta's umkehren

C-/C++-Quelltext

1
atan2(-Delta_y, -Delta_x);
.

[2] Habe davor noch eine Funktion geschrieben wo ich den Winkel berechnet habe, damit der Spieler richtung der Mausposition schaut (Da brauchte ich den Winkel in grad) und hab mir den code ohne nachzudenken rauskopiert :dash:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »phizle« (20.01.2020, 23:22)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

21.01.2020, 01:33

Statt (umständlich) die Richtung in einen Winkel umzurechnen und dann aus dem Winkel x und y mit sin und cos zu berechnen kannst du auch einfach den Delta-Vektor normalisieren, indem du x und y jeweils durch sqrt(x²+y²) teilst (Satz des Pythagoras).

5

22.01.2020, 20:33

Hab es so gemacht. Ist tatsächlich weniger umständlich :thumbsup: Danke dir

Werbeanzeige