SFML。代码未执行,但 100% 应该执行
SFML. Code is not executed but it 100% should
我正在尝试实现跳跃机制,所以我有 2 种状态,即坠落和跳跃。我用这种方式编码,如果它不跳它的下落,反之,当玩家选择跳跃时 bool 切换,当 jumpSpedDecrease > 0.299f 时,在代码中你可以看到那个 if 语句中有 cout 说"This code should work"。当我 运行 程序时,我可以在代码中看到这一点,但我在那里更改的值保持不变,但它显然应该改变。
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
birdSprite.setPosition(pos.x, pos.y - (jumpStartSped - jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
jumpSpedDecrease += jumpSpedDcrsValue;
std::cout << " jumpStartSped: " << jumpStartSped << " jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " << jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;`
完整代码在这里:
#include <SFML\Graphics.hpp>
#include <iostream>
using namespace sf;
class Player
{
public:
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
bool isJumping = false;
Vector2u windowSize;
Time time;
Texture birdTex;
Sprite birdSprite;
void loadingSprite()
{
if (!birdTex.loadFromFile("./../Textures/flappyBird.png"))
{
std::cerr << "Cannot load texture" << std::endl;
}
birdSprite.setTexture(birdTex);
Vector2u size = birdTex.getSize();
birdSprite.setOrigin(size.x/2, size.y/2);
birdSprite.setScale(0.1f, 0.1f);
birdSprite.setPosition(windowSize.x/2, windowSize.y/2);
}
void falling()
{
if (!isJumping)
{
Vector2f pos = birdSprite.getPosition();
birdSprite.setPosition(pos.x, pos.y + (startSped +
falSpedIncrease) * time.asMilliseconds() * fallingSpeed);
falSpedIncrease += falSpedIcrsValue;
}
}
void jump()
{
Vector2f pos = birdSprite.getPosition();
if (Keyboard::isKeyPressed(Keyboard::Space)) isJumping = true;
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
birdSprite.setPosition(pos.x, pos.y - (jumpStartSped -
jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
jumpSpedDecrease += jumpSpedDcrsValue;
std::cout << " jumpStartSped: " << jumpStartSped << "
jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " <<
jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;
}
}
};
int main()
{
Clock clock;
RenderWindow window(VideoMode(600, 600), "Dupako");
window.setFramerateLimit(240);
Player player;
player.windowSize = window.getSize();
player.loadingSprite();
// MAIN LOOP //
while (window.isOpen())
{
Event event;
while (window.pollEvent(event)) {
if (event.type == Event::Closed) window.close();
}
Time time = clock.getElapsedTime();
// MOVEMENT FUNCTIONS START //
player.time = time;
player.falling();
player.jump();
// MOVEMENT FUNCTIONS END //
clock.restart().asMilliseconds();
window.clear();
/// DRAW ///
window.draw(player.birdSprite);
/// DRAW END ///
window.display();
// MAIN LOOP END //
}
return 0;
}
重新考虑这些行:
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;
这里你只是创建了一些局部变量(例如 float jumpSpedDecrease = 0),因此没有修改 class 字段。例如这里的fallingSpeed(class字段)设置为0:
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
未设置回1,跳转结束时。你在 falling() 方法中使用这个字段。我建议首先删除 float 类型说明符(在 if (jumpSpedDecrease > 0.299f) {} 语句内)。
我正在尝试实现跳跃机制,所以我有 2 种状态,即坠落和跳跃。我用这种方式编码,如果它不跳它的下落,反之,当玩家选择跳跃时 bool 切换,当 jumpSpedDecrease > 0.299f 时,在代码中你可以看到那个 if 语句中有 cout 说"This code should work"。当我 运行 程序时,我可以在代码中看到这一点,但我在那里更改的值保持不变,但它显然应该改变。
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
birdSprite.setPosition(pos.x, pos.y - (jumpStartSped - jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
jumpSpedDecrease += jumpSpedDcrsValue;
std::cout << " jumpStartSped: " << jumpStartSped << " jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " << jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;`
完整代码在这里:
#include <SFML\Graphics.hpp>
#include <iostream>
using namespace sf;
class Player
{
public:
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
bool isJumping = false;
Vector2u windowSize;
Time time;
Texture birdTex;
Sprite birdSprite;
void loadingSprite()
{
if (!birdTex.loadFromFile("./../Textures/flappyBird.png"))
{
std::cerr << "Cannot load texture" << std::endl;
}
birdSprite.setTexture(birdTex);
Vector2u size = birdTex.getSize();
birdSprite.setOrigin(size.x/2, size.y/2);
birdSprite.setScale(0.1f, 0.1f);
birdSprite.setPosition(windowSize.x/2, windowSize.y/2);
}
void falling()
{
if (!isJumping)
{
Vector2f pos = birdSprite.getPosition();
birdSprite.setPosition(pos.x, pos.y + (startSped +
falSpedIncrease) * time.asMilliseconds() * fallingSpeed);
falSpedIncrease += falSpedIcrsValue;
}
}
void jump()
{
Vector2f pos = birdSprite.getPosition();
if (Keyboard::isKeyPressed(Keyboard::Space)) isJumping = true;
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
birdSprite.setPosition(pos.x, pos.y - (jumpStartSped -
jumpSpedDecrease) * time.asMilliseconds() * jumpingSpeed);
jumpSpedDecrease += jumpSpedDcrsValue;
std::cout << " jumpStartSped: " << jumpStartSped << "
jumpSpedDecrease: " << jumpSpedDecrease << " jumpSpedDcrsValue: " <<
jumpSpedDcrsValue << " fallingSpeed: " << fallingSpeed << std::endl;
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;
}
}
};
int main()
{
Clock clock;
RenderWindow window(VideoMode(600, 600), "Dupako");
window.setFramerateLimit(240);
Player player;
player.windowSize = window.getSize();
player.loadingSprite();
// MAIN LOOP //
while (window.isOpen())
{
Event event;
while (window.pollEvent(event)) {
if (event.type == Event::Closed) window.close();
}
Time time = clock.getElapsedTime();
// MOVEMENT FUNCTIONS START //
player.time = time;
player.falling();
player.jump();
// MOVEMENT FUNCTIONS END //
clock.restart().asMilliseconds();
window.clear();
/// DRAW ///
window.draw(player.birdSprite);
/// DRAW END ///
window.display();
// MAIN LOOP END //
}
return 0;
}
重新考虑这些行:
if (jumpSpedDecrease > 0.299f)
{
float fallingSpeed = 1;
float startSped = 0.004f;
float falSpedIcrsValue = 0.001f;
float falSpedIncrease = 0;
float jumpingSpeed = 1;
float jumpStartSped = 0.3f;
float jumpSpedDcrsValue = 0.001f;
float jumpSpedDecrease = 0;
std::cout << "This code should work" << std::endl;
}
if (jumpSpedDecrease > 0.3f) isJumping = false;
这里你只是创建了一些局部变量(例如 float jumpSpedDecrease = 0),因此没有修改 class 字段。例如这里的fallingSpeed(class字段)设置为0:
if (isJumping)
{
fallingSpeed = 0;
falSpedIncrease = 0;
未设置回1,跳转结束时。你在 falling() 方法中使用这个字段。我建议首先删除 float 类型说明符(在 if (jumpSpedDecrease > 0.299f) {} 语句内)。