• <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相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492196
            • 排名 - 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| 久久久久国产精品麻豆AR影院| 99久久无色码中文字幕人妻| 久久久这里有精品| 中文字幕日本人妻久久久免费| 精品久久久久久中文字幕人妻最新 | 一本色综合网久久| 国产精品国色综合久久| 伊人色综合九久久天天蜜桃| 久久久久久久亚洲Av无码| 久久精品国产只有精品66| 亚洲精品无码久久千人斩| 久久精品国产精品亚洲人人| 亚洲中文久久精品无码ww16| 久久精品综合一区二区三区| 国产精品久久网| 欧洲精品久久久av无码电影| 久久久久99精品成人片| 久久99中文字幕久久| 亚洲va国产va天堂va久久| 日日狠狠久久偷偷色综合0| 99久久伊人精品综合观看| 久久久一本精品99久久精品88 | 欧美大香线蕉线伊人久久| 久久996热精品xxxx| 国产精品一区二区久久精品| 一本色道久久88精品综合 | 久久久久亚洲av成人网人人软件| 26uuu久久五月天| 国产精品美女久久久久网| 久久人人爽人人爽人人片AV不| 久久热这里只有精品在线观看| 久久伊人精品青青草原日本| 久久久久人妻一区精品| 久久久久久无码国产精品中文字幕 | 久久精品国产亚洲AV嫖农村妇女| 亚洲午夜久久久久妓女影院| 香蕉久久夜色精品升级完成| 色妞色综合久久夜夜| 久久精品夜夜夜夜夜久久| 97久久超碰成人精品网站|