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
Alter Hase
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 |
/* geschwindigkeitsvektor v besteht hier aus der komponente speedx und speedy float speed = 1; float speedx = cos(m_rot)*speed; float speedy = sin(m_rot)*speed; // ich nehme an m_rot soll der aktuellen drehung der Rakete entsprechen float d1 = sqrt(pow(m_targetX-m_xPos,2)+pow(m_targetY-m_yPos,2)); // wenn m_targetX/m_targetY den Zielkoordinaten und m_xPos/m_yPos // den Raketen Koordinaten entspricht, dann ist das genau der Abstand // zwischen den beiden. //abstandsvektor zwischen rakete und ziel: float d1X=m_xPos-m_targetX; float d1Y=m_yPos-m_targetY; float laengeV1= sqrt(speedx*speedx+speedy*speedy) // =1 in deinem speziellen Fall; float deg = acos((d1X*speedx+d1Y*speedy)/(d1*laengeV1)); // das ist dann der winkel zwischen dem geschwindigkeitsvektor der rakete und dem vektor von rakete zu ziel m_xPos += speedx; //*time; z.B. zeit zwischen 2 frames // hier solltest du später mal noch die Zeit mit einbauen, da eigentlich x= vx*dt + x0; y=vy*dt + y0 gilt; m_yPos += speedy; //*time; // also ort=aktueller ort + geschwindigkeit * vergangener Zeit // in der abfrage rechnest du 180/360*2 was = 1 entspricht // wenn dein m_rot schon den winkel in rad angibt, brauchst auch nix umrechnen; die umrechnung bei dir ist auch so nicht richtig // also einfach m_rot+=deg; |
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 |
void cplayer::update(float vx, float vy) { float speed = 4; float tempx = cos(rot)*speed; float tempy = sin(rot)*speed; float lineB = distance(vx,vy,x,y); float lineA = distance(vx,vy,x+tempx,y+tempy); float deg = innerRad(lineA, lineB, speed); // hier von 0 bis pi if(deg <= DegToRad(2.0f)) { rot+= deg; } else if(deg >= 3.1415f) { rot+= DegToRad(2.0f); } else if(deg <= 3.1415f) { rot-= DegToRad(2.0f); } x += tempx; y += tempy; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#define pi 3.1415926f inline float DegToRad(float deg) { return 2.0f*pi*(deg/360.0f); } inline float distance(float x1, float y1, float x2, float y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } inline float innerRad(float lineA, float lineB, float lineC) { return acos( ( pow(lineB,2)+pow(lineC,2)-pow(lineA,2) )/ (2*lineB*lineC ) ); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
if (xRakete < xZiel) { m_rot+=deg; } else if (xRakete > xZiel) { m_rot-=deg; } |
Zitat von »"physX"«
hallo, warum prüfst du nicht einfach ob die x-koordinate deiner rakete rechts oder links von der x-koordinate deines ziels liegt, dann weisst du direkt in welche richtung du drehen musst.
also sowas wie
C-/C++-Quelltext
1 2 3 4 5 6 7 8 if (xRakete < xZiel) { m_rot+=deg; } else if (xRakete > xZiel) { m_rot-=deg; }
Werbeanzeige