继承SFML中的Transformable和Drawable

2024-02-21

我试图继承 SFML 中的 Transformable 和 Drawable 以使我的对象......嗯,可变形和可绘制。我正在制作一个简单的突破游戏,但也许我的做法是错误的。这是我的代码:

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

class Player : public sf::Transformable, public sf::Drawable {
    public:
        Player(int x, int y);
        ~Player() {};

        sf::RectangleShape p_rect;

        void doMovement(const sf::RenderWindow& window);
        sf::FloatRect getGlobalBounds() const;
    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {
            states.transform *= getTransform();
            target.draw(p_rect, states);
        }

};

class Ball : public sf::Transformable, public sf::Drawable {
    public:
        Ball(int r, int x, int y);
        ~Ball() {};

        sf::CircleShape b_circle;

        void doXMovement();
        void doYMovement();
        bool doXCollisions(const Player& player);
        bool doYCollisions(const Player& player);
        sf::FloatRect getGlobalBounds() const;
    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {
            states.transform *= getTransform();
            target.draw(b_circle, states);
        }

        bool right;
        bool up;
};

Player::Player(int x, int y) {
    p_rect = sf::RectangleShape(sf::Vector2f(x, y));
}

void Player::doMovement(const sf::RenderWindow& window) {
    setPosition(sf::Mouse::getPosition(window).x, 500);
    if (getPosition().x < 0)
        setPosition(0, 500);
    else if (getPosition().x > 720)
        setPosition(720, 500);
}

sf::FloatRect Player::getGlobalBounds() const {
    return getTransform().transformRect(p_rect.getGlobalBounds());
}

Ball::Ball(int r, int x, int y) {
    b_circle = sf::CircleShape(r);
    b_circle.setPosition(x, y);
    right = true;
    up = false;
}

void Ball::doXMovement() {
    if (right)
        move(1, 0);
    else
        move(-1, 0);
}

void Ball::doYMovement() {
    if (up)
        move(0, -1);
    else
        move(0, 1);
}

bool Ball::doXCollisions(const Player& player) {
    bool coll;
    if (getGlobalBounds().intersects(player.getGlobalBounds())) {
        right = !right;
        coll = true;
    } else
        coll = false;

    if (getPosition().x >= 800 - b_circle.getRadius())
        right = false;
    else if (getPosition().x <= 0)
        right = true;
    return coll;
}

bool Ball::doYCollisions(const Player& player) {
    bool coll;
    if (getGlobalBounds().intersects(player.getGlobalBounds())) {
        up = !up;
        coll = true;
    } else
        coll = false;
    if (getPosition().x <= 0)
        up = false;
    return coll;
}

sf::FloatRect Ball::getGlobalBounds() const {
    return getTransform().transformRect(b_circle.getGlobalBounds());
}

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Breakout");
    window.setMouseCursorVisible(false);
    Player player(80, 10);
    Ball ball(3, 100, 100);
    sf::Clock clock;
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        player.doMovement(window);
        if (clock.getElapsedTime().asMilliseconds() >= 3) {
            clock.restart();
            if (!ball.doYCollisions(player))
                ball.doXCollisions(player);
            ball.doYMovement();
            ball.doXMovement();
        }
        window.clear(sf::Color::Black);
        window.draw(player);
        window.draw(ball);
        window.display();
    }
    return 0;
}

现在移动和绘图工作(几乎)按预期进行,但是碰撞有点不稳定。首先是我的碰撞问题:

  1. 我需要按照我的方式实现 getGlobalBounds 函数吗?或者是否有更好的方法来处理 Transformable 和 Drawable 中包含的内容?
  2. 我应该直接对形状执行转换,还是应该像现在一样将转换传递给绘图函数?

绘图中也发生了一些奇怪的事情,这可能是一个快速修复。现在, getPosition 方法为我的球对象返回不正确的值。它返回的区域似乎向下并向右移动了一点。有什么可能的原因吗?

