2011-08-29 3 views
1

너무 긴 게시물 인 경우 사과하십시오. SDL을 객체 지향 방식으로 작동시키려는 것뿐입니다.이 시점을 지나기 전까지는 계속 움직이지 않습니다. 이 시간을 컴파일하고 오류가 발생하는 데 상당한 시간을 투자했습니다. 헤더 파일과 소스, 그리고 makefile과 출력을 게시하여 진행 상황을 확인합니다.SDL - 객체 지향적 인 방법

#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 

여기 render.h입니다

... 그리고 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의 :

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

int main(int argc, char * args[]) 
{ 
    std::cout << "hello world!" << std::endl; 

    ScreenWriter * instance = ScreenWriter::get_instance(); 

    instance->flip_screen(); 

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

    delete instance(); 

    return 0; 
} 

을 ... 내 출력 :

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 

... 내 메이크 파일

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 좌표를 지정하여 렌더링을 렌더링에 의존합니다. 이것은 절차 적으로하기 쉽지만, 이것에 대해서는 객체 지향 디자인을 실험 할 준비가되어있다.

그래서 어떤 생각이든?

+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이 개체 또는 참조가 아닌 포인터를 반환하기 때문입니다.뿐만 아니라 전 완전히 잘못이지만,이 new에 의해 할당 아무것도 사용하지 있기 때문에 또한

,
delete instance(); 

delete render; 

해야한다. 그러나 render입니다. 따라서 메모리 누출을 피하려면 delete해야합니다.

질문에 대한 "어떤 생각"부분을 이해하지 못하는 이유는 무엇인가에 대해 말하지 않기 때문입니다. 영어가 제 첫 번째 언어가 아니기 때문에 뭔가를 놓친다면 용서해주십시오.

+0

고맙습니다. 오류를 수정했습니다. 그러나 왜 객체가 렌더링되지 않고 왜 SDL이 초기화되지 않는지에 대해 말해 줄 수 있습니까? 프로그램이 컴파일되고 실행되지만 아무 일도 일어나지 않습니다. – zeboidlund

+1

@Holland 당신이 어디에서나'Screenwriter :: initialize'를 호출하지 않기 때문에 SDL이 초기화되지 않습니다. 또한 delete instance();는'delete render;'여야합니다 (이전의 실수를 수정했습니다) –

0

이미지를 렌더링 한 후 화면을 뒤집습니다. 당신이 뭔가 blit 때, 그것은 버퍼에 blitted입니다. SDL_Flip()은 o/p를 볼 수 있도록 해당 버퍼를 스왑합니다. 그래서 그 두 줄을 대체해야합니다.

+0

어, 다른 답변에서 녹색 체크가 보입니까? 이것은 OP가 답변을 수락했음을 의미하며, 문제 해결에 도움이됩니다. 1 년 전;) 어쨌든, 당신의 노력에 감사드립니다. – fancyPants

관련 문제