gpt4 book ai didi

c++ - 计算定向运动的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:41 30 4
gpt4 key购买 nike

我正在尝试使用 SFML 在 C++ 中编写一个基本的小行星游戏。虽然我能够相当轻松地移动我的三角形(玩家),但我对它移动的方式不太满意。

目前,运动不是相对于它所面对的方向。例如,如果我按“w”向前移动,三角形将简单地向上移动屏幕,而不管其方向如何。

我希望三角形在按下“w”键时向前移动,但使其移动的实际方向(相对于屏幕的尺寸)相对于其面向的实际方向。

因此,如果三角形的前端朝右,则按下“W”时,它会向右移动。如果在这种情况下按下“S”,它将向左移动。 “A”让它向上移动,当然“D”让它向下移动。

我目前的代码一点儿都没有完成这一点 - 我认为有一个真的 hacky 解决方案,但如果可能的话,我宁愿从更数学和优雅的角度来解决这个问题。

那么,实现这一目标的最佳方法是什么?

我有三个相关方法:一个用于处理键盘输入,另一个用于处理鼠标移动,还有一个更新方法。


代码

void Game::OnKeyPress( void )
{
int count = 0;

const float playerCenterMag = Magnitude( mPlayer.GetShape().GetCenter() );
//Shoddy attempt resulting in absolutely nothing of note
const float moveRateX = ( cosf( mMouseAoR ) * playerCenterMag ) + mPlayer.MoveSpeed;
const float moveRateY = ( sinf( mMouseAoR ) * playerCenterMag ) + mPlayer.MoveSpeed;

if ( mInput.IsKeyDown( sf::Key::W ) ) // Up
{
mPlayer.Position.y -= moveRateY;
++count;
}

if ( mInput.IsKeyDown( sf::Key::S ) ) // Down
{
mPlayer.Position.y += moveRateY;
++count;
}

if ( mInput.IsKeyDown( sf::Key::A ) ) // Left
{
mPlayer.Position.x -= moveRateX;
++count;
}

if ( mInput.IsKeyDown( sf::Key::D ) ) // Right
{
mPlayer.Position.x += moveRateX;
++count;
}

std::cout << "Key Press Rate => " << count << " seconds" << std::endl;
}

void Game::OnMouseEvent( void )
{
mPlayer.GetShape().Rotate( mMouseAoR + 5 );
}

void Game::Update( void )
{
const int x = mInput.GetMouseX();
const int y = mInput.GetMouseY();

mMouseAoR = ( y == 0 ) ? 0
: tanf( x / y );

PrintInfo();
}

最佳答案

这个游戏有两个版本。例如,如果您希望“W”向前“推进”,那么您需要在每个周期添加 moveRate 并使用 W 来更改速率。

这里显然只有在按下按钮时才会移动,因此您需要始终更新 X 和 Y:

if ( mInput.IsKeyDown( sf::Key::W ) ) // Up
{
mPlayer.Position.x += moveRateX;
mPlayer.Position.y += moveRateY;
++count;
}

移动速率根据方向变化。横向移动时,你会做

    mPlayer.Position.x += moveRateY;
mPlayer.Position.y += moveRateX;

向左(或向右)移动时,-=向另一个方向移动。

关于c++ - 计算定向运动的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12731959/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com