如何解决设置对象相对于其他对象的位置
所以我尝试学习游戏开发,我想让我的角色可以移动它的肘部。 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
的位置,那么我们如何做到这一点?
- 设置肘关节在
arm2
局部坐标中的arm2
的原点。 - 在
arm2
局部坐标中设置肘关节的arm1
的位置。 - 每次绘制
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 举报,一经查实,本站将立刻删除。