SDL小嘗試,是男人就堅持20秒

來源:互聯網
上載者:User

今天在電腦裡掏出來自己以前試著使用SDL遊戲引擎的時候做的一個簡單版 是男人就堅持20秒的小遊戲。。

 

玩家通過鍵盤WSAD操作人物躲避四面八方來的物體,看最終能堅持多長時間。

 

圖片是隨便在網上找的或者自己畫的。

 

 

GAME OVER

 

 

簡單的貼一下代碼~

 

 #pragma comment(lib, "sdl/lib/SDL.lib")<br />#pragma comment(lib, "sdl/lib/SDLmain.lib")<br />#pragma comment(lib, "sdl/lib/SDL_ttf.lib") </p><p>#include "sdl/include/SDL.h"<br />#include "sdl/include/SDL_main.h"<br />#include "sdl/include/SDL_ttf.h"</p><p>#include <iostream><br />#include <stdlib.h><br />#include <vector><br />#include <math.h><br />#include <time.h></p><p>using namespace std;</p><p>SDL_Surface* screen = NULL;<br />SDL_Surface* background = NULL;<br />SDL_Surface* plane = NULL;<br />SDL_Surface* ballimage = NULL;<br />SDL_Surface* gameover = NULL;<br />SDL_Surface* planeGameOver = NULL;<br />SDL_Surface* textimage = NULL;<br />TTF_Font* font=NULL;</p><p>SDL_Color BLACK = { 0, 100, 100, 0 };</p><p>SDL_Event gameevent;<br />Uint32 starttime;<br />Uint32 gamestart;</p><p>bool isGameOver = false;</p><p>struct Player<br />{<br />int x;<br />int y;<br />} player;</p><p>struct BallType<br />{<br />float x;<br />float y;<br />float dx;<br />float dy;<br />};</p><p>vector<BallType> balls;</p><p>int const dx = 1;<br />int const dy = 1;<br />int const speed = 5;<br />int BALLSSTART = 20;<br />int MAXBALLS = 20;<br />int const FPS = 50;</p><p>void init()<br />{<br />SDL_Init( SDL_INIT_VIDEO );<br />screen = SDL_SetVideoMode( 640, 480, 16, SDL_SWSURFACE );<br />SDL_WM_SetCaption( "True Man 20 seconds", NULL );<br />background = SDL_LoadBMP( "res/background.bmp" );<br />plane = SDL_LoadBMP( "res/plane.bmp" );<br />ballimage = SDL_LoadBMP( "res/ball.bmp" );<br />gameover = SDL_LoadBMP( "res/gameover.bmp" );<br />planeGameOver = SDL_LoadBMP( "res/planeover.bmp" );<br />Uint32 colorkey = SDL_MapRGB( plane->format, 0x0, 0x0, 0x0 );<br />SDL_SetColorKey( background, SDL_SRCCOLORKEY, colorkey );<br />SDL_SetColorKey( plane, SDL_SRCCOLORKEY, colorkey );<br />SDL_SetColorKey( ballimage, SDL_SRCCOLORKEY, colorkey );<br />SDL_SetColorKey( gameover, SDL_SRCCOLORKEY, colorkey );<br />SDL_SetColorKey( planeGameOver, SDL_SRCCOLORKEY, colorkey );</p><p>TTF_Init();<br />font = TTF_OpenFont("res/times.ttf", 16);</p><p>srand( time(0) );</p><p>}</p><p>void reset()<br />{</p><p>gamestart = SDL_GetTicks();</p><p>player.x = 300;</p><p>player.y = 200;</p><p>isGameOver = false;<br />cout<<"start clear"<<endl;<br />balls.clear();<br />cout<<balls.size()<<endl;<br />/*<br />vector<BallType>::iterator iter;<br />for(iter=balls.begin();iter!=balls.end();++iter)<br />{<br />balls.erase(iter);<br />}<br />*/<br />cout<<"end clear"<<endl;<br />MAXBALLS = BALLSSTART;<br />}</p><p>void finish();</p><p>void handle()<br />{</p><p>SDL_PollEvent( &gameevent );<br />if( gameevent.type == SDL_QUIT )<br />{<br />finish();<br />exit(0);<br />}<br />/*<br />else if( gameevent.type == SDL_KEYDOWN )<br />{<br /> switch( gameevent.key.keysym.sym )<br /> {<br />case SDLK_UP:<br />case SDLK_w:<br />player.y -= dy;<br />break;<br /> case SDLK_DOWN:<br />case SDLK_s:<br />player.y += dy;<br />break;<br /> case SDLK_LEFT:<br />case SDLK_a:<br />player.x -= dx;<br />break;<br /> case SDLK_RIGHT:<br />case SDLK_d:<br />player.x += dx;<br />break;<br />default:<br />break;<br /> }<br />}<br />*/<br />Uint8 *keystates = SDL_GetKeyState( NULL );<br />if( keystates[ SDLK_UP ] || keystates[ SDLK_w ] ) player.y-=dy*speed;<br />if( keystates[ SDLK_DOWN ] || keystates[ SDLK_s ] ) player.y+=dy*speed;<br />if( keystates[ SDLK_LEFT ] || keystates[ SDLK_a ] ) player.x-=dx*speed;<br />if( keystates[ SDLK_RIGHT ] || keystates[ SDLK_d ] ) player.x+=dx*speed;<br />}</p><p>void judgePlayerPos()<br />{<br />if( player.x<=0 ) player.x = 0;<br />if( player.x + plane->w >=640 ) player.x = 640 - plane->w ;<br />if( player.y<=0 ) player.y = 0;<br />if( player.y + plane->h >=480 ) player.y = 480 - plane->h;<br />}</p><p>void MakeBall()<br />{<br />BallType ball;</p><p>int tmp = rand()%4;<br />switch(tmp)<br />{<br />case 0:<br />ball.x = rand()%640;<br />ball.y = 0;<br />break;<br />case 1:<br />ball.x = rand()%640;<br />ball.y = 480;<br />break;<br />case 2:<br />ball.x = 0;<br />ball.y = rand()%480;<br />break;<br />case 3:<br />ball.x = 640;<br />ball.y = rand()%480;<br />break;<br />default:<br />break;<br />}</p><p>float dx = player.x - ball.x;<br />float dy = player.y - ball.y;<br />float m = sqrt( dx*dx + dy*dy );</p><p>int speed = rand()%2 + 2;<br />ball.dy = (dy / m)*speed;<br />ball.dx = (dx / m)*speed;<br />balls.push_back(ball);</p><p>}</p><p>void BallsMove()<br />{<br />vector<BallType>::iterator iter;<br />for( iter = balls.begin(); iter != balls.end(); ++iter )<br />{<br />iter->x += iter->dx;<br />iter->y += iter->dy;<br />if( iter->x < 0 || iter->x > 640 || iter->y < 0 || iter->y > 480 )<br />balls.erase( iter );<br />}</p><p>}</p><p>float const dR = 20;</p><p>void CheckHit()<br />{<br />vector<BallType>::iterator iter;<br />for( iter = balls.begin(); iter != balls.end(); ++iter )<br />{<br />float c1x = iter->x + (ballimage->w/2);<br />float c1y = iter->y + (ballimage->h/2);<br />float c1r = sqrt(2.0) * (ballimage->w/2);</p><p>float c2x = player.x + plane->w/2;<br />float c2y = player.y + plane->h/2;<br />float c2r = sqrt(2.0) * (plane->w/2);</p><p>float distance = sqrt((c1x-c2x)*(c1x-c2x) + (c1y-c2y)*(c1y-c2y));<br />if( distance <= c1r + c2r - dR )<br />{<br />isGameOver = true;<br />return;<br />}</p><p>}<br />}</p><p>void logic()<br />{<br />judgePlayerPos();<br />cout<<balls.size()<<endl;<br />if(balls.size()<MAXBALLS)<br />MakeBall();<br />BallsMove();</p><p>int blockadd = rand()%30;<br />if(blockadd == 0)<br />MAXBALLS++;</p><p>}</p><p>void show()<br />{<br />SDL_Rect offset;</p><p>offset.x = 0;<br />offset.y = 0;<br />SDL_BlitSurface( background, NULL, screen, &offset );</p><p>offset.x = player.x;<br />offset.y = player.y;<br />offset.w = plane->w;<br />offset.h = plane->h;<br />if( isGameOver )<br />SDL_BlitSurface( planeGameOver, NULL, screen, &offset );<br />else<br />SDL_BlitSurface( plane, NULL, screen, &offset );</p><p>vector<BallType>::iterator iter;<br />for( iter = balls.begin(); iter != balls.end(); ++iter )<br />{<br />offset.x = (int)(iter->x);<br />offset.y = (int)(iter->y);<br />SDL_BlitSurface( ballimage, NULL, screen, &offset );<br />}</p><p>SDL_UpdateRect(screen, 0, 0, 640, 480);<br />}</p><p>void delay()<br />{<br />Uint32 rightnow = SDL_GetTicks();<br />if( rightnow - starttime < 1000 / FPS )<br />{<br />SDL_Delay( ( 1000 / FPS ) - ( rightnow - starttime ) );<br />}<br />}</p><p>void finish()<br />{<br />TTF_CloseFont( font );<br />TTF_Quit();<br />SDL_FreeSurface( planeGameOver );<br />SDL_FreeSurface( gameover );<br />SDL_FreeSurface( screen );<br />SDL_FreeSurface( background );<br />SDL_FreeSurface( plane );<br />SDL_FreeSurface( ballimage );<br />SDL_Quit();<br />}</p><p>void showGameOver()<br />{</p><p>SDL_Rect offset;</p><p>offset.x = 100;<br />offset.y = 30;<br />SDL_BlitSurface( gameover, NULL, screen, &offset );</p><p>//SDL_Delay( 2000 );</p><p>Uint32 nowtime = SDL_GetTicks() - gamestart;<br />char s[20];<br />itoa( nowtime, s, 10 );</p><p>textimage = TTF_RenderText_Blended(font, s, BLACK );<br />offset.x = 300;<br />offset.y = 400;<br />SDL_BlitSurface( textimage, NULL, screen, &offset );<br />SDL_FreeSurface( textimage );</p><p>SDL_UpdateRect(screen, 0, 0, 640, 480);<br />}</p><p>int main(int argc, char *argv[])<br />{<br />init();<br />while(1)<br />{<br />cout<<"game restart"<<endl;</p><p>reset();<br />while( isGameOver==false )<br />{<br />cout<<"game looping"<<endl;<br />starttime = SDL_GetTicks();<br />handle();<br />logic();<br />show();<br />CheckHit();<br />delay();<br />}<br />cout<<balls.size()<<endl;<br />cout<<"game over"<<endl;<br />show();<br />cout<<"##############1##"<<balls.size()<<endl;<br />showGameOver();<br />cout<<"##############2##"<<balls.size()<<endl;<br />bool restart = false;<br />cout<<"##############3##"<<balls.size()<<endl;<br />while(restart==false)<br />{</p><p>cout<<"geting space pressed"<<endl;<br />SDL_PollEvent( &gameevent );<br />if(gameevent.type==SDL_QUIT)<br />{<br />finish();<br />exit(0);<br />}<br />if(gameevent.key.keysym.sym==SDLK_SPACE<br />||gameevent.key.keysym.sym==SDLK_KP_ENTER)<br />restart = true;<br />SDL_Delay( 50 );<br />}</p><p>}</p><p>return 0;<br />}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.