gpt4 book ai didi

C++/SDL封装设计帮助

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:09 27 4
gpt4 key购买 nike

所以我对 C++ 是半新的,对 SDL 是全新的。我对 OOP 的大部分概念性知识都来自 Java 和 PHP。所以请耐心等待。

我正在尝试用我的程序制定一些简单的设计逻辑/很快就会成为横向卷轴器。我的问题在于尝试让我的“屏幕”层 (screen = SDL_SetVideoMode(...)) 可供所有其他类访问;英雄类、背景层、敌人等。我一直在松散地遵循一些更程序化的教程,并一直在努力使它们适应更面向对象的方法。这是我到目前为止的一些内容:

main.cpp

#include "Game.h"
#include "Hero.h"

int main(int argc, char* argv[])
{
//Init Game
Game Game;

//Load hero
Hero Hero(Game.screen);

//While game is running
while(Game.runningState())
{
//Handle Window and Hero inputs
Game.Input();
Hero.userInput();

//Draw
Game.DrawBackground();
Hero.drawHero();

//Update
Game.Update();
}

//Clean up
Game.Clean();

return 0;
}

如您所见,我有一个游戏类和一个英雄类。 Game 类负责设置初始窗口,并放置背景。如您所见,它还会更新屏幕。

现在,由于我的 Game 类拥有 'screen' 属性,它是 SDL_SetVideoMode 的句柄,我无法将其传递给任何其他类(例如:Hero Hero(Game. screen);) 需要更新到这个屏幕...比如通过 SDL_BlitSurface

现在,这行得通,但我认为必须有一种更优雅的方法。就像可能将 screen 处理程序保留在全局范围内(如果可能)?

TLDR/简单版本:让所有后续类都可以访问我的窗口/屏幕处理程序的最佳方法是什么?

最佳答案

我喜欢你做事的方式。

虽然我不会传递屏幕引用,但我会传递对游戏本身的引用。这样每个英雄对象也知道自己属于哪个游戏,然后可以根据需要向游戏对象请求屏幕。

我这样做的原因是,几年后当您的游戏成为一款广泛且成功的产品并且您将其转换为在线游戏时,您真的不需要做任何工作。游戏服务器将能够轻松支持多个游戏对象,每个游戏对象托管多个英雄对象。当每个英雄对象想要绘制时,它会向游戏请求屏幕并更新屏幕(屏幕现在可以从游戏对象到游戏对象并且仍然可以完美工作(只要它们具有相同的界面)。

class Game
{
public:
Game(Screen& screen)
: screen(screen)
{}
virtual ~Game() {}
virtual Screen& screen() { return theGameScreen;}

void update() { /* Draw Screen. Then draw all the heros */ }

private:
friend Hero::Hero(Game&);
friend Hero::~Hero();
void addHero(Hero& newHero) {herosInGame.push_back(&newHero);}
void delHero(Hero& newHeor) {/* Delete Hero from herosInGame */}

// Implementation detail about how a game stores a screen
// I do not have enough context only that a Game should have one
// So theoretically:

Screen& theGameScreen;
std::vector<Hero*> herosInGame;


};

class Hero
{
public:
Hero(Game& game)
: game(game)
{game.addHero(*this);}
virtual ~Hero()
{game.delHero(*this);}


virtual void Draw(Screen& screen) {/* Draw a hero on the screen */}
private:
Game& game;
};

主要。

#include "Game.h"
#include "Hero.h"

int main(int argc, char* argv[])
{
//Init Game
Screen aScreenObject
Game game(aScreenObject);

//Load hero
Hero hero(game); // or create one hero object for each player


//While game is running
while(game.runningState())
{
//Handle Window and Hero inputs
Game.Input();
Hero.userInput();

//Update
Game.update();
}

//Clean up
// Game.Clean(); Don't do this
// This is what the destructor is for.
}

关于C++/SDL封装设计帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com