1

第一次学习 SFML 并用 C++ 制作游戏。我的问题来自角色的移动。我正在制作一个类似 Astroids 的克隆,按下按键时的动作不是很流畅。角色四处结巴,同时按下旋转和前进时停止。有什么帮助吗?

播放器.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);
}
4

1 回答 1

1

我认为这是由于时间管理,如果是小型 2D,您可能具有较高的 FPS 速率。

然后你的move事件被多次调用并造成这种口吃。

您应该限制帧速率,如果限制帧速率不够,请尝试为您的事件添加时钟。

您可以在文档的此页面中找到您需要的内容

如果根本不是这样,请向我们展示您的主循环,也许您有一些东西需要大量资源。

希望能帮助到你。

于 2013-05-27T19:20:05.487 回答