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

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

21

25.07.2006, 18:43

Man kommt auch ohne Matrix aus, indem man anstelle des Richtungsvektor (CAuto::_direction) nur den Winkel speichert und modifiziert (wird zu CAuto::_angle). In OnTurnLeft/Right wird dann nur noch _angle angepasst.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CAuto::Move (float time)
{
  Vec2d direction (sin (_angle), cos (_angle)); // Bei 0° ist das Y.

  _location += time * _speed * direction;
}

void CAuto::OnTurnLeft (float time)
{
  _angle = ::fmodf (_angle - (TURN_SPEED * time), 2.0f * PI);
}


Wenn dir noch nicht klar ist, wie das mit den Vektoren (Multiplikation, Addition) funktioniert, solltest du dir das erst noch aneignen. (ohne Vektoren kann man in der Grafikprogrammierung keinen Blumentopf gewinnen) :idea: Das ist immer eine nette Übung sowas mal selbst zu schreiben... (es hat sicher jeder schonmal eine Klasse für Komplexe Zahlen geschrieben :))

Und wenn du was über Vektoren (2D, 3D oder n-D 8)) suchst, schnapp dir lieber ein Algebra-Buch für die Oberstufe. Bei Google findet man sicher zu viel zu dem Thema.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

22

26.07.2006, 16:28

Okay ich versuche das ganze jetzt mit Davids Buch umzusetzten. Ich habe jetzt mal den Code von Seite 55-57 genommen und in ein neues Projekt geschmissen. Allesrdings bekomme ich immer einen Fehler. Warum?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CVector
{
public:
    float x, y;     //Vektorkomponenten


    CVector(){}     //Standardkonstruktor (tut nichts)


    CVector(const CVector& v) : x(y.x), y(v.y){}            //Kopierkonstruktor

    
    CVector(const float vx, const float vy) : x(vx), y(vy)  //Konstruktor, der die angegeben Vektorkomponenten einsetzt

    {
    }

    inline CVector operator + (const CVector& a, const CVector& b)
    {
        return CVector(a.x + b.x , a.y + b.y);
    }
};


Quellcode

1
2
c:\Dokumente und Einstellungen\asdfasdf\Eigene Dateien\Visual Studio Projects\MoveVect2D\CVector.hpp(15): error C2804: Binärer Operator '+' hat zu viele Parameter
c:\Dokumente und Einstellungen\asdfasdf\Eigene Dateien\Visual Studio Projects\MoveVect2D\CVector.hpp(15): error C2333: 'CVector::operator`+'': Fehler in Funktionsdeklaration; Funktionstext wird übersprungen

Anonymous

unregistriert

23

26.07.2006, 16:30

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CVector
{
public:
    float x, y;     //Vektorkomponenten


    CVector(){}     //Standardkonstruktor (tut nichts)


    CVector(const CVector& v) : x(y.x), y(v.y){}            //Kopierkonstruktor

    
    CVector(const float vx, const float vy) : x(vx), y(vy)  //Konstruktor, der die angegeben Vektorkomponenten einsetzt

    {
    }

    inline CVector operator+ (const CVector& a, const CVector& b)
    {
        return CVector(a.x + b.x , a.y + b.y);
    }
};


So müsste es eigentlich gehen Oo

EDIT: Ich habe es zumindest ohne Leerzeichen zwischen operator und +
gemacht und es funzt ohne Probs Oo

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

24

26.07.2006, 16:31

weil du + nicht innerhalb des Klassenrumpfs definieren darfst... nur jene, welche eine referenz auf sich selbst zurückgeben...
also return *this;
sprich: =, +=, *=, ... usw

Alle anderen werden außerhalb definiert und deklariert
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

25

26.07.2006, 16:34

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CVector
{
public:
    float x, y;     //Vektorkomponenten


    CVector(){}     //Standardkonstruktor (tut nichts)


    CVector(const CVector& v) : x(y.x), y(v.y){}            //Kopierkonstruktor

    
    CVector(const float vx, const float vy) : x(vx), y(vy)  //Konstruktor, der die angegeben Vektorkomponenten einsetzt

    {
    }

    inline CVector& operator+ (const CVector& a, const CVector& b);
};


