2011-08-29 69 views
1

如果這篇文章太長,請道歉。我只是試圖讓SDL以面向對象的方式工作 - 在我越過這一點之前,我沒有任何意義。花了相當長的時間編譯並獲取錯誤。我將發佈我的頭文件和源代碼,以及我的makefile和輸出以查看發生了什麼。SDL - 面向對象的方式

這裏的render.h

#ifndef RENDER_H 
#define RENDER_H 

#include <string> 
#include <SDL/SDL.h> 

using std::string; 

class Render 
{ 
public: 
     Render(string filename, int x, int y, SDL_Surface * destination); 
    ~Render(); 
private: 
    SDL_Surface * m_optimizedImage; 

    void load_image(string filename); 
    void apply_surface(int x, int y, SDL_Surface * source, SDL_Surface * destination); 
}; 

#endif 

...和render.cpp

#include <SDL/SDL.h> 
#include <SDL/SDL_image.h> 
#include <string> 
#include "render.h" 

using std::string; 

Render::Render(string filename, int x, int y, SDL_Surface * destination) 
{ 
    this->m_optimizedImage = NULL; 
    load_image(filename); 
    apply_surface(x, y, m_optimizedImage, destination); 

} 

Render::~Render() 
{ 
    delete m_optimizedImage; 
} 

void Render::load_image(string filename) 
{ 
    SDL_Surface * loadedImage = IMG_Load(filename.c_str()); 

    if (loadedImage != NULL) 
    { 
     m_optimizedImage = SDL_DisplayFormat(loadedImage); 

     SDL_FreeSurface(loadedImage); 
    } 
} 

void Render::apply_surface(int x, int y, SDL_Surface * source, SDL_Surface * destination) 
{ 
    SDL_Rect offset; 

    offset.x = x; 
    offset.y = y; 

    SDL_BlitSurface(source, NULL, destination, &offset); 

} 

...和screenwriter.h

#include <iostream> 
#include <SDL/SDL.h> 



#ifndef SCREENWRITER_H 
#define SCREENWRITER_H 

class ScreenWriter 
{ 
public: 

    ~ScreenWriter(); 

    bool flip_screen(); 
    void delay_screen(int milliseconds); 

    bool get_screen_state() const; 
    static ScreenWriter& get_instance(); 

    SDL_Surface * get_screen() const; 
private: 
    ScreenWriter(); 

    void initialize(); 
    bool m_screenFailure; 

    SDL_Surface * m_screen; 

}; 

#endif 

...和screenwriter.cpp

#include <SDL/SDL.h> 
#include "screenwriter.h" 

#define SCREEN_WIDTH 640 
#define SCREEN_HEIGHT 480 
#define SCREEN_BPP 32 

ScreenWriter::ScreenWriter() 
{ 
    this->m_screenFailure = false; 
    initialize(); 
} 

ScreenWriter::~ScreenWriter() 
{ 

    SDL_Quit(); 
} 

ScreenWriter& ScreenWriter::get_instance() 
{ 
    static ScreenWriter instance; 

    return instance; 
} 

SDL_Surface * ScreenWriter::get_screen() const 
{ 
    return m_screen; 
} 

bool ScreenWriter::get_screen_state() const 
{ 
    return this->m_screenFailure; 
} 

void ScreenWriter::delay_screen(int milliseconds) 
{ 
    SDL_Delay(milliseconds); 
} 

int ScreenWriter::flip_screen() 
{ 

    if (SDL_Flip(m_screen) == -1) 
    { 
     return 1; 
    } 
    else 
    { 

     SDL_Flip(m_screen); 
     return 0; 
    } 

} 

