⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 介绍c++游戏编程
💻 CPP
字号:

#include "GameEntity.h"
#include "GameCamera.h"
#include "StreamFile.h"
#include "EntityFactory.h"
#include "AddressTranslator.h"
#include <iostream>
#include <assert.h>


GameEntity * CreateGame()
{
    GameEntity * pRoot = new GameEntity("Root");

    GameCamera * pCamera = new GameCamera("Camera1");
    pCamera->m_FOV = 80.0f;
    pCamera->m_nearPlane = 10.0f;
    pCamera->m_farPlane  = 500.0f;

    GameEntity * pEntity1 = new GameEntity("Entity1");
    GameEntity * pEntity2 = new GameEntity("Entity2");

    pRoot->AddChild(pCamera);
    pRoot->AddChild(pEntity1);
    pRoot->AddChild(pEntity2);

    GameEntity * pEntity3 = new GameEntity("Entity3");
    GameEntity * pEntity4 = new GameEntity("Entity4");
    pEntity1->AddChild(pEntity3);
    pEntity1->AddChild(pEntity4);

    GameEntity * pEntity5 = new GameEntity("Entity5");
    pEntity4->AddChild(pEntity5);

    pCamera->m_pTarget = pEntity4;

    return pRoot;
}


void DeleteTree (GameEntity * pRoot)
{
    int numChildren = pRoot->GetNumChildren();
    for (int i=0; i!=numChildren; ++i)
    {
        GameEntity * pChild = pRoot->GetChild(i);
        DeleteTree (pChild);
        delete pChild;
    }
}


void PrintTree(GameEntity * pRoot, int indent = 0)
{
    //for (int col=0; col<indent; ++col)
    //    std::cout << "  ";

    //std::cout << pRoot->GetClass() << ": " << pRoot->GetName() << std::endl;
    pRoot->Print(indent);

    int numChildren = pRoot->GetNumChildren();
    for (int i=0; i<numChildren; ++i)
    {
        GameEntity * pChild = pRoot->GetChild(i);
        PrintTree (pChild, indent+1);
    }
}



void SaveTree(IStream & stream, GameEntity * pRoot)
{
    WriteString(stream, pRoot->GetClass());
    WriteInt(stream, (int)pRoot);
    pRoot->Write(stream);

    int numChildren = pRoot->GetNumChildren();
    for (int i=0; i<numChildren; ++i)
    {
        GameEntity * pChild = pRoot->GetChild(i);
        SaveTree (stream, pChild);
    }
}


void SaveGame(GameEntity * pRoot, const std::string & filename)
{
    StreamFile stream;
    stream.OpenWrite(filename);
    SaveTree(stream, pRoot);
    stream.Close();
}


GameEntity * LoadEntity(IStream & stream)
{
    std::string strClassName = ReadString(stream);
    GameEntity * pEntity = EntityFactory::Create(strClassName);
    assert (pEntity!= NULL);

    void * pOldAddress = (void *)ReadInt(stream);
    AddressTranslator::AddAddress(pOldAddress, pEntity);

    pEntity->Read(stream);
    return pEntity;
}



GameEntity * LoadTree(IStream & stream)
{
    GameEntity * pEntity = LoadEntity(stream);

    if (pEntity != NULL)
    {
        int numChildren = pEntity->GetNumChildren();
        for (int i=0; i<numChildren; ++i)
            LoadTree(stream);
    }

    return pEntity;
}


void FixupPass(GameEntity * pRoot)
{
    pRoot->Fixup();

    int numChildren = pRoot->GetNumChildren();
    for (int i=0; i<numChildren; ++i)
        FixupPass(pRoot->GetChild(i));
}



GameEntity * LoadGame(const std::string & filename)
{
    StreamFile stream;
    stream.OpenRead(filename);
    GameEntity * pRoot = LoadTree(stream);
    FixupPass(pRoot);
    stream.Close();

    return pRoot;
}



int main()
{
    GameEntity * pRoot = CreateGame();

    std::cout << "Original tree:" << std::endl;
    PrintTree(pRoot);

    std::string filename = "game.bin";
    SaveGame(pRoot, filename);
    DeleteTree(pRoot);

    pRoot = LoadGame(filename);

    std::cout << std::endl << "Loaded tree:" << std::endl;
    PrintTree(pRoot);

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -