SFML中项目符号生成错误

Error with bullets spawn in SFML

本文关键字:错误 符号 项目 SFML      更新时间:2023-10-16

我在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行中得到的错误是:"在'('标记之前缺少模板参数"。有人能告诉我应该怎么做吗?为什么这个方法必须与模板一起使用?

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

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

干杯