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

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

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

            FeedBack:
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-08-21 11:27 DN
            # re: SDL入門教程(五):4、讓圖片動起來! 2010-09-21 01:58 donneyming
            請問龍飛大哥,要是sdl創建多個窗口 這個看書是哪個 我剛學 還沒找到 求教   回復  更多評論
              
            国产精品99久久精品爆乳| 天天爽天天爽天天片a久久网| 久久久综合九色合综国产| 97精品国产91久久久久久| 国产精品免费久久| 久久久久亚洲精品日久生情| 久久婷婷激情综合色综合俺也去| 国产Av激情久久无码天堂| 国产成人综合久久精品尤物| 亚洲婷婷国产精品电影人久久| 国产精品久久久99| 亚洲国产精品一区二区三区久久 | 人人狠狠综合久久亚洲88| 久久久久亚洲av毛片大| 久久er热视频在这里精品| 久久精品国产亚洲AV忘忧草18| 色综合久久中文综合网| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久精品国产2020| 久久大香萑太香蕉av| 九九久久精品无码专区| 66精品综合久久久久久久| 国产91色综合久久免费| 国产精品福利一区二区久久| 国产精品久久久久AV福利动漫| 99热成人精品热久久669| 成人综合伊人五月婷久久| 久久综合给合久久狠狠狠97色 | 一级做a爰片久久毛片毛片| 久久久WWW免费人成精品| 久久精品国产一区二区| 伊人久久大香线蕉综合Av | 亚洲国产精品人久久| 久久无码人妻精品一区二区三区| 久久久久99精品成人片牛牛影视| 少妇被又大又粗又爽毛片久久黑人| 久久亚洲国产成人影院网站| 性欧美大战久久久久久久| 久久er热视频在这里精品| 精品一二三区久久aaa片| 久久久久久青草大香综合精品|