C++ SDL#U纹理不';不要在第二次审判中被抽签
main.cppC++ 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";
#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;
};