今天在电脑里掏出来自己以前试着使用SDL游戏引擎的时候做的一个简单版 是男人就坚持20秒的小游戏。。
玩家通过键盘WSAD操作人物躲避四面八方来的物体,看最终能坚持多长时间。
图片是随便在网上找的或者自己画的。
GAME OVER
简单的贴一下代码~
#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秒" 涉及的主要知识点是游戏开发和编程,尤其在Microsoft Visual C++ (VC++)环境下。这个游戏是一个挑战玩家反应速度和耐力的小游戏,目标是在30秒内尽可能地保持某种操作。这种...
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"代表这是一个关于Simple DirectMedia Layer(SDL)库的版本1.3的相关内容。"SDL.lid"、"SDL.dll"和"SDL.h"是SDL库在Windows环境下开发和运行时所需的三个关键文件...
【SDL拼图小游戏】是一款基于Linux操作系统的娱乐项目,它利用了C语言的强大功能和SDL(Simple DirectMedia Layer)库来实现。SDL是一个跨平台的开发库,专门用于处理图形、音频和输入设备,使得开发者可以轻松创建...
一旦设置完成,我们就可以在项目中引入`#include <SDL2/SDL.h>`来使用SDL的功能。 接着,我们将关注SDL的核心组件——窗口和渲染器。创建SDL窗口是通过调用`SDL_CreateWindow()`函数实现的,我们需要指定窗口的标题...
同时,"sdl_sdl-ne"指的是SDL的非加密版本,它允许开发者查看和修改源代码,以便更好地理解和定制网络功能,这对于开源项目或者需要深度定制的商业应用尤其有用。而"sdl_net"则是对整个网络库的简写,强调了它是SDL...
标题中的"SDL SDK + SDL Image"表明我们正在讨论的是用于游戏开发和图形处理的Simple DirectMedia Layer (SDL) 库的软件开发工具包(SDK),以及它的图像扩展库——SDL Image。SDL是一个跨平台的多媒体库,而SDL Image...
《SDL_ttf-2.0.8:在Linux下构建图形界面的利器》 SDL_ttf,全称为Simple DirectMedia Layer TTF(简单直接媒体层TrueType字体库),是SDL库的一个扩展,专为在Linux操作系统上处理TrueType字体而设计。这个版本,...
**SDL(Simple DirectMedia Layer)** 是一个跨平台的多媒体库,主要被游戏开发者用于创建图形用户界面和处理音频、视频以及游戏输入。SDL的名字来源于它的功能:它为开发者提供了一个简单直接的方式来访问底层的...
SDL2是SDL的第二个主要版本,它提供了一些新特性和改进,以适应现代开发需求。 **Linux运维与服务器关联** 在Linux运维和服务器管理中,SDL2可以用于开发或运行需要图形界面的应用程序。例如,游戏服务器可能使用...
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版本的源代码、相关的SDL库以及头文件sdl_image.h。下面将详细介绍SDL_image库以及它的核心功能和使用方法。...
Linux下的Simple DirectMedia Layer(SDL)是一个开源的跨平台开发库,主要用于处理多媒体、...记住,实践是学习的最佳途径,尝试编写一个小项目,如一个简单的图形界面或一个基础的游戏,将有助于加深对SDL的理解。
sdl结合c语言做的一个拼图小游戏,鼠标拖动完成拼图
**标题解析:** "SDL2.0.3源码安装包" 指的是Simple DirectMedia Layer(SDL)的版本2.0.3的源代码安装包。SDL是一个跨平台的开发库,主要用于处理图形、音频、输入设备等多媒体功能,尤其在游戏开发和图形用户界面...
这个“SDL中文帮助文档”是为初学者和开发者提供的一份详尽指南,旨在加速对SDL的理解和应用。这份文档以中文呈现,使得国内的开发者能够更方便地学习和掌握SDL的核心功能和使用技巧。 在SDL的帮助下,开发者可以...
1. **跨平台性**:SDL2的设计使得开发者能编写一次代码,几乎无需修改就能在多种操作系统上运行,大大简化了多平台应用的开发。 2. **图形渲染**:SDL2提供了一个简单的API来处理2D图形,包括颜色填充、线条绘制、...
【标题】"小型飞机游戏SDL版"所涉及的知识点主要集中在游戏开发领域,特别是使用Simple DirectMedia Layer(SDL)库来构建一个简单的飞机游戏。SDL是一个开源的跨平台开发库,专为处理图形、音频、输入设备等多媒体...
FFmpeg和SDL是两个在计算机视觉和多媒体处理领域中广泛使用的开源库。FFmpeg是一个强大的命令行工具,用于处理各种音频和视频格式,包括编码、解码、转换、流媒体等任务。而SDL(Simple DirectMedia Layer)则是一个...