SDL2 游戏开发日记(一)

SDL2 游戏开发日记(一)

SDL的基础教程请戳这里

创建游戏窗口

开发工具:VC++ 2013

新建项目 --> Win32 控制台应用程序

窗口类:

使用单例模式

窗口标题如果要显示中文,要把字符串转成UTF8编码

#pragma once
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_image.h>
#include <string>
using namespace std;
#define theGame SDLGame::Instance()
#define DEFAULT_FPS 60
class SDLGame{
private:	
	int mFrameTime = 1000 / DEFAULT_FPS;
	SDL_Window *mWindow = NULL;	
	SDL_Renderer *mRenderer = NULL;
	SDL_Event mEvent;
	bool IsRunning;
	SDLGame(){
		IsRunning = true;
	}
	SDLGame(const SDLGame &){}
	void operator=(const SDLGame &){}
public:	
	static SDLGame &Instance(){
		static SDLGame instance;
		return instance;
	}	
	~SDLGame(){}
	void setFPS(int fps){
		mFrameTime = 1000 / fps;
	}
	bool Init(string title,int x,int y,int width,int height){
		do{
			if (SDL_Init(SDL_INIT_EVERYTHING)){
				printf("SDL_Init error:%s\n", SDL_GetError());
				break;
			}
			if (TTF_Init()){
				printf("TTF_Init error:%s\n", SDL_GetError());
				break;
			}
			int imageFlags = IMG_INIT_PNG;
			if (!(IMG_Init(imageFlags) & imageFlags)){				
				printf("IMG_Init error:%s\n",SDL_GetError());
				break;
			}
			mWindow = SDL_CreateWindow(title.c_str(), x, y, width, height, SDL_WINDOW_SHOWN);
			if (mWindow == NULL){
				printf("SDL_CreateWindow error:%s\n",SDL_GetError());
				break;
			}
			mRenderer = SDL_CreateRenderer(mWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
			if (mRenderer == NULL){
				printf("SDL_CreateRenderer error:%s\n", SDL_GetError());
				break;
			}
			IsRunning = true;
			return true;
		} while (0);
		IsRunning = false;
		return false;
	}
	SDL_Renderer *getRenderer(){
		return mRenderer;
	}
	void Run(){
		while (IsRunning)
		{
			int start = SDL_GetTicks();
			while (SDL_PollEvent(&mEvent)){
				if (mEvent.type == SDL_QUIT){
					IsRunning = false;
				}
			}
			SDL_SetRenderDrawColor(mRenderer, 0x00, 0x00, 0x00, 0xFF);
			SDL_RenderClear(mRenderer);
			//
			//绘图
			//
			SDL_RenderPresent(mRenderer);
			int remaining_time = mFrameTime - (SDL_GetTicks() - start);
			if (remaining_time > 0){
				SDL_Delay(remaining_time);
			}
		}
		if (mRenderer != NULL)
			SDL_DestroyRenderer(mRenderer);
		if (mWindow != NULL)
			SDL_DestroyWindow(mWindow);		
		IMG_Quit();
		TTF_Quit();
		SDL_Quit();
	}
	void Destroy(){
		IsRunning = false;
	}
};

字符串转UTF8函数:

//
std::string wcharToUTF8(wchar_t *str){
	std::string strOutUTF8;
	int n = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
	char * str2 = new char[n];
	WideCharToMultiByte(CP_UTF8, 0, str, -1, str2, n, NULL, NULL);
	strOutUTF8 = str2;
	delete[]str2;
	str2 = NULL;
	return strOutUTF8;
}
//
std::string charToUTF8(char *str)
{
	std::string strUTF8 = "";
	WCHAR * str1;
	int n = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
	str1 = new WCHAR[n];
	MultiByteToWideChar(CP_ACP, 0, str, -1, str1, n);
	strUTF8 = wcharToUTF8(str1);
	delete[]str1;
	str1 = NULL;	
	return strUTF8;
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::string title = charToUTF8("中文标题");
	theGame.Init(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT);
	theGame.Run();
	return 0;
}

隐藏控制台黑窗口

1、代码中加入:

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

2、主函数 _tmain 改为 main

3、在SDL_main.h中 108 - 110 行注释掉main的宏定义。

三步缺一不可,否则报错:

错误	1	error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用	
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDL2是一个跨平台的多媒体库,用于开发图形和音频的应用程序。而C是一种编程语言。因此,使用SDL2和C可以编写游戏代码。 使用SDL2和C编写游戏代码的过程如下: 1. 引入SDL2库:在代码的开头,先引入SDL2库,以便可以使用SDL2提供的函数和功能。可以通过#include <SDL2/SDL.h>将SDL2库文件包含到程序中。 2. 初始化SDL2:在游戏开始时,需要初始化SDL2库。通过调用SDL_Init(SDL_INIT_EVERYTHING)函数来完成初始化操作。 3. 创建游戏窗口:使用SDL_CreateWindow函数创建游戏窗口,并可以设置窗口的标题、大小等属性。 4. 创建渲染器:通过调用SDL_CreateRenderer函数创建渲染器,用于将游戏场景渲染到窗口上。 5. 游戏循环:游戏的主要逻辑通常在一个循环中运行。在循环中,可以处理用户输入、更新游戏状态、渲染游戏场景等。 6. 处理用户输入:使用SDL_PollEvent函数来监听用户的输入事件,可以处理用户按键、鼠标移动等操作。 7. 更新游戏状态:在游戏循环中,根据用户的输入和当前游戏的状态,更新游戏的状态。 8. 渲染游戏场景:通过调用SDL_RenderClear函数清空渲染器,然后使用SDL_RenderPresent函数将更新后的游戏场景渲染到窗口上。 9. 清理资源:在游戏结束时,需要释放SDL2库占用的资源。通过调用SDL_DestroyRenderer和SDL_DestroyWindow函数来销毁渲染器和窗口。 10. 退出SDL2:在游戏结束时,调用SDL_Quit函数来退出SDL2库。 总之,使用SDL2和C编写游戏代码,可以实现游戏窗口创建、用户输入处理、游戏逻辑更新和渲染等功能。开发者可以根据游戏的需求,使用SDL2提供的函数和功能来扩展和优化游戏代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值