3

私は最近、SFML を使用して C++ で簡単なゲームを作成しています。これが私の質問です:

SFML ライブラリにはテンプレート クラスがありますVector2<T>(具体的には を使用しますVector2f)。残念ながら、それ自体を回転させる方法はありません。しかし、私が書いたように:

template<typename T> void Vector2<T>::Rotate(float a);

コンパイラは、次のようなことはできないと言っています。

printable.h:31:53: error: no ‘void sf::Vector2<T>::Rotate(float)’ member function declared in class ‘sf::Vector2<T>’

このようなカスタムメソッドを追加することは可能ですか? それとも、Vector2f を独自のクラスにラップする必要がありますか?

4

3 に答える 3

1

バニラ開発パッケージと SFML の完全な SDK ダウンロードの両方に、ベクター クラスの宣言/定義ファイルが含まれています。ファイル Vector2.hpp および Vector2.inl については、../include/SFML/System/ (いずれかのパッケージ内) を参照してください。回転関数を追加する 1 つの方法は次のとおりです。

次のように、rotate メソッドを Vector2.hpp のクラス宣言に追加します。

...stuff...

template <typename T>
class Vector2
{
 public :

 ....

 void Rotate(T angle);

 ....

 };

次に、vector2.inl でメソッドを定義します (規則に従うため)。

 template <typename T>
 void Vector2<T>::Rotate(T angle) {
      ...your implementation here...
 }

Vector2 クラスを変更する代わりに、Rotate 関数を含む非常に優れた SFML ベースの Thor ライブラリの拡張ベクトル数学関数を利用することもできます。Thor SDK の 2D ベクトル関数を利用するために必要な最小限の (変更されていない) ファイルは次のとおりです。

  1. ../include/Thor/Vectors/VectorAlgebra2d.hpp
  2. ../include/トール/詳細/VectorAlgebra2D.inl
  3. ../include/Thor/Math/Trigonometry.hpp
  4. ../src/Trigonometry.cpp

これらのファイルをプロジェクト ディレクトリに置くと、次のようにして sf::Vector を回転させることができます。

 #include <iostream>
 #include <SFML/Graphics.hpp>
 #include "VectorAlgebra2D.hpp"

....

sf::Vector2f rotate_THIS(10.0f,10.0f);
thor::Rotate(rotate_THIS, 180.0f); //pass by reference

std::cout << "(" << rotate_THIS.x << ", " << rotate_THIS.y << ")" << std::endl;

sf::Vector2f rotated = thor::RotatedVector(rotate_THIS, 180.0f); //returns object

std::cout << "(" << rotated .x << ", " << rotated .y << ")" << std::endl;

....

どの出力(予想通り):

(-10,-10)
(10,10)

プロジェクトの SFML ベクトル クラス テンプレートを変更する必要があるのと同じプロセスを経て、ソースを調べていくつかの関数 (Length と Dot Product) を追加した後、Thor ライブラリに出くわしました。これまでのところかなり順調です。

于 2011-05-11T11:13:57.163 に答える
0

あなたが考えているのは「モンキー パッチ」またはカテゴリと呼ばれるもので、C++ では利用できません。そのクラスから派生してその機能を追加するか、friend関数を作成して、実行しようとしているものを実装できます。(クラス定義内で定義された関数friendは、オブジェクトの内部状態にアクセスできます)

于 2011-05-06T20:31:35.400 に答える
0

クラス宣言で宣言されていない関数を実装しようとしているため、コンパイラは不平を言っています。クラス宣言にアクセスできる場合は、この関数を宣言に追加してから、今しようとしているように関数を定義できます。

于 2011-05-06T20:33:21.343 に答える