c++ SFML整数在if / else语句中不工作

C++ SFML integer not working in if / else statement

本文关键字:语句 工作 else SFML 整数 if c++      更新时间:2023-10-16

下面是分解:我正在学习SFML,并且我遇到了getSize()方法。你调用一个纹理/图像(texture. getsize())。代码中的X)返回宽度为整数,非常基本。我遇到的问题在下面的代码中。基本上,这段代码是在一个while循环中,使变量成为"源"。X不断地从0到1到2再到1到0,然后无休止地重复(它的目的并不重要)。无论我做了什么,下面的代码都将无休止地减少source的价值。X,因为它每次循环时都会执行if/else语句的第一部分,即使source的值为。X远小于0。出于某种原因,它点击我转换pTexture.getSize()。X变成一个整数只是为了再次检查它是否为1,然后代码就神奇地工作了。什么是难倒我是为什么,因为一些奇怪的原因,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(); 
        }
}