Все! Я пишу простую 2D-игру на sfml. Я сделал черновую версию игры, но когда я запускаю программу, она возвращает ошибку «Вызов чисто виртуального метода». Отладчик написал проблему в методе GameObject->Update(). Именно в Player->Update(). Как вы видите, я написал абстрактный класс GameObject для правильного использования подклассов в основной функции
GameObject.h
#include
#include "Window.h"
class GameObject
{
public:
GameObject() = default;
virtual void Update(const float& frametime) = 0;
virtual void Render(const std::shared_ptr& window) = 0;
virtual sf::Vector2f getPosition() = 0;
virtual ~GameObject() = default;
};
Player.h
#include "Graphics.hpp"
#include"Audio.hpp"
#include "Window.h"
#include "ObjectConstructor.h"
#include "GameObject.h"
#include
#include
using namespace std::chrono;
class Player : public GameObject {
public:
Player();
void Update(const float& frametime) override;
void Render(const std::shared_ptr& window) override;
sf::Vector2f getPosition() override;
~Player() override;
void SetOC(ObjectConstructor* oc);
private:
float speed = 125; //default speed
ObjectConstructor* OC = nullptr; //Object constructor to get game data
sf::Vector2f m_pos;
sf::Texture m_playerTexture;
sf::SoundBuffer buffer;
sf::Sound ShotSound;
steady_clock::time_point lastShotTime;
duration timeBetweenShots = 0.45s;
};
Плеер. ЦПП
#include "../include/Player.h"
#include "../include/Bullet.h"
Player::Player()
{
m_playerTexture.loadFromFile("../assets/ship.png");
m_pos = sf::Vector2f(sf::VideoMode::getDesktopMode().width / 8, sf::VideoMode::getDesktopMode().height / 2);
lastShotTime = steady_clock::now();
buffer.loadFromFile("../assets/shootSFX.mp3");
ShotSound.setBuffer(buffer);
}
void Player::Update(const float& frametime)
{
sf::Event event;
sf::RenderWindow& m_window = OC->GetWindow()->GetRenderWindow();
while(m_window.pollEvent(event))
{
if(event.type == sf::Event::KeyPressed)
{
if(event.key.code == sf::Keyboard::W && m_pos.y > 64)
m_pos.y += speed * frametime;
else if(event.key.code == sf::Keyboard::S && m_pos.y < m_window.getSize().y -64)
m_pos.y -= speed * frametime;
if(event.key.code == sf::Keyboard::Space && lastShotTime + timeBetweenShots GetWindow());
newBullet.SetOC(OC);
OC->GetObjects()->push_back(&newBullet);
ShotSound.play();
lastShotTime = steady_clock::now();
}
}
}
}
void Player::Render(const std::shared_ptr& window)
{
sf::RenderWindow& m_window = OC->GetWindow()->GetRenderWindow();
sf::Sprite sprite(m_playerTexture, sf::IntRect(m_pos.x - m_playerTexture.getSize().x /2,
m_pos.y - m_playerTexture.getSize().y /2,m_playerTexture.getSize().x,m_playerTexture.getSize().y));
m_window.draw(sprite);
}
void Player::SetOC(ObjectConstructor* oc){
OC = oc;
}
sf::Vector2f Player::getPosition()
{
return m_pos;
}
ObjectConstructor.h
class Player;
class Bullet;
class ObjectConstructor {
public:
ObjectConstructor();
~ObjectConstructor() = default;
std::shared_ptr GetWindow();
std::vector* GetObjects();
std::vector* GetBullets();
// std::vector* GetEnemies();
private:
int score = 0;
std::shared_ptr m_window;
std::vector m_game_objects;
std::vector bulletCollisionObjects;
};
ObjectConstructor.cpp
ObjectConstructor::ObjectConstructor()
{
Window temp_w = Window("Space Wars", sf::Vector2u(720, 1280));
m_window = std::move(std::make_shared(temp_w));
Player newPlayer = Player();
newPlayer.SetOC(this);
m_game_objects.push_back(std::move(&newPlayer));
}
std::vector* ObjectConstructor::GetObjects(){
return &m_game_objects;
}
std::shared_ptr ObjectConstructor::GetWindow()
{
return m_window;
}
std::vector* ObjectConstructor::GetBullets(){
return &bulletCollisionObjects;
}
main.cpp
#include "../RegularGame/include/Player.h"
#include "../RegularGame/include/Bullet.h"
#include "../RegularGame/include/ObjectConstructor.h"
#include "../RegularGame/include/Game.h"
int main()
{
ObjectConstructor objects;
while (objects.GetWindow().get()->IsDone() == 0)
{
for (auto& gameObject : *objects.GetObjects())
{
gameObject->Update(0.015);
objects.GetWindow().get()->Update();
}
for (auto& gameObject : *objects.GetObjects())
{
gameObject->Render(objects.GetWindow());
}
}
objects.~ObjectConstructor();
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ass-player
Чисто виртуальный метод, вызываемый в производном классе Player ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение