-1

そのため、SDL を学びながらミニ エンジンを構築している最中ですが、バッファにブリットしてからフリップするときに問題が発生し続けています。あなた、私が何をしても画面は黒いままです。ここで私を助けてくれませんか?

2 つのクラスがあります。Graphics クラスと、連携してイメージをブリットする System クラスです。Graphics クラスには汎用関数が設定されており、System はその関数を利用します。システムには変数の 1 つとして Graphics オブジェクトがあり、すべてのグラフィックス レンダリングはそれを介して行われます。どこが間違っていますか?画面は私の画像をバッファにまったくブリットしません:(

//Graphics.h

#ifndef GRAPHICS_H
#define GRAPHICS_H

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

class Graphics
{
    public:
        Graphics();
        void loadImages(SDL_Surface* image, std::string imageName);
        void drawImages(SDL_Surface* image, SDL_Rect crop, SDL_Rect Pos);
        SDL_Surface* ImgLoad(std::string filename);
        void flip();
        void cleanUp(SDL_Surface* image);

        SDL_Surface* background;
        SDL_Surface* buffer;

        friend class System;

    private:


        SDL_Rect backgrdCrop;
        SDL_Rect backgrdPos;
};

#endif // GRAPHICS_H

//Graphics.cpp

    #include "Graphics.h"
#include "SDL/SDL.h"
#include "SDL/SDL_mixer.h"
#include "SDL/SDL_image.h"
#include <string>

Graphics::Graphics()
{
    buffer = NULL;
    background = NULL;

    backgrdCrop = {0, 33, 32, 33};
}

void Graphics::loadImages(SDL_Surface* image, std::string imageName){
    image = ImgLoad(imageName);

    Uint32 colorkey = SDL_MapRGB(image->format, 0xFF, 0 , 0xFF);
    SDL_SetColorKey(image, SDL_SRCCOLORKEY, colorkey);
}

void Graphics::drawImages(SDL_Surface* image, SDL_Rect crop, SDL_Rect Pos)
{
    SDL_BlitSurface(image, &crop, buffer, &Pos);
}

void Graphics::flip(){
    SDL_Flip(buffer);
}

void Graphics::cleanUp(SDL_Surface* image){
    SDL_FreeSurface(image);
}

SDL_Surface* Graphics::ImgLoad(std::string filename)
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optImage = NULL;

    loadedImage = IMG_Load(filename.c_str());
    optImage = SDL_DisplayFormat(loadedImage);

    SDL_FreeSurface(loadedImage);

    return optImage;
}

//System.h

    #ifndef SYSTEM_H
#define SYSTEM_H
#include "SDL/SDL.h"
#include "Graphics.h"
#include "Input.h"

class System
{
    public:
        System();
        void init(bool fullscreen, int width, int height);
        void input();
        void draw();
        bool isDone();
        void quit();
        void flip();
        Graphics g;

    private:
        bool done;

        Input inp;
        SDL_Surface* back;
};

#endif // SYSTEM_H

// system.cpp

    #include <iostream>
#include "System.h"
#include "Graphics.h"
#include "SDL/SDL.h"
#include "Input.h"
#include "SDL/SDL_mixer.h"

System::System()
{
    done = 0;
}

void System::init(bool fullscreen, int width, int height)
{

    SDL_Init(SDL_INIT_EVERYTHING);
    Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096);

    if(fullscreen == 0){

        g.buffer = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE | SDL_FULLSCREEN);

    } else {

        g.buffer = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE);
    }

    g.loadImages(g.background, "swift.jpg");
    SDL_WM_SetCaption("Picking Sticks", NULL);
}

void System::input()
{
    SDL_Rect basic = {0,0,0,0};

      inp.Update();
      g.backgrdPos = basic;

}

void System::draw()
{
      SDL_Rect basic = {0,0,0,0};
      SDL_Rect sprite = {0, 33, 32, 33};

      SDL_BlitSurface(g.background, &basic, g.buffer, &sprite );

}

void System::flip()
{
    g.flip();
}

bool System::isDone()
{
    return done;
}

void System::quit()
{
    g.cleanUp(g.background);
    SDL_Quit();
}

//main.cpp

 #include <iostream>
#include "System.h"
#include "Graphics.h"
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_mixer.h"
#include "Input.h"
#include <string>

using namespace std;

SDL_Event event;

SDL_Surface* temp = NULL;

string name = "swift.jpg";


int main(int argc, char *args[])
{
    System sys;
    sys.init(1, 640, 480);

    while(sys.isDone() == 0)
    {
        if(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT)
            {
                sys.quit();

                return 0;

            }
        }

        sys.input();

        sys.draw();

        sys.flip();
    }

}
4

1 に答える 1

0

にセマンティック エラーがありvoid System::draw()ます。

宣言するとき SDL_Rect basic = {0,0,0,0};は、その値を 0 に設定します。

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

basic関数を使用すると、 rect が として使用されていることに気付くでしょうSDL_Rect *srcrect。これにより、 の幅と高さが にg.background等しくなり0ます。そして、何も描かれません。

全体を描画したい場合はg.background、パラメータに NULL を指定してSDL_Rect *srcrectください。

于 2013-06-12T15:20:11.377 に答える