void ScreenWriter::initialize() 
{ 
     if (SDL_Init(SDL_INIT_EVERYTHING == -1)) 
     { 
       std::cout << "SDL_Init has failed"; 
     } 
     else 
     { 

       SDL_Init(SDL_INIT_EVERYTHING); 
       //initialize screen 
       this->m_screen = SDL_SetVideoMode(SCREEN_WIDTH, 
                SCREEN_HEIGHT, 
                SCREEN_BPP, 
                SDL_SWSURFACE); 

       if (m_screen == NULL) 
       { 
         this->m_screenFailure = true; 
       } 
       else 
       { 
         this->m_screenFailure = false; 
       } 

       //set caption header 
       SDL_WM_SetCaption("Hello WOrld", NULL); 
     } 

} 

...當然main.cpp中的:

​​

...我輸出

g++ -c main.cpp render.h screenwriter.h -lSDL -lSDL_image 
main.cpp: In function ‘int main(int, char**)’: 
main.cpp:10:55: error: cannot convert ‘ScreenWriter’ to ‘ScreenWriter*’ in initialization 
main.cpp:12:69: error: conversion from ‘Render*’ to non-scalar type ‘Render’ requested 
make: *** [main.o] Error 1 

... my makefile

program : main.o render.o screenwriter.o 
    g++ -o program main.o render.o screenwriter.o -lSDL -lSDL_image 

main.o : main.cpp render.h screenwriter.h 
    g++ -c main.cpp render.h screenwriter.h -lSDL -lSDL_image 

render.o : render.h render.cpp 
    g++ -c render.h render.cpp -lSDL 

screenwriter.o : screenwriter.h screenwriter.cpp 
    g++ -c screenwriter.h screenwriter.cpp -lSDL -lSDL_image 

clean: 
    rm program main.o render.o screenwriter.o 

細節問題

我與這個目標是有編劇實現爲一個單獨設置快板和標誌的一切,通過初始化需要。第二個目標依賴於渲染通過指定x和y座標以及要渲染以在地圖上加載的文件的路徑來渲染。這很容易在程序上做,但我已經準備好在這方面嘗試OO設計。

那麼,有什麼想法?

+1

等一下,你正在使SDL面向對象? [有沒有人已經這樣做?](http://www.sfml-dev.org/) –

+0

這很好,如果這已經完成。我決定以面向對象的方式做到這一點,所以我可以學習。另外,SDL是一個很好的圖形庫。 – zeboidlund

+0

是的,我只是指出,SDL是用C編寫的,但SFML是用C++編寫的。另外許多人認爲它的設計更好,速度也比SDL快。 –

回答

3

你有哪些是明確的,從你的錯誤的兩點語法錯誤:

ScreenWriter * instance = ScreenWriter::get_instance(); 

應該

ScreenWriter & instance = ScreenWriter::get_instance(); 

因爲get_instance回報率的參考,而不是一個指針,

Render render = new Render("look.png", 0, 0, instance->get_screen()); 

應該是

Render * render = new Render("look.png", 0, 0, instance->get_screen()); 

因爲new返回一個指針,而不是對象或引用。

此外,

delete instance(); 

應該

delete render; 

,因爲這不僅是前者完全錯誤的,但它沒有被通過new分配任何使用。然而,render是。所以你必須去delete它來避免內存泄漏。

我不明白問題的「任何想法」部分,因爲它沒有說明什麼。雖然英語不是我的第一語言,但如果我錯過了某些東西,請原諒我。

+0

謝謝。我修復了錯誤。但是,你能告訴我爲什麼我的對象不會呈現,爲什麼SDL不會初始化?程序編譯並運行,但沒有任何反應。 – zeboidlund

+1

@Holland你不會在我看到的任何地方調用'Screenwriter :: initialize',所以SDL沒有初始化。另外'刪除實例();'應該是'刪除渲染;'(更正以前的錯誤) –

0

渲染圖像後翻轉屏幕。當你blit的東西,它的blittle在緩衝區。 SDL_Flip()只是交換這些緩衝區,以便您可以看到您的o/p。所以你應該替換那兩條線,我想。

+0

呃,你看到另一個答案的綠色檢查?這意味着OP已經接受了答案,它幫助他解決了這個問題。一年前;)無論如何,謝謝你的努力。 – fancyPants