感谢您能够提供的任何帮助!

编辑:也欢迎任何一般的 C++ 技巧,我仍然是初学者。


如果我是你,我会定义一个新类,称为TransformableAndDrawable像这样:

class TransformableAndDrawable : public sf::Transformable, public sf::Drawable {
    // Your code here
}

在此类中,您应该定义可转换类和可绘制类通常需要的所有成员。此外,在此类中,您应该定义可在可转换类和可绘制类中普遍实现的所有方法。然后,你的类应该继承自TransformableAndDrawable, 像这样:

class Player : TransformableAndDrawable {
    // Your code here
}

现在,第一个问题的答案是:我将在TransformableAndDrawable如果给定方法是通用方法,则对给定方法进行类化,因此所有继承自的类TransformableAndDrawable会有这个方法。

而不是给出不同的名称,例如p_rect and p_circle,用相同的名字命名这些成员,例如p_shape,所以你不会有命名问题。另外,我相信您可以将您的 p_shape 声明为祖先类或接口(我不知道您正在使用的库中定义了哪些类),并且仅在需要时指定形状的性质(无论是圆形或矩形或其他)。

至于第二个问题:我喜欢你实现事情的方式,但你犯了两个错误:

  • 它不可扩展:我们想要一个通用的解决方案,一个可以用于您现在和将来使用的任何形状的类,不是吗?
  • 它不够通用:当我想知道形状的全局边界时,我对形状的性质不感兴趣,我希望你的代码在我不知道的情况下处理形状的性质

简而言之,您应该执行以下操作:

  1. 创建一个包装类,该类将继承自Transformable and Drawable

  2. 在你的包装类中,对形状的性质不可知,尽可能通用,希望有一些类或接口是两者的祖先RectangleShape and CircleShape.

  3. 从包装类继承所有可绘制和可变换类,因此您将在类之间拥有共享功能

  4. 如果包装类中的某些内容不适用于从其继承的类,请覆盖该类中的方法。

EDIT:

我更详细地研究了您正在使用的库,发现有一个名为 Shape 的类,它是两者的祖先CircleShape and RectangleShape。因此,不要使用这些类Shape你的代码将更加通用和可重用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

继承SFML中的Transformable和Drawable 的相关文章

