• <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年9月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493151
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            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 閱讀(3822) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-08-21 11:27 DN
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-09-21 01:58 donneyming
            請問龍飛大哥,要是sdl創建多個窗口 這個看書是哪個 我剛學 還沒找到 求教   回復  更多評論
              
            亚洲国产婷婷香蕉久久久久久| 精品国际久久久久999波多野| 欧美亚洲国产精品久久蜜芽| 久久99久久成人免费播放| 亚洲欧美一级久久精品| 久久精品夜夜夜夜夜久久| 欧美一区二区精品久久| 久久久久久久久久久精品尤物 | 亚洲综合精品香蕉久久网97| 国内精品久久久久久久影视麻豆 | 久久天天躁狠狠躁夜夜躁2O2O| 国产亚洲精品自在久久| 亚洲国产成人久久综合一区77| 精品久久久久久成人AV| 久久久精品国产| 91精品国产综合久久四虎久久无码一级| 久久婷婷五月综合97色直播| 91精品国产乱码久久久久久| 中文精品99久久国产 | 国产精品成人无码久久久久久| 国产毛片欧美毛片久久久| 久久无码一区二区三区少妇| 久久免费视频网站| 国产精品99久久久久久人| 7777精品久久久大香线蕉| 亚洲精品美女久久久久99小说| 精品视频久久久久| 国产农村妇女毛片精品久久| 青青青青久久精品国产 | 俺来也俺去啦久久综合网| 久久国产免费直播| 久久人人爽人人爽人人片AV东京热| 国产精品热久久毛片| 99久久综合狠狠综合久久| 久久99国产精品久久| 99久久婷婷免费国产综合精品| 亚洲精品乱码久久久久久自慰| 国内精品伊人久久久久妇| 一本一本久久a久久精品综合麻豆| 性高朝久久久久久久久久| 久久久久人妻一区二区三区 |