"функция "Game::Game(void)" уже имеет текст реализации", "Game: не является именем класса или пространства имен" и таких 16 ошибок, как решить?
я имею три headera: Game.h , GameObject.h , TextureManager.h; также имею 4 файла формата .cpp : main.cpp , Game.cpp, GameObject.cpp,TextureManager.cpp;
Game.h
:
#pragma once
#include "SDL_image.h"
#include "SDL.h"
#include"TextureManager.h"
#include<iostream>
#include"GameObject.h"
using namespace std;
class Game {
public:
Game() {};
~Game() {};
void init(const char* title, int xpos, int ypos, int width, int height, bool
fullscreen) {};
void handleEvents() {};
void update() {};
void render() {};
void clean() {};
bool running() { return isRunning; };
static SDL_Renderer* renderer;
private:
int count = 0;
bool isRunning;
SDL_Window* window = nullptr;
};
Вот
Game.cpp
:
#include"Game.h"
Game::Game() {};
Game::~Game() {};
GameObject* Frodo;
void Game::init(const char* title, int xpos, int ypos, int width, int height, bool
fullscreen)
{
int flags = 0;
if (fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
cout << "Subsystems initialized" << endl;
window = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
if (window)
{
cout << "Window created" << endl;
}
renderer = SDL_CreateRenderer(window, -1, 0);
if (renderer)
{
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
cout << "Renderer created" << endl;
}
isRunning = true;
}
else
isRunning = false;
Frodo = new GameObject("D:\\Lotr_game\\images\\Charackters\\Frodo_png.png", 0, 0);
};
void Game::handleEvents()
{
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_QUIT:
isRunning = false;
break;
default:
break;
}
};
void Game::update()
{
count++;
Frodo->Update();
cout << count << endl;
};
void Game::render()
{
SDL_RenderClear(renderer);
Frodo->Render();
SDL_RenderPresent(renderer);
};
void Game::clean()
{
SDL_DestroyWindow(window);
window = nullptr;
SDL_DestroyRenderer(renderer);
renderer = nullptr;
SDL_Quit();
cout << "Game cleaned" << endl;
};
Вот
GameObject.h
:
#pragma once
#include"Game.h"
SDL_Renderer *Game::renderer = nullptr;
class GameObject
{
public:
GameObject(const char* texturesheet, int x, int y){};
~GameObject() {};
void Update() {};
void Render() {};
private:
int xpos;
int ypos;
SDL_Texture *objTexture;
SDL_Rect srcRect, destRect;
};
Вот
GameObject.cpp
:
#include "GameObject.h"
#include"TextureManager.h"
GameObject::GameObject(const char* texturesheet, int x, int y)
{
objTexture = TextureManager::LoadTexture(texturesheet);
xpos = x;
ypos = y;
};
GameObject::~GameObject() {};
void GameObject::Update()
{
xpos++;
ypos++;
srcRect.h = 200;
srcRect.w = 133;
srcRect.x = 0;
srcRect.y = 0;
destRect.x = xpos;
destRect.y = ypos;
destRect.h = srcRect.h * 2;
destRect.w = srcRect.w * 2;
};
void GameObject::Render()
{
SDL_RenderCopy(Game::renderer, objTexture, &srcRect, &destRect);
};
Вот
TextureManager.h
:
#pragma once
#include"Game.h"
class TextureManager
{
public:
static SDL_Texture* LoadTexture(const char* texture){}
};
Вот
TextureManager.cpp
:
#include"TextureManager.h"
SDL_Texture* TextureManager:: LoadTexture(const char* texture)
{
SDL_Surface* tmpSurface = IMG_Load(texture);
SDL_Texture* tex = SDL_CreateTextureFromSurface(Game::renderer, tmpSurface);
SDL_FreeSurface(tmpSurface);
return tex;
}
Вот
main.cpp
:
#include"Game.h"
Game *game = nullptr;
int main(int argc, char* args[])
{
const int FPS = 60;
const int frameDelay = 1000 / FPS;
Uint32 framestart;
int frameTime;
game = new Game();
game->init("LOTR",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 640, false);
while (game->running())
{
framestart = SDL_GetTicks();
game->handleEvents();
game->update();
game->render();
frameTime = SDL_GetTicks() - framestart;
if (frameDelay > frameTime)
{
SDL_Delay(frameDelay - frameTime);
}
}
game->clean();
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
По первому вопросу — об "уже имеет текст реализации": вы в классе определили конструктор-деструктор с пустым телом:
class Game {
public:
Game() {};
~Game() {};
А потом еще раз определили их
#include"Game.h"
Game::Game() {};
Game::~Game() {};
GameObject* Frodo;
и тем самым нарушили правило одного определения...