【问题标题】:Error with bullets spawn in SFMLSFML 中的子弹产生错误
【发布时间】:2015-11-07 22:55:29
【问题描述】:

我在 SFML 游戏中生成子弹时遇到了一点问题。 有代码:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>
int pad_id;
int pociski = 3;
int d_pad_x, d_pad_y;
int klatki;
bool p_1;
bool p_2;
bool p_3;
sf::Texture tekstura, pocisk;
sf::Sprite kulka, pocisk_1, pocisk_2, pocisk_3;
sf::Clock _clock;
float accumulator = 0;
float TIME_STEP = 0.03f;
sf::ContextSettings settings;
sf::RenderWindow window(sf::VideoMode(1920, 1080), "Wrecking balls", sf::Style::Fullscreen, settings);

class bullet
{
public:
    sf::Texture bullet_texture;
    sf::Sprite _sprite;
    void spawn_new_bullet(sf::Vector2f from, sf::Vector2f to);
};
void bullet::spawn_new_bullet(sf::Vector2f from, sf::Vector2f to)
{
    bullet_texture.loadFromFile("pocisk.png");
    _sprite.setTexture(bullet_texture);
    _sprite.setPosition(from);
    _sprite.setRotation(atan2(to.y - from.y, to.x - from.x));
    window.draw(_sprite);
}
int main()
{

    settings.antialiasingLevel = 2;
    window.setFramerateLimit(60);
    window.setVerticalSyncEnabled(true);
    if(!tekstura.loadFromFile("ball.png"))
    {
        std::cout << "error" << std::endl;
    }
    if (!pocisk.loadFromFile("pocisk.png"))
    {
        std::cout << "error" << std::endl;
    }
    kulka.setTexture(tekstura);
    pocisk_1.setTexture(pocisk);
    pocisk_2.setTexture(pocisk);
    pocisk_3.setTexture(pocisk);
    for (int i=0; i<8; i++)
    {
        if (sf::Joystick::isConnected(i))
        {
            std::cout << "Pad " << i << " is connected."  << std::endl << "Number of buttons: " << sf::Joystick::getButtonCount(i) << std::endl;
            pad_id = i;
        }
    }
    kulka.setScale(0.050, 0.050);
    pocisk_1.setScale(0.050, 0.050);
    pocisk_2.setScale(0.050, 0.050);
    pocisk_3.setScale(0.050, 0.050);
    while (window.isOpen())
    {
        accumulator += _clock.restart().asSeconds();
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
            if (event.type == sf::Event::JoystickButtonPressed)
            {
                if (sf::Joystick::isButtonPressed(0, 0))
                {
                    std::cout << "0" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 1))
                {
                    std::cout << "1" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 2))
                {
                    std::cout << "2" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 3))
                {
                    std::cout << "3" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 4))
                {
                    std::cout << "4" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 5))
                {
                    std::cout << "5" << std::endl;
                    if (pociski > 0)
                    {
                        if (pociski == 3)
                        {
                            p_3 = true;
                        }
                        if (pociski == 2)
                        {
                            p_2 = true;
                        }
                        if (pociski == 1)
                        {
                            p_1 = true;
                        }
                      pociski -= 1;
                    }
                }
                if (sf::Joystick::isButtonPressed(0, 6))
                {
                    std::cout << "6" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 7))
                {
                    std::cout << "7" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 8))
                {
                    std::cout << "8" << std::endl;
                }
                if (sf::Joystick::isButtonPressed(0, 9))
                {
                    std::cout << "9" << std::endl;
                }
            }
        }
    if(accumulator > TIME_STEP)
    {
        window.clear();
        if (pociski < 3)
        {
            klatki += 1;
        }
        d_pad_x = sf::Joystick::getAxisPosition(pad_id, sf::Joystick::X);
        d_pad_y = sf::Joystick::getAxisPosition(pad_id, sf::Joystick::Y);
        kulka.move(d_pad_x / 5, d_pad_y / 5);
        pocisk_1.setPosition(kulka.getPosition().x + 10, kulka.getPosition().y + 13.75);
        pocisk_2.setPosition(kulka.getPosition().x + 20, kulka.getPosition().y + 13.75);
        pocisk_3.setPosition(kulka.getPosition().x + 30, kulka.getPosition().y + 13.75);
        //std::cout << d_pad_x << d_pad_y << std::endl;
        window.draw(kulka);
        if (pociski == 1)
        {
            window.draw(pocisk_1);
        }
        else if (pociski == 2)
        {
            window.draw(pocisk_1);
            window.draw(pocisk_2);
        }
        else if (pociski == 3)
        {
            window.draw(pocisk_1);
            window.draw(pocisk_2);
            window.draw(pocisk_3);
        }
        if (p_3 == true)
        {
            bullet::spawn_new_bullet(kulka.getPosition(), sf::Vector2(100, 100));
            p_3 = false;
        }
        if (p_2 == true)
        {
            bullet::spawn_new_bullet(kulka.getPosition(), sf::Vector2(100, 100));
            p_2 = false;
        }
        if (p_1 == true)
        {
            bullet::spawn_new_bullet(kulka.getPosition(), sf::Vector2(100, 100));
            p_1 = false;
        }
        accumulator -= TIME_STEP;
        window.display();
    }
    if (klatki >= 166)
    {
        if (pociski < 3)
        {
        pociski += 1;
        klatki = 0;
        }
    }
    }

    return 0;
}

我在第 162 行遇到的错误是:“在 '(' 标记之前缺少模板参数”。谁能告诉我我应该怎么做?为什么这个方法必须与模板一起使用?

【问题讨论】:

  • 避免使用全局变量。使用有意义的名称。 p_1 是什么意思?请在代码中明确指出导致错误的行。
  • p_1, p_2, p_3 是变量,帮助我在 window.clear 在主游戏循环中调用后运行“bullet::spawn_new_bullet”
  • 这一行出现错误:'bullet::spawn_new_bullet(kulka.getPosition(), sf::Vector2(100, 100));'
  • sf::Vector2 是一个模板类型。要么提供模板参数,要么使用提供的 typedef 之一,例如 sf::Vector2i
  • so... 它应该是什么样子?我试着用你的提示做一些思考,但它没有帮助:(

标签: c++ sfml


【解决方案1】:

Vector2 是一个模板类型。要么提供模板参数,要么使用提供的 typedef 之一,例如 sf::Vector2i – Neil Kirkckquote

为您的函数spawn_new_bullet 提供正确的第二个参数,例如Vector2f()

加油!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多