Заикание движения при нажатии клавиши

Изучение SFML и создание игры на C++ в первый раз. Моя проблема связана с движением персонажа. Я делаю клон в стиле Astroids, и движение при нажатии клавиш не очень плавное. Персонаж заикается, останавливается при вращении и движении вперед одновременно. Любая помощь?

Player.cpp

#include "Player.h"
#include "Bullet.h"
#include <iostream>
#include <valarray>

#define SPEED 10
#define ROTATION 15


Player::Player()
{
    this->_x = 150;
    this->_y = 150;
    this->_xspeed = 0;
    this->_yspeed = 0;
    this->_rotation = ROTATION;
    this->_user = this->loadSprite("/Users/ganderzz/Desktop/Programming/C_Plus/stest/stest/Resources/Player.png");
    this->_user.setOrigin(16, 16);
}

void Player::Collision(RenderWindow & in)
{
    if(this->_x >= (in.getSize().x-32) || this->_x <= 0)
        this->_xspeed = 0;
}

void Player::Move(Event & e)
{
        if(Keyboard::isKeyPressed(Keyboard::D))
        {
            this->_user.rotate(this->_rotation);
        }
        if(Keyboard::isKeyPressed(Keyboard::A))
        {
            this->_user.rotate(-this->_rotation);
        }
        if(Keyboard::isKeyPressed(Keyboard::W))
        {
            this->_yspeed = -sinf((90 + this->_user.getRotation()) * 3.14 / 180) * SPEED;
            this->_xspeed = -cosf((90 + this->_user.getRotation()) * 3.14 / 180) * SPEED;

            this->_x += this->_xspeed;
            this->_y += this->_yspeed;
        }
        if(Keyboard::isKeyPressed(Keyboard::Space))
        {
            Bullet b(this->_x,this->_y,this->_user.getRotation());
        }
}

void Player::Draw(RenderWindow & in)
{
    this->_user.setPosition(this->_x, this->_y);
    in.draw(this->_user);
}

Sprite Player::loadSprite(std::string filename)
{
    this->_texture.loadFromFile(filename, IntRect(0,0,32,32));

    return Sprite(this->_texture);
}

person Dylan Paulus    schedule 27.05.2013    source источник


Ответы (1)


Я думаю, это связано с тайм-менеджментом, если это небольшое 2D, у вас, вероятно, высокий показатель FPS.

И тогда ваше событие move вызывается много раз и создает это заикание.

Вы должны ограничить частоту кадров и попытаться добавить часы к своему событию, если ограничения частоты кадров недостаточно.

Вы можете найти то, что вам нужно, на этой странице документа

Если это совсем не так, покажи нам свой основной цикл, может быть у тебя там что-то отнимает много ресурсов.

Надеюсь, поможет.

person Maresh    schedule 27.05.2013
comment
Оказывается, я неправильно расставил вещи в основном, и мне нужно добавить часы. Спасибо за помощь! - person Dylan Paulus; 28.05.2013