当前位置: 首页 > 知识库问答 >
问题:

C++中的SFML播放器移动帮助

路扬
2023-03-14

我对sfml完全陌生,所以我在YouTube上学习了一个教程。 我做的和那个家伙完全一样,但是我的动作还是有问题。

基本上,如果我按下一个移动键,玩家(它只是一个矩形形状)就会移动一小会儿,当我松开这个键时,玩家就会回到它的官方位置。 为什么它会回到它的官方立场。 它只移动一次,即使我长按按键,它也不会移动超过一次。

下面是我的代码:

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;
int main()
{

sf::RenderWindow window(sf::VideoMode(512, 512), "SFML Tutorial", sf::Style::Close | sf::Style::Titlebar| sf::Style::Resize);

//Game Loop

 while(window.isOpen())
    {

        //create an event
        sf::Event evnt;
       //create a rectangle shape called player
        sf::RectangleShape player(sf::Vector2f(100.0f, 100.0f));
        player.setFillColor(sf::Color::Red);
        while(window.pollEvent(evnt))
            {
                switch(evnt.type)
                {
                case sf::Event::Closed:
                    window.close();
                    break;
                case sf::Event::Resized:
                    cout<<"New window width: "<<evnt.size.width<<" New window height: "<<evnt.size.height<<endl;
                    break;
                case sf::Event::TextEntered:
                    if(evnt.text.unicode < 128){
                    printf("%c", evnt.text.unicode);
                    }
                }

            } //window event

            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Left))
                {
                   player.move(-5.0f, 0.0f);
                }
            else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Right))
                {
                    player.move(5.0f, 0.0f);
                }
            else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Up))
                {
                    player.move(0.0f, -5.0f);
                }
            else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Down))
                {
                    player.move(0.0f, 5.0f);
                }


            //display player

            window.clear();
            window.draw(player);
            window.display();
    }
    return 0;

}

共有1个答案

晁聪
2023-03-14

问题是你在while循环中以100.0f100.0f每帧创建一个字符。 因此,您需要将创建字符的代码移出while循环。

int main()
{
    sf::RectangleShape player(sf::Vector2f(100.0f, 100.0f)); 
    player.setFillColor(sf::Color::Red);
    while(window.isOpen())
        {

             //create an event
             sf::Event evnt;
             //create a rectangle shape called player

             while(window.pollEvent(evnt))
             ...
        }
}

 类似资料:
  • 所以,最近我开始用C和SFML制作一个Pacman克隆。开发游戏时一切都很顺利,直到我需要创建墙碰撞。我不擅长碰撞,所以我以为会有问题。 我想做的是检查你上方是否有一堵墙,除了你或其他什么,然后如果你与一堵墙相撞,阻止玩家。 问题是,当你撞到墙时,你很早就停下来了。有时你会陷入困境。这并不是要与代码混淆,因为代码使Pacman在你身上有一堵墙的时候不能转身,而是在遇到墙的时候停下来。 这是我刚才提

  • 我在Box2d上遇到了问题,因为我是Box2d新手,所以无法处理我的播放器的移动。当用户在我的游戏中触摸左右按钮时,我想将我的玩家左右移动。在我的游戏中,玩家已经通过了y轴。我想在控制播放器的同时看到很酷的平滑动画。我就是不能把我的球员移到左边我怎么能做到?提前谢谢 //编辑 我创建了一个测试夹具,我可以移动夹具,但不能移动我的球员。如何将我的玩家精灵连接到身体上?我必须找到控制身体的正确方法。一

  • zyMedia 是由掌阅科技开源的基于HTML5 video和audio的自定义UI多媒体播放器,经过多种移动端设备环境的检测(尤其是国产设备和浏览器),已用于公司的产品线。 特点: 支持主流移动设备移动端浏览器,适合国内移动环境。 支持多种视频、音频格式,如mp4、mp3、oga、webm等。 轻量,UglifyJS压缩14KB 已通过测试的设备: 小米1、小米2s、小米 MI3、红米、小米 M

  • Android播放开发SDK IOS播放开发SDK

  • 问题内容: 播放器是一个面板,将其删除,将其位置更改,然后重新添加到绘制到主框架的另一个面板(包含此方法的面板)中。还有许多其他小的面板,其中包含草精灵作为地形图块绘制到主面板上。我认为问题在于,当我致电时,它也会重新验证所有这些小面板。我该如何解决? 编辑:我应该提到,我用来将玩家放置在主面板上。 问题答案: 似乎是一项繁重的操作,您可以在EDT(GUI线程)中执行它。而是从新线程或SwingW

  • 主要目标是想让儿童可以以最好的体验来看动画片。 1、支持记录每一部动画片的当前播放位置,方便下次打开的时候可以接着看。 2、可以增加片头、片尾的时间点,不用每次都播放重复内容。 3、播放、暂停、上一集、下一集、快照、全屏等。

  • 问题内容: 对于我的问题,我有一个链接。我想通过在fancybox叠加窗口中单击链接来播放视频。这不是问题。问题是参数,例如“自动播放”或“自动隐藏”。 以下链接无效: 覆盖窗口已打开,但视频未自动播放。 编辑:我想在移动设备上使用HTML5播放器。 在桌面浏览器上,它可以使用参数,但不能在移动设备上使用。 问题答案: 事实证明,无法在iOS设备(iPhone,iPad,iPod touch)和A

  • 因此,我进行了一个测试,看看碰撞是如何在SFML中操作的。我制作了以下代码片段: 正如代码所提示的,马里奥在接触地板物体时会改变位置,并且会瞬移到地板上方。 注意,“绿框”是我前面提到的地板对象。还有,忽略图片1中的“左”字,我指的是“右”。 当然,这种行为是有意的(即不是bug),但它是不想要的。 所以我的问题是:我怎样才能消除这种“副作用”呢?我的意思是,我怎样才能修改我的代码,这样马里奥就不