• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2008年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            2425262728291
            2345678

            E-mail:zbln426@163.com QQ:85132383 長期尋找對戰略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492164
            • 排名 - 38

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            4.1:再討論簡單的SDL event響應。
            Uint8 *SDL_GetKeyState(int *numkeys);
                    要讓圖片動起來,最好是我們可以“操作”的動。按照一般思路,鍵盤的“上”“下”“左”“右”是不錯的選擇。在FPS游戲和模擬器中,我們可能更習慣wsad四個鍵,所以,讓他們同時起作用吧。這個函數的一般用法,是把參數設置為空指針。我們還是先忽略細節。因為有了兩個新的blit()重載方法的加入,我們設置要移動的圖片在screen上的坐標是(xpos,ypos),則:
                //key event for up, down, left and right.
                Uint8* keys;
                
            //moving image's coordinate.
                int xpos = 0;
                
            int ypos = 0;
            控制圖片移動的代碼如下:
                    //key event to move image.
                    keys = SDL_GetKeyState(0);
                    
            if ( keys[SDLK_UP] || keys[SDLK_w] ){
                        ypos 
            -= 1;
                    }
                    
            if ( keys[SDLK_DOWN]|| keys[SDLK_s] ){
                        ypos 
            += 1;
                    }
                    
            if ( keys[SDLK_LEFT]|| keys[SDLK_a] ){
                        xpos 
            -= 1;
                    }
                    
            if ( keys[SDLK_RIGHT]|| keys[SDLK_d] ){
                        xpos 
            += 1;
                    }
            代碼一目了然,不用多解釋。具體對應的按鍵可參考:
            http://www.libsdl.org/cgi/docwiki.cgi/SDLKey

            4.2:對于第二種方法的分析。

                    我們前面討論了總是把surface blit到screen上的情況。如果我們的思路是把其他surface先blit到一個作為背景畫布的surface上,最后把背景畫布blit到screen上呢?
                    我們將遇到的第一個疑問是,surface能不能把自己blit到自己上面?試驗的結果是否定的,而SDL并沒有給出官方的異常信息,即SDL_GetError()沒有起作用。所以,異常得我們自己來拋出。另外一個后果是,我們必須建立背景畫布的拷貝,把拷貝blit到背景畫布上才是可行的。
            class DisplaySurface
            {
            public:
                
            bool blitToSurface(const DisplaySurface& dst_surface,
                                    
            int at_x = 0int at_y = 0const;
                
            bool blitToSurface(const DisplaySurface& dst_surface,
                                    
            int at_x, int at_y,
                                    
            int from_x, int from_y, int w, int h,
                                    
            int delta_x = 2int delta_y = 2const;
            };
            這和blit到screen是類似的,但是實際效果是完全不一樣的。因為,沒有被blit到screen上的surface,都不可能被flip顯示出來。所以,雖然參數列表是不一樣的,意味著我可以繼續用blit()這個名字重載。但是為了表明他們的實際效果有區別,我重新用了方法名。
            bool DisplaySurface::blitToSurface(const DisplaySurface& dst_surface, int at_x, int at_y) const
            {
                SDL_Rect offset;
                offset.x 
            = at_x;
                offset.y 
            = at_y;

                
            if ( &dst_surface == this )
                    
            throw "Cannot blit surface to itself!";

                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
                    
            return false;
                
            else return true;
            }

            bool DisplaySurface::blitToSurface(const DisplaySurface& dst_surface,
                                                
            int at_x, int at_y,
                                                
            int from_x, int from_y, int w, int h,
                                                
            int delta_x, int delta_y) const
            {
                SDL_Rect offset;
                offset.x 
            = at_x - delta_x;
                offset.y 
            = at_y - delta_y;

                SDL_Rect dest;
                dest.x 
            = from_x - delta_x;
                dest.y 
            = from_y - delta_y;
                dest.w 
            = w + delta_x*2;
                dest.h 
            = h + delta_y*2;

                
            if ( &dst_surface == this )
                    
            throw "Cannot blit surface to itself!";

                
            if ( SDL_BlitSurface(pSurface, &dest, dst_surface.point(), &offset) < 0 )
                    
            return false;
                
            else return true;
            }
            posted on 2008-02-21 15:12 lf426 閱讀(3816) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-08-21 11:27 DN
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-09-21 01:58 donneyming
            請問龍飛大哥,要是sdl創建多個窗口 這個看書是哪個 我剛學 還沒找到 求教   回復  更多評論
              
            99久久精品费精品国产 | 亚洲av伊人久久综合密臀性色| 久久综合九色综合久99| 久久夜色精品国产噜噜亚洲a| 久久亚洲精品成人无码网站| 久久久久人妻一区二区三区vr | 国产精品一区二区久久精品无码 | 狠狠综合久久综合88亚洲| 国内精品伊人久久久久AV影院| 韩国三级中文字幕hd久久精品| 久久亚洲熟女cc98cm| 欧美综合天天夜夜久久| 中文字幕无码精品亚洲资源网久久| av无码久久久久久不卡网站| 亚洲人成无码www久久久| 91精品国产91久久久久福利| 青青青青久久精品国产h久久精品五福影院1421 | 久久亚洲电影| 精品无码久久久久久尤物| 欧美麻豆久久久久久中文| 国产精品久久久久影院色| 综合久久一区二区三区 | 久久91精品综合国产首页| 人人狠狠综合久久88成人| 亚洲国产精品综合久久网络 | 久久精品青青草原伊人| 久久亚洲色一区二区三区| 成人妇女免费播放久久久| 久久午夜无码鲁丝片| 久久久久久精品免费免费自慰| 久久一区二区三区免费| 7国产欧美日韩综合天堂中文久久久久 | 久久国产精品77777| 亚洲国产精品成人久久| 久久久久久精品免费看SSS | 久久精品国产亚洲7777| 国产高潮国产高潮久久久91| 日本久久久精品中文字幕| 久久99精品久久久久久hb无码| 蜜臀av性久久久久蜜臀aⅴ| 色欲av伊人久久大香线蕉影院 |