【问题标题】:SDL2 errors what am I doing WrongSDL2 错误我在做什么错
【发布时间】:2015-05-23 23:50:15
【问题描述】:

在我尝试加载图像之前它正在工作。

这是我得到的错误:

错误 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;
}

游戏.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__) **/

游戏.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();

}

【问题讨论】:

    标签: c++ sdl-2


    【解决方案1】:

    我相信您正在阅读这本书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()
    {
    
    }
    

    这是我写的一些笔记

    在第 2 章之后,你需要组织你的类,因为你很容易迷失在继承中。例如下图,您将在第 3 章中看到类的连接方式

    对于第 4 章,

    希望这会有所帮助。

    【讨论】:

    • @JoeyHill,如果这个答案解决了你的问题,请接受它作为答案。
    • kk 明白了!更多问题是 Jazon Yamamoto 的 The Black Art of Multiplatform Game Programming 更好吗?
    • @JoeyHill,抱歉我没有读过这本书,但从示例来看,似乎使用了旧版本的 sdl,这意味着您需要重写代码以适应 SDL 2。
    • 还要注意,你必须在头文件中将全局变量声明为extern,然后在cpp文件中定义它们。这是一个简短的解释:stackoverflow.com/a/19929727/8715,这是一个更长的解释:stackoverflow.com/a/1433387/8715
    猜你喜欢
    • 2017-06-16
    • 2013-11-25
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2013-05-02
    相关资源
    最近更新 更多