![SDL第十六課移動(dòng)_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/27/866c538a-944c-453e-baed-b3e9b9e67e75/866c538a-944c-453e-baed-b3e9b9e67e751.gif)
![SDL第十六課移動(dòng)_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/27/866c538a-944c-453e-baed-b3e9b9e67e75/866c538a-944c-453e-baed-b3e9b9e67e752.gif)
![SDL第十六課移動(dòng)_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/27/866c538a-944c-453e-baed-b3e9b9e67e75/866c538a-944c-453e-baed-b3e9b9e67e753.gif)
![SDL第十六課移動(dòng)_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/27/866c538a-944c-453e-baed-b3e9b9e67e75/866c538a-944c-453e-baed-b3e9b9e67e754.gif)
![SDL第十六課移動(dòng)_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/27/866c538a-944c-453e-baed-b3e9b9e67e75/866c538a-944c-453e-baed-b3e9b9e67e755.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、http:/ 移動(dòng)最后更新 2009/12/28 你期待已久的時(shí)刻到了,我們將要學(xué)習(xí)如何讓一個(gè)點(diǎn)在屏幕上移動(dòng)。這個(gè)要比讓它發(fā)出聲音難一些。它要求對(duì)按鍵事件理解的很透徹。這篇教程將教你學(xué)會(huì)如何讓一個(gè)對(duì)象在屏幕上移動(dòng)。/*本教程代碼版權(quán)屬于:lazy foo productions (2004-2009) 。未經(jīng)允許,不得發(fā)布!*/ /頭文件??搭^文件就知道,wxdev-c+ 的連接器命令為:/-lmingw32 -lsdlmain -lsdl lsdl_image#include sdl/sdl.h #include sdl/sdl_image.h #include /屏幕屬性const int
2、 screen_width = 640; const int screen_height = 480; const int screen_bpp = 32; /幀傳輸速率const int frames_per_second = 20; /點(diǎn)的尺寸const int dot_width = 20; const int dot_height = 20; /畫面指針sdl_surface *dot = null; sdl_surface *screen = null; /事件結(jié)構(gòu)體sdl_event event; 紫翼魔狼第 1 頁(yè) 2010-03-12 http:/ 紫翼魔狼第 2 頁(yè) 2010
3、-03-12 /將要在屏幕上移動(dòng)的點(diǎn)的類class dot private: int x, y; / 點(diǎn)的 x、 y 偏移位置int xvel, yvel; / 點(diǎn)的移動(dòng)速度 public: dot();/ 初始化變量 void handle_input();/ 依據(jù)按鍵來調(diào)整點(diǎn)的移動(dòng)速度 void move();/ 移動(dòng)點(diǎn) void show();/ 在屏幕上顯示點(diǎn); 以上就是我們的點(diǎn)類的主要內(nèi)容。參數(shù)x 和 y 是點(diǎn)的偏移位置, xvel和 yvel 是點(diǎn)的移動(dòng)速度。構(gòu)造初始化點(diǎn)的變量, handle_input()函數(shù)處理事件。函數(shù)move()用來移動(dòng)點(diǎn), show()用來把點(diǎn)顯示到屏幕
4、上。 / 定時(shí)計(jì)時(shí)器類class timer private: int startticks; /當(dāng)計(jì)時(shí)器啟動(dòng)時(shí)刻的時(shí)鐘時(shí)間int pausedticks; / 計(jì)時(shí)器暫停時(shí)刻的時(shí)間/計(jì)時(shí)器的狀態(tài) bool paused; bool started; public: timer();/ 初始化變量/初始化時(shí)間變量 void start(); void stop(); void pause(); void unpause(); int get_ticks();/ 獲取計(jì)時(shí)器時(shí)間/檢查計(jì)時(shí)器的狀態(tài) bool is_started(); bool is_paused(); ; http:/ 紫翼魔狼
5、第 3 頁(yè) 2010-03-12 sdl_surface *load_image( std:string filename ) sdl_surface* loadedimage = null; /要加載的圖片 sdl_surface* optimizedimage = null; /優(yōu)化后的圖片loadedimage = img_load( filename.c_str() ); /加載圖片/如果圖片加載成功if( loadedimage != null ) optimizedimage = sdl_displayformat( loadedimage ); /建立一個(gè)優(yōu)化的畫面 sdl_fr
6、eesurface( loadedimage ); /釋放舊的畫面的內(nèi)存/如果畫面優(yōu)化成功 if( optimizedimage != null ) sdl_setcolorkey(optimizedimage,sdl_srccolorkey, sdl_maprgb( optimizedimage-format, 0, 0 xff, 0 xff ) ); /色鍵控制畫面 return optimizedimage; /返回優(yōu)化后的畫面指針 void apply_surface( int x, int y, sdl_surface* source, sdl_surface* destinatio
7、n, sdl_rect* clip = null ) sdl_rect offset; / 保留偏移位置/獲取當(dāng)前偏移位置 offset.x = x; offset.y = y; sdl_blitsurface( source, clip, destination, &offset ); /顯示畫面 bool init() /初始化所有 sdl 子系統(tǒng)if( sdl_init( sdl_init_everything ) = -1 ) return false; screen=sdl_setvideomode(screen_width,screen_height, screen_bpp
8、,sdl_swsurface ); / 新建屏幕http:/ 紫翼魔狼第 4 頁(yè) 2010-03-12 /如果建立屏幕時(shí)出錯(cuò)if( screen = null ) return false; sdl_wm_setcaption( move the dot, null ); /設(shè)置窗口標(biāo)題 return true; /如果一切初始化順利 bool load_files() dot = load_image( dot.bmp ); / 加載點(diǎn)圖片/如果加載點(diǎn)圖片時(shí)出錯(cuò) if( dot = null ) return false; return true; /如果加載成功 void clean_up
9、() sdl_freesurface( dot ); /釋放畫面的內(nèi)存 sdl_quit();/退出 sdl dot:dot() /初始化點(diǎn)的位置 x = 0; y = 0; /初始化點(diǎn)的移動(dòng)速度 xvel = 0; yvel = 0; 構(gòu)造點(diǎn)的時(shí)候,點(diǎn)的初始位置在左上角。確保構(gòu)造點(diǎn)對(duì)象的時(shí)候點(diǎn)的位置是固定不動(dòng)的。 http:/ void dot:handle_input() /如果有按鍵按下if( event.type = sdl_keydown ) /調(diào)整移動(dòng)速度 switch( event.key.keysym.sym ) case sdlk_up: yvel -= dot_height
10、 / 2; break; case sdlk_down: yvel += dot_height / 2; break; case sdlk_left: xvel -= dot_width / 2; break; case sdlk_right: xvel += dot_width / 2; break; 這個(gè)就是點(diǎn)相關(guān)事件的處理函數(shù)。也許你會(huì)想沒有必要這樣,你需要在按鍵按下時(shí)x+/- 或 y+/-就可以了。 可是問題是那么做的話,按鍵按一次, 點(diǎn)就移動(dòng)一下, 你要不停的按下,松開, 按下, 松開,才能讓點(diǎn)連續(xù)移動(dòng)。 所以我們用設(shè)置點(diǎn)移動(dòng)速度的方法。點(diǎn)有兩個(gè)移動(dòng)速度,沿 x軸移動(dòng)速度和沿y軸移動(dòng)
11、速度。 當(dāng)右方向鍵按下時(shí),我們把點(diǎn)的移動(dòng)速度增加點(diǎn)的寬的一半( 也就是10),所以點(diǎn)沿x軸方向每幀偏移增加 10。當(dāng)左方向鍵按下時(shí),沿x軸方向每幀偏移減10 。y 軸方向的速度調(diào)整也是同樣的原理。 要記得 y軸不是這樣的: 而是這樣的: 所以增加y軸的偏移量會(huì)使點(diǎn)向下移動(dòng),而減少y軸的偏移量會(huì)使點(diǎn)向上移動(dòng)。 紫翼魔狼第 5 頁(yè) 2010-03-12 http:/ /如果按鍵松開 else if( event.type = sdl_keyup ) /調(diào)整移動(dòng)速度 switch( event.key.keysym.sym ) case sdlk_up: yvel += dot_height / 2
12、; break; case sdlk_down: yvel -= dot_height / 2; break; case sdlk_left: xvel += dot_width / 2; break; case sdlk_right: xvel -= dot_width / 2; break; 我們同樣要處理按鍵松開的情況,當(dāng)一個(gè)按鍵松開時(shí),就會(huì)產(chǎn)生一個(gè)sdl_keyup 事件。 當(dāng)你松開一個(gè)按鍵的時(shí)候,你就要取消掉當(dāng)你按下的時(shí)候的移動(dòng)速度的改變。當(dāng)你按右方向鍵,x方向的速度就會(huì)增加 10,所以你松開當(dāng)時(shí)候,速度小減小10。.void dot:move() x += xvel; / 點(diǎn)向左或
13、者向右移動(dòng)/如果點(diǎn)不能再向左或向右移動(dòng)時(shí)(到達(dá)屏幕左右邊界)if( ( x screen_width ) ) x -= xvel; / 往回移動(dòng) y += yvel; / 點(diǎn)向上或向下移動(dòng)/如果點(diǎn)不能再向上或向下移動(dòng)時(shí)(到達(dá)屏幕上下邊界)if( ( y screen_height ) ) y -= yvel; / 往回移動(dòng) 開始移動(dòng)點(diǎn)的位置。首先,通過增加它的偏移速度來移動(dòng)點(diǎn),然后檢查點(diǎn)是否到了屏幕邊界。如果到達(dá)邊界,我們就從它的偏移位置離減去它的偏移速度,這樣,點(diǎn)就不會(huì)超出屏幕的邊界了。 我承認(rèn)這是一種相當(dāng)粗糙的方法,因?yàn)槟阋苍S會(huì)碰到這種情況: 如果你把速度設(shè)置為某些不能被屏幕的尺寸整除的數(shù)
14、時(shí),點(diǎn)看起來就像卡住不動(dòng)了一樣。那是因?yàn)樵诔銎聊贿吔缰?,點(diǎn)并不是向邊界移動(dòng),而是向它的偏移位置移動(dòng)。一個(gè)比較好的解決辦法就是當(dāng)點(diǎn)將要超出屏幕邊界時(shí),點(diǎn)的偏移位置用屏幕尺寸剪去點(diǎn)的尺寸。我也不能把一切幫你都做好,你需要紫翼魔狼第 6 頁(yè) 2010-03-12 http:/ 紫翼魔狼第 7 頁(yè) 2010-03-12 自己動(dòng)手去修改。我懶得回頭修改代碼了。 void dot:show() apply_surface( x, y, dot, screen ); / 顯示點(diǎn)畫面 上面就是我們要把點(diǎn)畫面?zhèn)鬏數(shù)狡聊簧系膕how() 函數(shù)。timer:timer() /初始化變量 startticks =
15、 0; pausedticks = 0; paused = false; started = false; void timer:stop() started = false; /停止計(jì)時(shí)paused = false; /取消暫停 void timer:pause() /如果計(jì)時(shí)器正在計(jì)時(shí),并且沒有暫停if( ( started = true ) & ( paused = false ) ) paused = true; /暫停計(jì)時(shí) pausedticks = sdl_getticks() - startticks; /計(jì)算暫停時(shí)時(shí)間 void timer:unpause() /如果計(jì)
16、時(shí)器已經(jīng)暫停 if( paused = true ) paused = false; /取消暫停 startticks = sdl_getticks() - pausedticks; /重新設(shè)置開始時(shí)間 pausedticks = 0; /暫停時(shí)間置零 http:/ 紫翼魔狼第 8 頁(yè) 2010-03-12 int timer:get_ticks() /如果計(jì)時(shí)器正在運(yùn)行if( started = true ) /如果計(jì)時(shí)器已經(jīng)暫停if( paused = true ) return pausedticks; /返回計(jì)時(shí)器暫停時(shí)刻的時(shí)間 else /返回當(dāng)前時(shí)刻與計(jì)時(shí)器開始時(shí)刻的事件差retu
17、rn sdl_getticks() - startticks; return 0; /如果計(jì)時(shí)器沒有運(yùn)行 bool timer:is_started() return started; bool timer:is_paused() return paused; int main( int argc, char* args ) bool quit = false; /退出標(biāo)志dot mydot; / 要使用的點(diǎn)timer fps; / 幀速率調(diào)整/初始化if( init() = false ) return 1; /加載文件 if( load_files() = false ) return 1
18、; http:/ 紫翼魔狼第 9 頁(yè) 2010-03-12 /當(dāng)用戶沒有退出時(shí) while( quit = false ) fps.start();/ 啟動(dòng)整計(jì)時(shí)器/當(dāng)有時(shí)間需要處理時(shí) while( sdl_pollevent( &event ) ) mydot.handle_input();/處理點(diǎn)相關(guān)事件/如果用戶按x 關(guān)閉窗口if( event.type = sdl_quit ) quit = true; / 退出程序 mydot.move();/ 移動(dòng)點(diǎn) sdl_fillrect( screen, &screen-clip_rect, sdl_maprgb( screen-format, 0 xff, 0 xff, 0 xff ) ); / 屏幕填充為白色mydot.show();/ 在屏幕上顯示點(diǎn)/刷新屏幕if( sdl_flip( screen ) = -1 ) return 1; /限制幀速率
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 8 美麗文字 民族瑰寶-意蘊(yùn)雋永的漢字(說課稿)2023-2024學(xué)年統(tǒng)編版道德與法治五年級(jí)上冊(cè)
- 法務(wù)部合同范本(2篇)
- 二零二五年度離婚協(xié)議范本明確子女撫養(yǎng)權(quán)與探望權(quán)條款3篇
- 2025年度票務(wù)系統(tǒng)數(shù)據(jù)安全保障合同4篇
- 滾刀項(xiàng)目融資渠道探索
- 皮膚科用藥項(xiàng)目融資渠道探索
- 二零二五年度蘋果手機(jī)產(chǎn)品展示與銷售平臺(tái)合作合同4篇
- 5 我是一張紙 第一課時(shí) 說課稿-2023-2024學(xué)年道德與法治二年級(jí)下冊(cè)統(tǒng)編版
- 二零二五年度龍湖地產(chǎn)龍湖地產(chǎn)房地產(chǎn)建筑施工安全生產(chǎn)協(xié)議2篇
- 8 安全地玩 第二課時(shí) 說課稿-2023-2024學(xué)年道德與法治二年級(jí)下冊(cè)(統(tǒng)編版)
- 公司企業(yè)標(biāo)準(zhǔn)模板版
- 殯儀服務(wù)員考試:殯儀服務(wù)員考試考試卷及答案
- 2024中智集團(tuán)招聘重要崗位(高頻重點(diǎn)提升專題訓(xùn)練)共500題附帶答案詳解
- Unit 1 Cultural Heritage單元整體教學(xué)設(shè)計(jì) 人教版必修第二冊(cè)單元整體教學(xué)設(shè)計(jì)
- 養(yǎng)老護(hù)理員試題及答案
- 2024年山東省高中學(xué)業(yè)水平合格考生物試卷試題(含答案詳解)
- 2025年中考英語復(fù)習(xí)熱點(diǎn)話題作文范文
- 小學(xué)數(shù)學(xué)教學(xué)工作交流數(shù)學(xué)教學(xué)中的體會(huì)總結(jié)經(jīng)驗(yàn)交流會(huì)課件
- 2024年美國(guó)智能馬桶和馬桶蓋市場(chǎng)現(xiàn)狀及上下游分析報(bào)告
- 中國(guó)成人暴發(fā)性心肌炎診斷和治療指南(2023版)解讀
- 復(fù)產(chǎn)復(fù)工六個(gè)一
評(píng)論
0/150
提交評(píng)論