SDL2错误我在做什么错误

时间:2015-05-23 23:50:15

标签: c++ sdl-2

在我尝试加载图片之前,它正常工作。

这是我得到的错误:

  

错误1错误LNK2005:" struct SDL_Window * m_pWindow"   (?m_pWindow @@ 3PAUSDL_Window @@ A)已在中定义   Game.obj C:\ Users \ Joseph \ Desktop \ DuckGotti \ DuckGotti \ maine.obj

     

错误2错误LNK2005:" struct SDL_Renderer * m_pRenderer"   (?m_pRenderer @@ 3PAUSDL_Renderer @@ A)已定义于   Game.obj C:\ Users \ Joseph \ Desktop \ DuckGotti \ DuckGotti \ maine.obj

     

错误3错误LNK2005:" struct SDL_Texture * m_pTexture"   (?m_pTexture @@ 3PAUSDL_Texture @@ A)已定义   Game.obj C:\ Users \ Joseph \ Desktop \ DuckGotti \ DuckGotti \ maine.obj

     

错误4错误LNK2005:" struct SDL_Rect m_sourceWREK"
  (?m_sourceWREK @@ 3USDL_Rect @@ A)已在中定义   Game.obj C:\ Users \ Joseph \ Desktop \ DuckGotti \ DuckGotti \ maine.obj

     

错误5错误LNK2005:" struct SDL_Rect m_destWREK"
  (?m_destWREK @@ 3USDL_Rect @@ A)已在中定义   Game.obj C:\ Users \ Joseph \ Desktop \ DuckGotti \ DuckGotti \ maine.obj

     

错误7错误LNK1169:找到一个或多个多重定义的符号
  C:\ Users \ Joseph \ Desktop \ DuckGotti \ Debug \ DuckGotti.exe 1

这是我的代码(main.cpp):

#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include "Game.h"






/**my first game obj**/
Game* g_game = 0;


int main(int argc, char* argv[])
{
g_game = new Game();
g_game->init("Duck Gotti", 100, 100, 640, 480,  SDL_WINDOW_FULLSCREEN );

while (g_game->running())
{
    g_game->handelEvents();
    g_game->update();
    g_game->render();
}
g_game->clean();
return 0;
}

Game.h

#ifndef __Game__
#define __Game__
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
#include <iostream>

SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;

SDL_Texture* m_pTexture;
SDL_Rect m_sourceWREK;
SDL_Rect m_destWREK;

class Game
{
public:
Game(){}
~Game(){}

/**setting the run var to true**/
bool init(const char* title, int xpos, int ypos, int width, int height
,bool fullscreen);

void render();
void update();
void handelEvents();
void clean();
/** a func to access the privet var **/
bool running() { return m_bRunning; }

private:
SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;
    bool m_bRunning;

};

#endif /**defined (__Game__) **/

Game.cpp:

#include "game.h"


bool Game::init(const char* title, int xpos, int ypos, int width, 
int height, bool fullscreen )
{
int flags = 0;
if (fullscreen)
{
    flags = SDL_WINDOW_FULLSCREEN;
}
/**attempt to initalize SDL**/
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
    std::cout << "SDL init sucess/n";
    /**init the winn**/
    m_pWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
    if (m_pWindow !=0)
    {
        std::cout << "window creation sucess/n";
        m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);

    if (m_pRenderer != 0)
    {
        std::cout << "renderer created/n";
        SDL_SetRenderDrawColor(m_pRenderer, 255, 255, 255, 255);
    }
    else
    {
        std::cout << "renderer broked/n";
        return false;
    }
}
else
{
    std::cout << "winn init nope/n";
    return false;
}
}
else
{
    std::cout << "SDL init broked/n";
    return false;
}
std::cout << "init sucess/n";
m_bRunning = true;
return true;

SDL_Surface* pTempSurf = SDL_LoadBMP("img3.bmp");
m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer, pTempSurf);
SDL_FreeSurface(pTempSurf);
SDL_QueryTexture(m_pTexture, NULL, NULL, &m_sourceWREK.w, &m_destWREK.h);

m_destWREK.x = m_sourceWREK.x = 0;
m_destWREK.y = m_sourceWREK.y = 0;
m_destWREK.w = m_sourceWREK.w;
m_destWREK.h = m_sourceWREK.h;


}
void Game::render()
{
SDL_RenderClear(m_pRenderer);
SDL_RenderCopy(m_pRenderer, m_pTexture, &m_sourceWREK, &m_destWREK);
SDL_RenderPresent(m_pRenderer);

}
void Game::update()
{


}
void Game::handelEvents()
{
SDL_Event evil;
if (SDL_PollEvent(&evil))
{
    switch (evil.type)
    {
    case SDL_QUIT:
        m_bRunning = false;
        break;
    default:
        break;
    }
}
}
void Game::clean()
{
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();

}

1 个答案:

答案 0 :(得分:2)

我相信你正在读这本书SDL Game Development。请注意,这本书有很多错误。

删除这些行

SDL_Window* m_pWindow;
SDL_Renderer* m_pRenderer;

SDL_Texture* m_pTexture;
SDL_Rect m_sourceWREK;
SDL_Rect m_destWREK;

它们已在游戏类中定义。

我正在读这本书,幸运的是我有条不紊地保存了这些文件。看来你在第一章

main.cpp

#include "game.h"

Game* g_game = 0;


int main(int argc, char* args[])
{
    g_game = new Game();
    g_game->init("Chapter 1: Setting up SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);


    while( g_game->running() ){

        g_game->handleEvents();
        g_game->update();
        g_game->render();
        SDL_Delay(10);
    }

    g_game->clean();

    return 0;
}

game.h

#ifndef _GAME_H
#define _GAME_H

#include "SDL.h"

class Game
{
public:
    Game() {}
    ~Game() {}
    bool init(const char* title, int xpos, int ypos, int height, int width, int flags);
    void render();
    void update();
    void handleEvents();
    void clean();

    bool running() { return m_bRunning; }

private:
    SDL_Window*   m_pWindow;
    SDL_Renderer* m_pRenderer;

    bool m_bRunning;

};



#endif /* defined(_GAME_H) */

game.cpp

#include "game.h"
#include <iostream>


bool Game::init(const char* title, int xpos, int ypos, int height, int width, int flags)
{
    if ( SDL_Init(SDL_INIT_EVERYTHING) == 0 ){
        std::cout << "SDL init success\n";
        m_pWindow = SDL_CreateWindow(title, xpos, ypos, height, width, flags);

        if ( m_pWindow != 0 ){
            std::cout << "window creation success  \n";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);

            if ( m_pRenderer != 0 ){
                std::cout << "renderer creation success\n";
                SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 0, 255);
            }else{
                std::cout << "renderer init fail\n";
                return false;
            }
        }else{
            std::cout << "window init fail\n";
            return false;
        }
    }else{
        std::cout << "SDL init fail\n";
        return false;
    }

    std::cout << "init success\n";
    m_bRunning = true;
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



    return true;
}

void Game::render()
{
    SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 0, 255);
    SDL_RenderClear(m_pRenderer);
    SDL_RenderPresent(m_pRenderer);
}

void Game::clean()
{
    std::cout << "cleaning game\n";
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}


void Game::handleEvents()
{
    SDL_Event event;

    if ( SDL_PollEvent(&event) ){

        switch( event.type ){
            case SDL_QUIT:
                m_bRunning = false;
            break;

            default:
            break;
        }

    }
}

void Game::update()
{

}

这些是我写过的一些笔记

enter image description here

enter image description here

enter image description here

在第2章之后,您需要组织您的课程,因为您将通过继承轻松迷失。例如,下图,您将在第3章中看到类的连接方式

enter image description here

第4章

enter image description here

希望这会有所帮助。

相关问题