游戏开发记录
博客专区 > gim 的博客 > 博客详情
游戏开发记录
gim 发表于2个月前
游戏开发记录
  • 发表于 2个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

尝试不使用现成的游戏引擎开发游戏。

最终目标:在steam上线。

搭建框架

由于没有使用游戏引擎,需要自己先搭建一个框架。

    开发环境使用Microsoft Visual Studio Community 2017。

    框架使用 C++ OpenGL GLFW 搭建。

    目前main.cpp长这样,游戏框架类定名为GameEngine。

#include "GameEngine.h"
#include "StartScene.h"

int main(int argc, char *argv[]){

	auto error = GameEngine::getInstance()
		->init(argc, argv)
		->setTitle("Game Demo")
		->setWindowSize(1280, 720)
		->setUp();

	if (!error) {
		GameEngine::getInstance()->runWithScene(StageScene::create());
	}
	
	GameEngine::destoryInstance();
	return 0;
}

    GameEngine 负责创建窗口,发起游戏循环,并在其中进行更新与渲染。

创建窗口

int GameEngine::setUp(){

	glfwInit();

	_glfwWindow = glfwCreateWindow((int)_windowRect.w(), (int)_windowRect.h(), title, NULL, NULL);

	if (!_glfwWindow) {
		glfwTerminate();
		return 1;
	}

	glfwMakeContextCurrent(_glfwWindow);

	glfwSetWindowSizeCallback(_glfwWindow, &GameEngine::reshapeFunc_);

	reshapeFunc((int)_windowRect.w(), (int)_windowRect.h());

	InputEngine::getInstance();

	return 0;
}

开始主循环

int GameEngine::runWithScene(Scene* gameScene_) {

	_startGameTime = clock();       //开始时间
	_lastGameTime = _startGameTime; //上一刻的时间

	//根节点
	_renderRoot = Node::create();
	_renderRoot->addChild(gameScene_);

	//窗口是否被关闭了。
	auto shouldClose = glfwWindowShouldClose(_glfwWindow);

	//期望的逻辑帧之间的间隔时间
	auto expectedFrameInterval = 1000.0f / _targetUpdateRate;

	while (!shouldClose){

		//当前时间
		auto curGameTime = clock();
		
		//游戏持续时间
		_gameDuration = curGameTime - _startGameTime;

		//(当前时间差)计算当前这一刻与上一刻的时间差。
		auto currentFrameInterval = curGameTime - _lastGameTime;
		
		//当前时间差大于等于设定时间差,发起更新。
		auto diff = currentFrameInterval - expectedFrameInterval;
		if (diff > 0) {
			gameLoop(currentFrameInterval);
			_lastGameTime = curGameTime;
		}

		//发起渲染
		displayFunc();
		
		//计算frame per second
		if (_gameDuration) {
			++_renderFrameCount;
			_frameRate = _renderFrameCount * 1000.0f / _gameDuration;
		}

		//glfw事件处理
		glfwPollEvents();

		//窗口是否被关闭了,
		shouldClose = glfwWindowShouldClose(_glfwWindow);
	}
	glfwTerminate();
	InputEngine::destoryInstance();

	return 0;
}

void GameEngine::gameLoop(float deltaTime_) {

	//根节点更新
	if (_renderRoot) {
		_renderRoot->onUpdate(deltaTime_);
	}

	//计算update per second
	if (_gameDuration) {
		++_logicFrameCount;
		_updateRate = _logicFrameCount * 1000.0f / _gameDuration;
	}
}

 

标签: game
共有 人打赏支持
粉丝 0
博文 1
码字总数 385
×
gim
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: