• <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創建多個窗口 這個看書是哪個 我剛學 還沒找到 求教   回復  更多評論
              
            精品熟女少妇a∨免费久久| 欧美一区二区精品久久| 一本久久精品一区二区| 久久亚洲高清综合| 久久综合给合久久国产免费 | 无码任你躁久久久久久老妇App| 久久综合视频网站| 久久久久久九九99精品| 丁香五月综合久久激情| 久久国产免费直播| 亚洲国产精品久久久久| 久久香综合精品久久伊人| 久久综合久久综合九色| 亚洲国产精品成人久久蜜臀| 97r久久精品国产99国产精| 国产精品99久久久久久宅男小说| 久久精品国产亚洲综合色| 伊人久久综合无码成人网| 久久99精品久久久久久秒播| 97精品伊人久久大香线蕉app| 一本大道久久东京热无码AV| 国产精品日韩欧美久久综合| 久久精品国产亚洲精品2020| 久久狠狠爱亚洲综合影院| 一本久久综合亚洲鲁鲁五月天| 亚洲天堂久久精品| 精品综合久久久久久97超人| 人妻久久久一区二区三区| 久久人人爽人人爽人人av东京热| 久久久久九国产精品| 99国内精品久久久久久久| 国内精品久久久久影院优| 亚洲AV日韩精品久久久久久| 久久亚洲精品成人无码网站| 国产精品久久久久久久久软件| 亚洲国产精品无码久久九九 | 欧美噜噜久久久XXX| 久久久精品人妻一区二区三区蜜桃 | 久久被窝电影亚洲爽爽爽| 久久99久久99小草精品免视看| 国产精品久久久久国产A级|