Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL#U纹理不';不要在第二次审判中被抽签_C++_Sdl 2 - Fatal编程技术网

C++ SDL#U纹理不';不要在第二次审判中被抽签

C++ SDL#U纹理不';不要在第二次审判中被抽签,c++,sdl-2,C++,Sdl 2,main.cpp #include "SDL.h" #include <cstdio> #include <iostream> #include "Game.h" //Constants bool isFullscreen = false; const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const char *GAME_NAME = "Alex's RPG Game | Version 2";

main.cpp

#include "SDL.h"
#include <cstdio>
#include <iostream>
#include "Game.h"

//Constants
bool isFullscreen = false;
const int SCREEN_WIDTH  = 640;
const int SCREEN_HEIGHT = 480;
const char *GAME_NAME = "Alex's RPG Game | Version 2";

//Game
Game *game = nullptr; //Game is null --> nullpointer


int main(int argc, char* argv[]) {
    //Ignore the arguments

    std::cout << "Starting game" << std::endl;

    game = new Game();

    game->init(GAME_NAME, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_RESIZABLE);

    while (game->isGameRunning()){
        game->handleEvents();
        game->update();
        game->render();
    }

    game->destroy();

    return 0;
}
飞溅屏

class SplashScreen: public IScreen{
public:

    explicit SplashScreen(Game *game);
    ~SplashScreen();

    void render(SDL_Renderer *renderer) override;
    void update() override;
    void create(SDL_Renderer *renderer) override;

private:
    SDL_Texture *texture;
    SDL_Rect rect;

    Game *game;

    int time = 0;

};
SplashScreen.cpp类是IScreen的一个实现

SplashScreen::SplashScreen(Game *game1){

    //Constructor
    game = game1;
}

SplashScreen::~SplashScreen(){

    //Deconstructor

}

void SplashScreen::update() {
    // Update the screen

    if(SDL_GetTicks() > 5000 + time){
        game->setScreen(new MenuScreen(game));
    }

}

void SplashScreen::render(SDL_Renderer *renderer) {

    SDL_RenderCopy(renderer, texture, NULL, &rect);

}


void SplashScreen::create(SDL_Renderer *renderer) {

    texture = TextureManager::loadTexture("player.png", renderer);

    rect.x = 50;
    rect.y = 50;
    rect.h = 32;
    rect.w = 32;

    time = SDL_GetTicks();

}
MenuScreen.h

class MenuScreen: public IScreen{
public:

    explicit MenuScreen(Game *game1);
    ~MenuScreen();

    void render(SDL_Renderer *renderer) override;
    void update() override;
    void create(SDL_Renderer *renderer) override;

private:
    SDL_Texture *tex;
    SDL_Rect rect;

    Game *game;

};
MenuScreen.cpp类也是IScreen的一个实现:

MenuScreen::MenuScreen(Game *game1) {
    game = game1;
}

MenuScreen::~MenuScreen() {

}

void MenuScreen::update() {
    std::cout << "Why can't it render" << std::endl;
}

void MenuScreen::render(SDL_Renderer *renderer) {

    std::cout << "Why can't it render" << std::endl;

    SDL_RenderCopy(renderer, tex, nullptr, &rect);

}

void MenuScreen::create(SDL_Renderer *renderer) {

    tex = TextureManager::loadTexture("test.png", renderer);

    rect.x = 100;
    rect.y = 100;
    rect.h = 32;
    rect.w = 32;

}
IScreen.h

#include "SDL.h"

class IScreen{
public:

    virtual void create(SDL_Renderer *renderer) = 0;

    virtual void render(SDL_Renderer *renderer) = 0;
    virtual void update() = 0;


};

您的代码从不调用
MenuScreen::create
方法,因此您的
SDL\u纹理
永远不会被创建

您在一条评论中说,您检查了属性
tex
的值,并且它不是null,但是由于它没有在构造函数中初始化,所以它可能包含一个随机值


这些都是与您的问题直接相关的更一般性的评论,但正如我在评论中所说的,您应该真正更改您的程序架构,因为您有许多固有的bug。例如,当您将屏幕指针切换到菜单屏幕指针时,正在泄漏SplashScreen对象


<>你应该看看C++中一个好的游戏状态引擎,并在状态引擎中管理飞溅屏幕、菜单和其他游戏状态。例如,有一个很好的基本状态机实现。

void SplashScreen::render()
中有一个
rect
变量。它是类变量还是局部变量?另外,
delete
main(int argc,char*argv[])末尾的
Game
对象,避免内存泄漏。@atmostmediocre rect是一个类变量(SDL\u rect)。游戏被破坏了,它有自己的功能,但我没有粘贴它,以保持代码清晰
TextureManager
中有什么?我猜
screen
变量是
SplashScreen
。您需要另一个变量,这次是
MenuScreen
并实际显示它,因为在
Game::render()
MenuScreen从来都不是drawnAlso,为什么要在MenuScreen中使用
SDL\u SetRenderTarget
?当您调用
MenuScreen::render
时,您能确认您的
tex
变量不为null吗?我发现,我只缺少调用screen->create();当我在游戏课上设置新屏幕时。很高兴我能帮上忙。如果是你的问题,你可以接受我的回答。不过,我还是建议大家听从我的架构建议。我设计游戏引擎已经很长一段时间了,我可以马上告诉你,你会遇到问题。我肯定会做一些改变。我最初的设计是基于发动机的设计,但现在我认为,这不是一个好的决定。
MenuScreen::MenuScreen(Game *game1) {
    game = game1;
}

MenuScreen::~MenuScreen() {

}

void MenuScreen::update() {
    std::cout << "Why can't it render" << std::endl;
}

void MenuScreen::render(SDL_Renderer *renderer) {

    std::cout << "Why can't it render" << std::endl;

    SDL_RenderCopy(renderer, tex, nullptr, &rect);

}

void MenuScreen::create(SDL_Renderer *renderer) {

    tex = TextureManager::loadTexture("test.png", renderer);

    rect.x = 100;
    rect.y = 100;
    rect.h = 32;
    rect.w = 32;

}
SDL_Texture *TextureManager::loadTexture(const char *path, SDL_Renderer *renderer) {

    SDL_Surface* surface = IMG_Load(path);
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);
    return texture;
}
#include "SDL.h"

class IScreen{
public:

    virtual void create(SDL_Renderer *renderer) = 0;

    virtual void render(SDL_Renderer *renderer) = 0;
    virtual void update() = 0;


};