c++ - 添加方法到库

标签 c++ oop object sfml

我最近一直在使用 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 包装到我自己的类中?

最佳答案

SFML 的原始开发包和完整的 SDK 下载都包含 vector 类声明/定义文件。在 ../include/SFML/System/(在任一包中)中查找文件 Vector2.hpp 和 Vector2.inl。添加旋转功能的一种方法可能是:

将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 类的替代方法是使用 quite nifty, SFML-based Thor library 中的扩展 vector 数学函数。 ,其中包括旋转功能。要使用 Thor SDK 的 2D vector 函数,您需要的最小(未更改)文件是:

  1. ../include/Thor/Vectors/VectorAlgebra2d.hpp
  2. ../include/Thor/Detail/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 vector 类模板的相同过程,在查看源代码并添加了一些函数(长度和点积)之后,我偶然发现了 Thor 库,它到目前为止对我来说效果很好。

关于c++ - 添加方法到库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916681/

相关文章:

c# - 在方法中更改引用类型(字符串)

javascript - JS中使用OOP的几种格式

Java - 从 Jar 文件创建类

javascript - 将 JavaScript 对象的可变长度对象的属性连接到该对象的新属性中

C++:从外部在类内声明枚举器,因此可以在私有(private)成员中使用

c++ - C++ 宏的可选参数

c++ - 如果我使用同一个 key 两次推送用户数据会怎样?

c++ - 有什么方法可以在不知道它的大小的情况下制作一个字符数组

java - 遍历对象的变量(java)

javascript - 迭代对象属性