C ++であるためSFMLはそれほど多くないので、コードのデモンストレーションは必要ないと思います。問題は、画面上でブリットしているものを使ってスムーズな動きを実現するにはどうすればよいかということです。たとえば、正方形を画面に向けてブリットし、位置変数を前に定義した整数にして、矢印キーで移動できるようにします。変数に値を追加するキーを押すと、1つのキーだけを使用すると正常に機能しますが、2つのキーを押すと、2番目に押された値にのみ追加されます。斜めに動くようにするにはどうすればよいですか?
3 に答える
受け入れられた答えはそれほど素晴らしいものではありません。
xとyの動きを別々に保存し、押されたすべてのキーを確認してから、実際の動きを割り当てることをお勧めします。
x = 0.0;
y = 0.0;
speed = 1.0;
if (key.up())
{
y -= speed;
}
if (key.down())
{
y+= speed;
}
if (key.left())
{
x -= speed;
}
if (key.right())
{
x+= speed;
}
Move(x, y);
それはあなたが始めるはずです。
よく調べてみると、このコードには少し癖があることに気付くでしょう。斜めに移動すると、移動が速すぎて不正行為をしていることに気付くでしょう。これは、1つだけでなく、2つの速度単位が追加されているためです。解決策は各値を半分にすることだと思うかもしれませんが、そうすると遅くなりすぎます。対角線上を移動するときは、三角形とピタゴラスの定理を考える必要があります。両方向を平方根で割って補正する必要があります。
擬似コード
if (key.up())
{
if (key.right())
direction = up_right;
else if (key.left())
direction = up_left;
else
direction = up;
}
else if (key.down())
{
etc...
これは私にとってはうまくいきましたが、あなたが言ったように、プレーヤーはより近代的なコンピューターを持っていることで不当なアドバンテージを得ることができます。変数xとyの平方根を取りましたが、これがあらゆる種類の不要な不正行為を防いでいるかどうかはわかりません。
float x = 0.0;
float y = 0.0;
float speed = 0.35;
x = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2));
y = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2));
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
source.y = Up;
y -= speed;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
source.y = Down;
y += speed;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
source.y = Left;
x -= speed;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
source.y = Right;
x += speed;
}
playerImage.move(x, y);
また、イベントループの後に、フレームカウンターをクロックおよびフレーム速度と比較するインスタンスがあります。私の質問はこれです、このブロックは上記のコードに影響を及ぼし、不正行為を防ぐことができますか?そうであれば、sqrtステートメントを削除しますか?
frameCounter = (updateFrame) ? frameCounter + frameSpeed * clock.restart().asSeconds() : 0;
if(frameCounter >= switchFrame)
{
frameCounter = 0;
source.x++;
if(source.x * 32 >= pTexture.getSize().x)
source.x = 0;
}