微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置对象相对于其他对象的位置

如何解决设置对象相对于其他对象的位置

所以我尝试学习游戏开发,我想让我的角色可以移动它的肘部。 the elbow looks like this,它由 2 个精灵组成,arm1 和 arm2。 arm1 可以以其原点为基准旋转,arm2 应位于 arm1 的尖端(距 arm1 原点约 60 px)。但我不知道如何将 arm2 放在 img 中的正确位置。我尝试使用极坐标,因为我知道角度和臂距

@Bot.event
async def on_ready():
    print(Bot.user," è ora online ","ID: ",Bot.user.id)
    attesa = 100
    global canale #The problem is there
    while (True):
        frase = choice(frasi_ad_effetto)
        await sleep(attesa)
        global canale
        global menzione
        await canale.send(menzione + ',' + frase)

,但这不起作用。我使用圆和线只是为了调试。 完整代码如下所示:

        lines[0].position=Vector2f(arm1.getPosition().x,arm1.getPosition().y);
        lines[0].color=Color::Blue;

        armPos.x=arm1.getPosition().x+(d*cos(AngletoRad(arm1.getRotation()-toleransi) ));
        armPos.y=arm1.getPosition().y+(d*sin(AngletoRad(arm1.getRotation()-toleransi)));
        lines[1].position=armPos;
        lines[1].color=Color::Blue;
        

        cir.setPosition(armPos);
        arm1.setPosition(mc.getPosition().x+10,mc.getPosition().y-50);
        arm2.setPosition(arm1.getPosition().x,mc.getPosition().y-10);

谁能告诉我我的代码有什么问题,或者有其他方法可以实现吗?

解决方法

相对位置是通过组合变换(矩阵乘法)实现的。您可以尝试手动完成,但 SFML 已经实现了它,甚至更好:它在 sf::Sprite::draw 后面使用它。

那么让我们看看:arm2 必须有一个相对于 arm1 的位置,那么我们如何做到这一点?

  1. 设置肘关节arm2局部坐标中的arm2原点
  2. arm2局部坐标中设置肘关节arm1位置
  3. 每次绘制 arm1 时都将 sf::RenderStates 变换传递给 arm2。变换乘法将在下面执行。
// Do this once
arm2.setOrigin(elbow_x_in_arm2,elbow_y_in_arm2);
arm2.setPosition(elbow_x_in_arm1,elbow_y_in_arm1);

// But this,each time you draw them
window.draw(arm1);
window.draw(arm2,sf::RenderStates(arm1.getTransform()));

结果: 每当您移动、旋转或缩放 arm1 时,arm2 将保持附着。此外,如果您旋转 arm2,它将围绕肘部旋转。


重要! arm2 的变换将代表局部变换,因此即使它绘制在正确的位置,数据也不包含全局位置/旋转/缩放。例如,如果您想检查 arm2 中的碰撞,您应该考虑到这一点:

// don't use this to get the bounding box
sf::FloatRect boundingBoxBad = arm2.getGlobalBounds(); // WRONG: now they are not global
// use this:
sf::Transform tr1 = arm1.getTransform();
sf::Transform tr2 = arm2.getTransform();
sf::FloatRect boundingbBoxGood = tr2.transformRect(tr1.transformRect(arm2.getLocalBounds()));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。