C-/C++-Quelltext

1
2
3
4
5
cpp Datei:
inline CVector::CVector& operator+ (const CVector& a, const CVector& b);
    {
        return CVector(a.x + b.x , a.y + b.y);
    }


Dann müsste es so ungefähr gehen ;)

EDIT: Ich sollte mehr nachdenken :roll:

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

26

26.07.2006, 16:37

Eher so:

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
class CVector 
{ 
public: 
    float x, y;        //Vektorkomponenten 


    CVector(){}        //Standardkonstruktor (tut nichts) 


    CVector(const CVector& v) : x(y.x), y(v.y){}            //Kopierkonstruktor 

    
    CVector(const float vx, const float vy) : x(vx), y(vy)    //Konstruktor, der die angegeben Vektorkomponenten einsetzt 

    { 
    }  

    CVector& operator += (const CVector& v)
    {
        x += v.x; y+= v.y;
        return *this;
    }
};

inline CVector operator + (const CVector& a, const CVector& b) 
{ 
    return CVector(a.x + b.x , a.y + b.y); 
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

27

26.07.2006, 16:42

Habs getestet, so lässt es sich ohne Probleme builden:

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
class CVector
{
public:
    float x, y;        //Vektorkomponenten


    CVector(){}        //Standardkonstruktor (tut nichts)


    CVector(const CVector& v) : x(v.x), y(v.y){}            //Kopierkonstruktor

   
    CVector(const float vx, const float vy) : x(vx), y(vy)    //Konstruktor, der die angegeben Vektorkomponenten einsetzt

    {
    } 

    CVector& operator += (const CVector& v)
    {
        x += x; y+= y;
        return *this;
    }
};

inline CVector operator + (const CVector& a, const CVector& b)
{
    return CVector(a.x + b.x , a.y + b.y);
} 


(Oben beim Konstruktor war noch ein kleiner Fehler ;) )

EDIT: Und die Definition sollte in einer cpp Datei ausgeführt werden.
Normalerweise sollte die ganze Klasse in einen Namespace, aber okay ;)

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

28

26.07.2006, 17:11

Was ist das denn für ein Hin-und-her hier? :)

Der binäre Plus-Operator erwartet zwei Operanden. Als erstes das Objekt der aktuellen Klasse (implizit) als zweites ein anderes Objekt als Parameter. Es sei denn, es ist eine statische Methode oder eine klassenunabhängige Funktion, dann werden die zwei Operanden beide als Parameter übergeben (wie ja auch bereits angegeben wurde). Jedoch ist eine Klassenmethode viel schöner, oder?

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
class CVector
{
public:
    float x, y;        //Vektorkomponenten


    CVector(){}        //Standardkonstruktor (tut nichts)


    CVector(const CVector& v) : x(v.x), y(v.y){}            //Kopierkonstruktor

   
    CVector(const float vx, const float vy) : x(vx), y(vy)    //Konstruktor, der die angegeben Vektorkomponenten einsetzt

    {
    }

    CVector& operator += (const CVector& v)
    {
        x += v.x; y+= v.y;
        return *this;
    }

    CVector operator + (const CVector& v)
    {
        return CVector( x + v.x, y + v.y );
    }
};


Leerzeichen sind absolut egal...
Kommen Sie nie mit einem Schwert zu einer Schießerei.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

29

30.07.2006, 18:29

@rklaffehn:

Ist es absicht, dass du dir in dem Beispiel am Anfang dieser Seite einen 2DVectortyp baust und der dann drei Komponenten hat. Es reichen für 2D ja eigentlich zwei.

@All:

Ich meine aber schon mal was gelesen zu haben, dass man auch bei 2D drei Dimensionen brauchen kann (klingt unlogisch, weiß ich). Hat jemand schon mal etwas ähnliches gehört/gelesen?

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

30

30.07.2006, 19:05

antwort zu @all: ja bei terrain rendering

Werbeanzeige