随机推荐

  • 将 JavaScript 变量发送到 PHP 变量 [重复]

    这个问题在这里已经有答案了 首先我认为我必须将 JavaScript 转换为 PHP 但后来我发现我不能 因为服务器和客户端执行 所以现在我只想发送一个变量 到 PHP 变量 当我点击一个按钮时 JavaScript 中的该函数就会执行 现
  • Java 和 .Net 正则表达式

    Java 和 Net Framework 正则表达式模式之间的区别 我正在尝试转换我的 Net Framework 但模式无效 谁能指出正则表达式模式的主要区别 例如我们如何命名java中的分组结构等等 有很多差异总结在这里 http ww
  • 比较 C# 中的双精度值

    I ve a double变量称为x 在代码中 x被赋值为0 1我在 if 语句中检查它比较x and 0 1 if x 0 1 不幸的是它没有进入if陈述 我应该使用Double or double 这背后的原因是什么 您能为此建议一个解
  • Selenium - 无响应脚本错误 (Firefox)

    这个问题以前曾被问过 但给出的答案似乎对我不起作用 问题是 当使用 Selenium 打开页面时 我会收到许多 无响应脚本 弹出窗口 引用不同的脚本 当我使用不带 Selenium 的 Firefox 打开页面时 没有出现任何错误 另外 奇
  • 我可以通过编程方式设置 Mercurial 配置选项吗?

    我正在寻找一种设置方法 hgrc配置项 而无需实际编辑文本文件 我正在尝试标准化设置hgrc跨多个开发人员 我想要一个像这样的命令 hg config ui username foo 但这也将该配置更改保存到hgrc file 看起来这应该
  • 通过 javascript 添加的输入字段不在 PHP $_POST 变量中。如何解决这个问题?

    我在 html 表中有一个表单 我通过 jquery 动态地将输入字段添加到表单中 当我在提交表单时进行 var dump 时 POST 数组没有添加的字段 为什么会发生这种情况 这是我的 js 的样子 add more del areas
  • n 个集合的所有组合的交集

    我需要帮助找到一种有效的算法来解决这个问题 Given n未排序的整数集 找到所有可能的组合n以及它们的交集 例如 Input n 3 Set 1 1 10 6 11 14 3 Set 2 3 7 11 9 5 Set 3 11 6 9 1
  • Protractor - 框架中的错误处理

    我们如何处理基于 Protractor Cucumber 的框架中的错误 有断言失败 这是真正的失败 并且 javascript 代码中存在错误 例如 未找到元素 数组为空 未定义的内容等 我希望以优雅的方式处理后者 目前量角器测试因上述错
  • 限制批处理脚本中生成的进程数量

    我遇到的情况与中描述的情况非常相似这个问题 https stackoverflow com questions 17236456 limiting the number of subshells spawned 但是是批量的 不是外壳 我制
  • 如何使用java解决selenium webdriver中的超时错误?

    My Html
  • macOS 和 XCode 中开发的辅助权限

    有没有办法在开发过程中默认为我在 XCode 中开发的应用程序提供可访问权限 我的想法是 我可以按下运行键并测试新代码 而无需跳过设置中的麻烦 对于部署来说显然这是行不通的 但是对于开发来说有没有办法将应用程序列入白名单 EDIT 这是我发
  • 在 Rails 3 中过滤 has_many :through 关系中的子对象

    问候 我有一个应用程序 其中Companies and Users需要通过某种方式彼此归属CompanyMembership模型 其中包含有关成员资格的额外信息 具体来说 用户是否是公司的管理员 通过布尔值admin 代码的简单版本 cla
  • 如何获取PDF的书签并将书签添加到新的pdf中?

    我正在将一个 PDF 合并到其他 PDF 它工作正常 但最终 PDF 中缺少书签 以下是PDF生成代码 Create One Page PDF with some text from reportlab pdfgen import canv
  • 使用标准库对 Agda 中的对/列表进行字典顺序排序

    Agda标准库包含一些模块Relation Binary Non StrictLex 目前仅适用于Product and List 我们可以使用这些模块轻松构建一个实例 例如IsStrictTotalOrder对于自然数对 即 open i
  • 我想用动画将 imageview 放置在不同的位置

    我试图在不同的位置设置多个图像 这是我的代码 任何人都可以帮助我在不同的位置设置 imageview void viewDidLoad super viewDidLoad frameX 45 0f frameY 60 0f imagearr
  • 如何使用迭代器迭代二维向量? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 all 我在 C STL 中使用向量来存储我的数据 我将它们传递到函数中或从函数中返回它们 然而 随着数据大小的增长 程序越来越慢 因此
  • 为什么 max 比 sort 慢?

    我发现max比sortPython 2 和 3 中的函数 Python 2 python m timeit s import random a range 10000 random shuffle a a sort a 1 1000 loo
  • 如何遍历嵌套在 ThemeProvider HOC 中的浅层组件?

    跟进该问题Github https github com cssinjs react jss issues 184 我有一个组件Comp导出时 包裹着injectSheet from reactjss 请参阅上的设置代码沙箱 https c
  • NSTimer SchedulerWithTimeInterval:target:selector:userInfo:repeats 不调用该方法

    计时器从不调用该方法 我究竟做错了什么 这是代码 NSTimer manualOverlayTimer NSTimer scheduledTimerWithTimeInterval 2 0 target self selector sele
  • 继承SFML中的Transformable和Drawable

    我试图继承 SFML 中的 Transformable 和 Drawable 以使我的对象 嗯 可变形和可绘制 我正在制作一个简单的突破游戏 但也许我的做法是错误的 这是我的代码 include