`
rcfalcon
  • 浏览: 227993 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SDL小尝试,是男人就坚持20秒

阅读更多

今天在电脑里掏出来自己以前试着使用SDL游戏引擎的时候做的一个简单版 是男人就坚持20秒的小游戏。。

 

玩家通过键盘WSAD操作人物躲避四面八方来的物体,看最终能坚持多长时间。

 

图片是随便在网上找的或者自己画的。

 

 

GAME OVER

 

SDL

 

简单的贴一下代码~

 

 

#pragma comment(lib, "sdl/lib/SDL.lib") 
#pragma comment(lib, "sdl/lib/SDLmain.lib") 
#pragma comment(lib, "sdl/lib/SDL_ttf.lib") 


#include "sdl/include/SDL.h"
#include "sdl/include/SDL_main.h"
#include "sdl/include/SDL_ttf.h"

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <math.h>
#include <time.h>

using namespace std;



SDL_Surface* screen = NULL;
SDL_Surface* background = NULL;
SDL_Surface* plane = NULL;
SDL_Surface* ballimage = NULL;
SDL_Surface* gameover = NULL;
SDL_Surface* planeGameOver = NULL;
SDL_Surface* textimage = NULL;
TTF_Font* font=NULL;

SDL_Color BLACK = { 0, 100, 100, 0 };

SDL_Event gameevent;
Uint32 starttime;
Uint32 gamestart;

bool isGameOver = false;

struct Player
{
	int x;
	int y;
} player;

struct BallType
{
	float x;
	float y;
	float dx;
	float dy;
};

vector<BallType> balls;

int const dx = 1;
int const dy = 1;
int const speed = 5;
int BALLSSTART = 20;
int MAXBALLS = 20;
int const FPS = 50;

void init()
{
	SDL_Init( SDL_INIT_VIDEO );
	screen = SDL_SetVideoMode( 640, 480, 16, SDL_SWSURFACE );
	SDL_WM_SetCaption( "True Man 20 seconds", NULL );
	background = SDL_LoadBMP( "res/background.bmp" );
	plane = SDL_LoadBMP( "res/plane.bmp" );
	ballimage = SDL_LoadBMP( "res/ball.bmp" );
	gameover = SDL_LoadBMP( "res/gameover.bmp" );
	planeGameOver = SDL_LoadBMP( "res/planeover.bmp" );
	Uint32 colorkey = SDL_MapRGB( plane->format, 0x0, 0x0, 0x0 );
	SDL_SetColorKey( background, SDL_SRCCOLORKEY, colorkey );
	SDL_SetColorKey( plane, SDL_SRCCOLORKEY, colorkey );
	SDL_SetColorKey( ballimage, SDL_SRCCOLORKEY, colorkey );
	SDL_SetColorKey( gameover, SDL_SRCCOLORKEY, colorkey );
	SDL_SetColorKey( planeGameOver, SDL_SRCCOLORKEY, colorkey );

	TTF_Init();
	font = TTF_OpenFont("res/times.ttf", 16);

	srand( time(0) );
	
}

void reset()
{

	gamestart = SDL_GetTicks();

	player.x = 300;

	player.y = 200;

	isGameOver = false;
	cout<<"start clear"<<endl;
	balls.clear();
	cout<<balls.size()<<endl;
	/*
	vector<BallType>::iterator iter;
	for(iter=balls.begin();iter!=balls.end();++iter)
	{
		balls.erase(iter);
	}
	*/
	cout<<"end clear"<<endl;
	MAXBALLS = BALLSSTART;
}

void finish();

void handle()
{
	
	SDL_PollEvent( &gameevent );
	if( gameevent.type == SDL_QUIT )
	{
		finish();
		exit(0);
	}
	/*
	else if( gameevent.type == SDL_KEYDOWN )
	{
        switch( gameevent.key.keysym.sym )
        {
		case SDLK_UP:
		case SDLK_w:
			player.y -= dy;
			break;
        case SDLK_DOWN: 
		case SDLK_s:
			player.y += dy;
			break;
        case SDLK_LEFT: 
		case SDLK_a:
			player.x -= dx;
			break;
        case SDLK_RIGHT:
		case SDLK_d:
			player.x += dx; 
			break;
		default:
			break;
        }
	}
	*/
	Uint8 *keystates = SDL_GetKeyState( NULL );
	if( keystates[ SDLK_UP ] ||  keystates[ SDLK_w ] ) player.y-=dy*speed;
	if( keystates[ SDLK_DOWN ] ||  keystates[ SDLK_s ] ) player.y+=dy*speed;
	if( keystates[ SDLK_LEFT ] ||  keystates[ SDLK_a ] ) player.x-=dx*speed;
	if( keystates[ SDLK_RIGHT ] ||  keystates[ SDLK_d ] ) player.x+=dx*speed;
}

void judgePlayerPos()
{
	if( player.x<=0 ) player.x = 0;
	if( player.x + plane->w >=640 ) player.x = 640 - plane->w ;
	if( player.y<=0 ) player.y = 0;
	if( player.y + plane->h >=480 ) player.y = 480 - plane->h;
}

void MakeBall()
{
	BallType ball;

	int tmp = rand()%4;
	switch(tmp)
	{
	case 0:
		ball.x = rand()%640;
		ball.y = 0;
		break;
	case 1:
		ball.x = rand()%640;
		ball.y = 480;
		break;
	case 2:
		ball.x = 0;
		ball.y = rand()%480;
		break;
	case 3:
		ball.x = 640;
		ball.y = rand()%480;
		break;
	default:
		break;
	}

	float dx = player.x - ball.x;
	float dy = player.y - ball.y;
	float m = sqrt( dx*dx + dy*dy );

	int speed = rand()%2 + 2;
	ball.dy = (dy / m)*speed;
	ball.dx = (dx / m)*speed;
	balls.push_back(ball);


}

void BallsMove()
{
	vector<BallType>::iterator iter;
	for( iter = balls.begin(); iter != balls.end(); ++iter )
	{
		iter->x += iter->dx;
		iter->y += iter->dy;
		if( iter->x < 0 || iter->x > 640 || iter->y < 0 || iter->y > 480 )
			balls.erase( iter );
	}

}

float const dR = 20;

void CheckHit()
{
	vector<BallType>::iterator iter;
	for( iter = balls.begin(); iter != balls.end(); ++iter )
	{
		float c1x = iter->x + (ballimage->w/2);
		float c1y = iter->y + (ballimage->h/2);
		float c1r = sqrt(2.0) * (ballimage->w/2);

		float c2x = player.x + plane->w/2;
		float c2y = player.y + plane->h/2;
		float c2r = sqrt(2.0) * (plane->w/2);

		float distance = sqrt((c1x-c2x)*(c1x-c2x) + (c1y-c2y)*(c1y-c2y));
		if(  distance <= c1r + c2r - dR  )
		{
			isGameOver = true;
			return;
		}

	}
}

void logic()
{
	judgePlayerPos();
	cout<<balls.size()<<endl;
	if(balls.size()<MAXBALLS)
		MakeBall();
	BallsMove();

	int blockadd = rand()%30;
	if(blockadd == 0) 
		MAXBALLS++;


}

void show()
{
	SDL_Rect offset;

	offset.x = 0;
	offset.y = 0;
	SDL_BlitSurface( background, NULL, screen, &offset );

	offset.x = player.x;
	offset.y = player.y;
	offset.w = plane->w;
	offset.h = plane->h;
	if( isGameOver )
		SDL_BlitSurface( planeGameOver, NULL, screen, &offset );
	else
		SDL_BlitSurface( plane, NULL, screen, &offset );

	vector<BallType>::iterator iter;
	for( iter = balls.begin(); iter != balls.end(); ++iter )
	{
		offset.x = (int)(iter->x);
		offset.y = (int)(iter->y);
		SDL_BlitSurface( ballimage, NULL, screen, &offset );
	}

	SDL_UpdateRect(screen, 0, 0, 640, 480);
}

void delay()
{
	Uint32 rightnow = SDL_GetTicks();
	if( rightnow - starttime < 1000 / FPS )
	{
		SDL_Delay( ( 1000 / FPS ) - ( rightnow - starttime ) );
	}
}

void finish()
{
	TTF_CloseFont( font );
	TTF_Quit();
	SDL_FreeSurface( planeGameOver );
	SDL_FreeSurface( gameover );
	SDL_FreeSurface( screen );
	SDL_FreeSurface( background );
	SDL_FreeSurface( plane );
	SDL_FreeSurface( ballimage );
	SDL_Quit();
}

void showGameOver()
{
	
	SDL_Rect offset;

	offset.x = 100;
	offset.y = 30;
	SDL_BlitSurface( gameover, NULL, screen, &offset );
	
	//SDL_Delay( 2000 );

	
	Uint32 nowtime = SDL_GetTicks() - gamestart;
	char s[20];
	itoa( nowtime, s, 10 );

	textimage = TTF_RenderText_Blended(font, s, BLACK );
	offset.x = 300;
	offset.y = 400;
	SDL_BlitSurface( textimage, NULL, screen, &offset );
	SDL_FreeSurface( textimage );
	
	SDL_UpdateRect(screen, 0, 0, 640, 480);
}


int main(int argc, char *argv[])
{
	init();
	while(1)
	{
		cout<<"game restart"<<endl;

		reset();
		while( isGameOver==false )
		{
			cout<<"game looping"<<endl;
			starttime = SDL_GetTicks();
			handle();
			logic();
			show();
			CheckHit();
			delay();
		}
		cout<<balls.size()<<endl;
		cout<<"game over"<<endl;
		show();
		cout<<"##############1##"<<balls.size()<<endl;
		showGameOver();
		cout<<"##############2##"<<balls.size()<<endl;
		bool restart = false;
		cout<<"##############3##"<<balls.size()<<endl;
		while(restart==false)
		{
			
			cout<<"geting space pressed"<<endl;
			SDL_PollEvent( &gameevent );
			if(gameevent.type==SDL_QUIT)
			{
				finish();
				exit(0);
			}
			if(gameevent.key.keysym.sym==SDLK_SPACE
				||gameevent.key.keysym.sym==SDLK_KP_ENTER)
				restart = true;
			SDL_Delay( 50 );
		}
		
		
	}

	return 0;
}

 

 

 

分享到:
评论

相关推荐

    VC游戏源码 男人就坚持30秒

    【标题】"VC游戏源码 男人就坚持30秒" 涉及的主要知识点是游戏开发和编程,尤其在Microsoft Visual C++ (VC++)环境下。这个游戏是一个挑战玩家反应速度和耐力的小游戏,目标是在30秒内尽可能地保持某种操作。这种...

    SDL小游戏-打飞机

    SDL小游戏 利用SDL实现 类似雷电的小游戏 有音效~ SDL小游戏 利用SDL实现 类似雷电的小游戏 有音效~ SDL小游戏 利用SDL实现 类似雷电的小游戏 有音效~ SDL小游戏 利用SDL实现 类似雷电的小游戏 有音效~ SDL小游戏 ...

    SDL开发的小游戏

    在【标题】"SDL开发的小游戏"中,我们可以推断这是一个使用SDL库开发的简单游戏项目。SDL库因其高效、灵活和易于上手的特点,深受独立开发者和小型团队的喜爱,用于创建各种类型的游戏,从小型的2D游戏到复杂的3D...

    SDL-1.3 SDL.lid SDL.dll SDL.h

    标题"SDL-1.3 SDL.lid SDL.dll SDL.h"中,"SDL-1.3"代表这是一个关于Simple DirectMedia Layer(SDL)库的版本1.3的相关内容。"SDL.lid"、"SDL.dll"和"SDL.h"是SDL库在Windows环境下开发和运行时所需的三个关键文件...

    SDL拼图小游戏

    【SDL拼图小游戏】是一款基于Linux操作系统的娱乐项目,它利用了C语言的强大功能和SDL(Simple DirectMedia Layer)库来实现。SDL是一个跨平台的开发库,专门用于处理图形、音频和输入设备,使得开发者可以轻松创建...

    SDL学习的小例子

    一旦设置完成,我们就可以在项目中引入`#include &lt;SDL2/SDL.h&gt;`来使用SDL的功能。 接着,我们将关注SDL的核心组件——窗口和渲染器。创建SDL窗口是通过调用`SDL_CreateWindow()`函数实现的,我们需要指定窗口的标题...

    SDL_net-1.2.7.rar_SDL_net-1.2.7_SDL_net.dll_sdl_sdl-ne_sdl_net

    同时,"sdl_sdl-ne"指的是SDL的非加密版本,它允许开发者查看和修改源代码,以便更好地理解和定制网络功能,这对于开源项目或者需要深度定制的商业应用尤其有用。而"sdl_net"则是对整个网络库的简写,强调了它是SDL...

    SDL SDK + SDL Image

    标题中的"SDL SDK + SDL Image"表明我们正在讨论的是用于游戏开发和图形处理的Simple DirectMedia Layer (SDL) 库的软件开发工具包(SDK),以及它的图像扩展库——SDL Image。SDL是一个跨平台的多媒体库,而SDL Image...

    SDL_ttf-2.0.8.tar.gz_SDL ttf_SDL_ttf_linux_linux SDL_ttf.h

    《SDL_ttf-2.0.8:在Linux下构建图形界面的利器》 SDL_ttf,全称为Simple DirectMedia Layer TTF(简单直接媒体层TrueType字体库),是SDL库的一个扩展,专为在Linux操作系统上处理TrueType字体而设计。这个版本,...

    SDL.rar_sdl_sdlref pdf_sdl中文教程_sdl教程_怎样学sDL画图

    **SDL(Simple DirectMedia Layer)** 是一个跨平台的多媒体库,主要被游戏开发者用于创建图形用户界面和处理音频、视频以及游戏输入。SDL的名字来源于它的功能:它为开发者提供了一个简单直接的方式来访问底层的...

    sdl的linux源码包SDL2-2.0.2

    SDL2是SDL的第二个主要版本,它提供了一些新特性和改进,以适应现代开发需求。 **Linux运维与服务器关联** 在Linux运维和服务器管理中,SDL2可以用于开发或运行需要图形界面的应用程序。例如,游戏服务器可能使用...

    SDL游戏开发经典教程03源代码

    SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,它为开发人员提供了处理图形、音频和输入设备的能力,尤其适合游戏开发。这个“SDL游戏开发经典教程03源代码”是针对初学者的一个优秀资源,它帮助理解如何...

    SDL_image-1.2.3.zip_SDL.zip_SDL1.2.3_SDL_image-1.2.3_sdl_image.h

    这个"SDL_image-1.2.3.zip_SDL.zip_SDL1.2.3_SDL_image-1.2.3_sdl_image.h"文件组合包含了SDL_image 1.2.3版本的源代码、相关的SDL库以及头文件sdl_image.h。下面将详细介绍SDL_image库以及它的核心功能和使用方法。...

    linux sdl 库和头文件

    Linux下的Simple DirectMedia Layer(SDL)是一个开源的跨平台开发库,主要用于处理多媒体、...记住,实践是学习的最佳途径,尝试编写一个小项目,如一个简单的图形界面或一个基础的游戏,将有助于加深对SDL的理解。

    sdl 拼图小游戏

    sdl结合c语言做的一个拼图小游戏,鼠标拖动完成拼图

    SDL2.0.3源码安装包

    **标题解析:** "SDL2.0.3源码安装包" 指的是Simple DirectMedia Layer(SDL)的版本2.0.3的源代码安装包。SDL是一个跨平台的开发库,主要用于处理图形、音频、输入设备等多媒体功能,尤其在游戏开发和图形用户界面...

    SDL中文帮助文档

    这个“SDL中文帮助文档”是为初学者和开发者提供的一份详尽指南,旨在加速对SDL的理解和应用。这份文档以中文呈现,使得国内的开发者能够更方便地学习和掌握SDL的核心功能和使用技巧。 在SDL的帮助下,开发者可以...

    sdl.rar SDL2-2.0.14 SDL源码

    1. **跨平台性**:SDL2的设计使得开发者能编写一次代码,几乎无需修改就能在多种操作系统上运行,大大简化了多平台应用的开发。 2. **图形渲染**:SDL2提供了一个简单的API来处理2D图形,包括颜色填充、线条绘制、...

    小型飞机游戏SDL版

    【标题】"小型飞机游戏SDL版"所涉及的知识点主要集中在游戏开发领域,特别是使用Simple DirectMedia Layer(SDL)库来构建一个简单的飞机游戏。SDL是一个开源的跨平台开发库,专为处理图形、音频、输入设备等多媒体...

    ffmepg+sdl+播放摄像头视频+(任意大小)截屏

    FFmpeg和SDL是两个在计算机视觉和多媒体处理领域中广泛使用的开源库。FFmpeg是一个强大的命令行工具,用于处理各种音频和视频格式,包括编码、解码、转换、流媒体等任务。而SDL(Simple DirectMedia Layer)则是一个...

Global site tag (gtag.js) - Google Analytics