SDL2 遊戲開發日誌(二)

2021-10-01 07:18:29 字數 4426 閱讀 9588

構建框架:場景,渲染。

負責載入和渲染,它將可以新增到指定的【場景】中,當【場景】被【場景管理類】呼叫時,它將每一幀都被呼叫和更新。

#pragma once

#include #include using namespace std;

class renderable

virtual ~renderable()

if (mrenderrect != null)

if (mcliprect != null)

} void setlayer(int layer)

int getlayer()

virtual bool loadtexture(string filename);

void setpos(int x,int y)

} bool isdeleted()

void delete()

bool isvisible()

void setvisible(bool visible)

virtual void update(float time_step){}

virtual void render();

int getwidth()

int getheight()

};bool renderable::loadtexture(string filename)

sdl_su***ce *su***ce = img_load(filename.c_str());

if (su***ce != null)

sdl_freesu***ce(su***ce);

} return bresult;

}void renderable::render()

sdl_rendercopyex(thegame.getrenderer(), mtexture, mcliprect, mrenderrect, 0, null, sdl_flip_none);

}

派生於renderable類

#include "renderable.h"

#include #include using namespace std;

class textrenderable : public renderable

bool settext(string text, int fontsize, sdl_color color);

virtual void update(float time_step)

};bool textrenderable::settext(string text, int fontsize, sdl_color color)

ttf_font *font = thegame.getfont(fontsize);

if (font != null)

sdl_freesu***ce(textsu***ce);

}} }

if (bsuccess)

return bsuccess;

}

負責載入遊戲字型

#pragma once

#include #include #include #define fontmap mapusing namespace std;

class gamefont

~gamefont()

mfonts.clear();

} ttf_font *getfont(int fontsize)

else

} return font;

} void deletefont(int fontsize)

}};

管理場景中的所有渲染物體

#pragma once

#include #include #include #include "renderable.h"

typedef std::vectorrenderlist;

typedef std::maprenderlayers;

class scene

virtual void loadscene(){}

virtual ~scene();

void addrenderable(int layer, renderable *renderobj);

void addrenderable(renderable*renderobject);

renderlayers getlayers();

void update(float time_step);

void render();

virtual void handleevent(sdl_event &_event)

};void scene::update(float time_step)

layeriter++; }}

void scene::render()

else

} layeriter++;

}}

管理遊戲場景,負責場景的載入,場景的切換,單例模式

#pragma once

#include "scene.h"

#include using namespace std;

#define thescenemanager scenemanager::instance()

typedef mapscenelist;

class scenemanager

void operator=(const scenemanager &){}

scenemanager()

scenelist mscenelist;

public:

static scenemanager &instance()

~scenemanager()

mscenelist.clear();

} bool addscene(int index, scene *scene)

mscenelist.insert(make_pair(index, scene));

return true;

} bool changescene(int index)

return false;

} void deletescene(int index)

} void update(float time_step)

void render()

void handleevent(sdl_event &_event)

}};

在主迴圈中呼叫場景管理類進行更新和渲染

void sdlgame::run()

thescenemanager.handleevent(mevent);

} thescenemanager.update(mtimestep);

sdl_setrenderdrawcolor(mrenderer, 0x00, 0x00, 0x00, 0xff);

sdl_renderclear(mrenderer);

////繪圖

//thescenemanager.render();

sdl_renderpresent(mrenderer);

int remaining_time = mframetime - (sdl_getticks() - start);

if (remaining_time > 0)

mtimestep = (sdl_getticks() - start) / 1000.f;

} if (mrenderer != null)

sdl_destroyrenderer(mrenderer);

if (mwindow != null)

sdl_destroywindow(mwindow);

img_quit();

ttf_quit();

sdl_quit();

}

框架初步完成,**中估計還有bug,下一步將用它寫乙個【俄羅斯方塊】來測試和修改

void loadingscene::loadscene();

if (loading->settext(chartoutf8("載入中……"), 30, color))

SDL2 遊戲開發日記 六 紋理快取

功能 名字相同的紋理只載入一次,重複使用。紋理快取類採用單例模式。支援從檔案或者從sdl rwops中載入紋理 pragma once include include using namespace std struct textureinfo textureinfo typedef maptext...

SDL2函式簡單介紹01

int sdl init uint32 flags 內部呼叫了sdl initsubsystem 功能 初始化sdl庫,呼叫其他sdl函式之前必須先呼叫此函式 引數 falgs 子系統初始化標誌取下列值的or sdl init timer timer subsystem sdl init audio...

SDL2函式簡單介紹04

1.sdl thread sdl createthread sdl threadfunction fn,const char name,void data 功能 建立乙個新的執行緒 引數 fn 新執行緒中呼叫的函式 name 執行緒的名字 data 傳給fn的引數 返回值 成功返回給新執行緒不透明指...