【问题标题】:C++ SFML integer not working in if / else statementC++ SFML 整数在 if / else 语句中不起作用
【发布时间】:2015-07-06 06:45:10
【问题描述】:

所以这是细分:我正在学习 SFML,我遇到了你在纹理/图像(代码中的 texture.getSize().x)上调用的方法 getSize().x,它返回宽度作为整数,很基本。我遇到的问题在下面的代码中。基本上,这段代码在一个 while 循环中,它使变量“source.x”不断地从 0 到 1 到 2 到 1 到 0 变化,然后无休止地重复(目的无关紧要)。不管我做什么,下面的代码都会不断地降低 source.x 的值,因为它会在每次循环时执行 if/else 语句的第一部分,即使 source.x 的值远低于 0 . 出于某种原因,它点击我将 pTexture.getSize().x 转换为整数,只是为了仔细检查它是否为一,然后代码神奇地工作了。让我难过的是为什么如果出于某种奇怪的原因 pTexture.getSize().x 不是整数(每当我打印出来时它就是整数,并且我尝试以 int 类型的方法返回它以获得额外的确定性) ,为什么我在比较不兼容的类型时不会得到编译器错误,为什么最重要的是它总是假设条件为真。另外,pTexture.getSize().x 的值为 96 以供参考。提前致谢,很抱歉这篇文章有多长。

source.x += posNeg;
if(source.x*32 >= (int)pTexture.getSize().x){ 
    posNeg = -1;
    source.x -= 2;
    std::cout << "if called" << std::endl;
} else if(source.x < 0){
    posNeg = 1;
    source.x += 2;
    std::cout << "else called" << std::endl;
}

完整代码:

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

int main(){
    enum Direction { Down, Left, Right, Up}; 

    sf::Vector2i source(1, Down);

    float frameCounter = 0, switchFrame = 350, frameSpeed = 500;
    int posNeg = 1;

    sf::RenderWindow Window;
    Window.create(sf::VideoMode(800, 600), "A Window");

    Window.setKeyRepeatEnabled(false);

    sf::Texture pTexture;
    sf::Sprite playerImage;
    sf::Clock clock;

    if(!pTexture.loadFromFile("Pixel Dude.png")){
        std::cout << "Error: ould not load player image" << std::endl;
    }
    playerImage.setTexture(pTexture);

    std::cout << "Width:" << pTexture.getSize().x << std::endl;
    while(Window.isOpen()){

        sf::Event Event;
        while(Window.pollEvent(Event)){

            switch(Event.type){
            case sf::Event::Closed:
                Window.close();
                break;
            }
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){ 
            source.y = Down;
            playerImage.move(0, 1); 
        } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            source.y = Left;
            playerImage.move(-1,0);
        } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            source.y = Right;
            playerImage.move(1,0);
        } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            source.y = Up;
            playerImage.move(0,-1);
        }


        frameCounter += frameSpeed*clock.restart().asSeconds(); 

        if(frameCounter >= switchFrame){
            frameCounter = 0;
        std::cout << "source.x at beginning: " << source.x << std::endl;
        std::cout << "posNeg at beginning: " << posNeg << std::endl;
            source.x += posNeg; 
            if(source.x*32 >= (int)pTexture.getSize().x){
                posNeg = -1;
                source.x -= 2;
                std::cout << "if called" << std::endl;
            } else if(source.x < 0){
                posNeg = 1;
                source.x += 2;
                std::cout << "else called" << std::endl;
            }else{

            }
        std::cout << "source.x at the end: " << source.x << std::endl;
        std::cout << "posNeg at the end: " << posNeg << std::endl;
        std::cout << "-------------------" << std::endl;
        }

        playerImage.setTextureRect(sf::IntRect(source.x*32, source.y*32, 32, 32)); 
        Window.draw(playerImage);
        Window.display();
        Window.clear(); 
        }
}

【问题讨论】:

  • 好吧,我的回答错了。你能发布你从这个运行中获得的控制台输出吗?

标签: c++ if-statement sfml incompatibletypeerror


【解决方案1】:

在纹理上调用 getSize 实际上会返回 sf::Vector2U。这是模板 sf::Vector2

的 typedef

所以从技术上讲,你检查 source.x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多