用C++和libSDL开发游戏系列(1)——环境与框架

做这个游戏是为了交作业,另外需要制作一份作业报告,故顺便以日志的形式连载一下!!!
非专业写游戏高手,水平有限,望多多指教。

开发工具:codelite v2.9
图形库:libSDL
开发平台:Windows
游戏类型:即时战略游戏

〇、游戏要求:

一、环境搭建
1、安装codelite。
2、到libsdl.org下载libSDL for windows编译好的动态链接库和头文件,复制到codelite下对应的目录。

二、游戏框架
1、游戏主循环的一般模型

for(; !end; ){
    /* Do Input 处理鼠标键盘的事件响应*/
    /* Do Move 游戏物体运动*/
    /* Do Output 把物体输出到屏幕*/
}

2、我写的TombGame的框架

#include "cstdio"
#include "SDL/SDL.h"

int main(int argc, char **argv)
{
	printf("game begin.\n");
	
	/* SDL初始化 */
	SDL_Init(SDL_INIT_VIDEO);
	atexit(SDL_Quit);
	
	/* 你懂的 */
	SDL_WM_SetCaption("XX Tomb Raider", NULL);
	
	/* 设置窗口大小,返回一个surface,可以用来画东西 */
	SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_ANYFORMAT);
	
	for(bool end = false; !end;){
		/* 处理输入的键盘、鼠标等事件响应 */
		SDL_Event event;
		while(SDL_PollEvent(&event)){
			switch(event.type){
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym){
				case SDLK_UP:
					break;
				case SDLK_DOWN:
					break;
				case SDLK_LEFT:
					break;
				case SDLK_RIGHT:
					break;
				case SDLK_SPACE:
					break;
				case SDLK_ESCAPE:
					end = true;
					break;
				}
				break;
			case SDL_QUIT:
				end = true;
				break;
			}
		}
		
		/* Movement */
		
		/* Output */
		/* 用黑色刷新屏幕 */
		SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
		/* 显示出来 */
		SDL_Flip(screen);
		
		/* FPS Control,控制游戏进展的快慢 */
		SDL_Delay(50);
	}
	
	printf("game end.\n");
	return 0;
}

运行以上代码,可以得到一个白色的窗体。
用鼠标点击窗体的关闭按钮“X”,会产生SDL_QUIT事件。与按下键盘上的ESC一样,调出程序的循环以结束游戏。

使用printf输出的,被SDL重定位到当前目录下的stdout.txt。

三、数据结构

游戏中常用到的两个计算对象,矩形Rect和运算向量Vector。
还有一些基本的数据结构由STL提供,例如vector, queue, stack, map等。


struct Rect{
	int x1, x2;
	int y1, y2;
	bool operator==(const Rect& b) const{
		if(x1==b.x1 && x2==b.x2 && y1==b.y1 && y2==b.y2)
			return true;
		else
			return false;
	}
	bool operator!=(const Rect& b) const{
		return !(*this==b);
	}
};

struct Vector{
	float x;
	float y;
	Vector(){
		zero();
	}
	Vector( float mx, float my ){
		x = mx, y = my;
	}
	float getMagnitude(){
		return sqrtf(x*x+y*y);
	}
	void zero(){
		x = y = 0.0;
	}
	void normalize(){
		float m = getMagnitude();
		x /= m;
		y /= m;
	}
	Vector operator*(float m){
		Vector tmp(x*m, y*m);
		return tmp;
	}
	Vector operator+(Vector& v){
		Vector tmp(v.x+x, v.y+y);
		if( fabs(tmp.x) < 0.1)
			tmp.x = 0.0;
		if( fabs(tmp.y) < 0.1)
			tmp.y = 0.0;
		return tmp;
	}
	Vector operator-(Vector& v){
		Vector tmp(v.x-x, v.y-y);
		if( fabs(tmp.x) < 0.1)
			tmp.x = 0.0;
		if( fabs(tmp.y) < 0.1)
			tmp.y = 0.0;
		return tmp;
	}
	Vector& operator+=(Vector& v){
		return (*this=*this+v);
	}
	Vector& operator*=(float m){
		x*=m; y*=m;
		return *this;
	}
	Vector& operator-=(Vector& v){
		return (*this=*this-v);
	}
	float getDistanceFrom(const Vector& v){
		return sqrt((x-v.x)*(x-v.x)+(y-v.y)*(y-v.y));
	}
};

暂时到此为止!

用C++和libSDL开发游戏系列(1)——环境与框架》上有10条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>