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 的 vanilla 开发包和完整的 SDK 下载都包含矢量类声明/定义文件。在 ../include/SFML/System/(在任一包中)中查找文件 Vector2.hpp 和 Vector2.inl。添加旋转功能的一种方法可能是:

在 Vector2.hpp 中的类声明中添加 rotate 方法:

...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 类的另一种方法是利用非常漂亮的基于 SFML 的 Thor 库中的扩展向量数学函数,其中包括一个 Rotate 函数。使用 Thor SDK 的 2D 矢量函数所需的最小(未更改)文件是:

  1. ../include/Thor/Vectors/VectorAlgebra2d.hpp
  2. ../include/Thor/Detail/VectorAlgebra2D.inl
  3. ../include/Thor/Math/Trigonometry.hpp
  4. ../src/三角函数.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 矢量类模板的相同过程,在查看了源代码并添加了一些函数(长度和点积)之后,我偶然发现了 Thor 库,它为我服务到目前为止还不错。

于 2011-05-11T11:13:57.163 回答
0

您正在考虑的称为“猴子补丁”或类别,在 C++ 中不可用。您可以从该类派生以添加该功能或创建一个friend函数来实现您正在尝试执行的操作。(friend在类定义中定义的函数可以访问对象的内部状态)

于 2011-05-06T20:31:35.400 回答
0

编译器抱怨是因为您试图实现一个未在类声明中声明的函数。如果您有权访问类声明,那么您可以将此函数添加到声明中,然后按照您现在尝试的方式定义该函数。

于 2011-05-06T20:33:21.343 回答