• <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年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493132
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

                    SDL創建多線程的函數SDL_CreateThread()所調用的是函數指針,這意味著我們不可以傳入(非靜態)成員函數的指針。關于兩種函數指針我們之前已經討論過:函數指針與成員函數指針,我們可以有兩種方法能讓具有普通函數指針(函數指針以及靜態成員函數指針)的函數調用類的私有成員,一是友元函數,另外就是靜態成員函數。而能夠受到類私有保護的,只有靜態成員函數。所以,我們可以通過靜態成員函數調用一個對象數據的形式,實現對于創建多線程函數的封裝。
                    另外,我們希望測試在主線程中讀寫線程數據的效果,所以添加了兩個方法show() 和reset(),多線程演示的類源代碼如下:
            #include <iostream>
            #include 
            "SurfaceClass.hpp"

            class AmnArg
            {
            private:
                
            int beginX;
                
            int beginY;
                
            int endX;
                
            int endY;
                
            const ScreenSurface& screen;
                
            //
                static int amn(void* pThat);
            public:
                AmnArg(
            int begin_x, int begin_y, int end_x, int end_y, const ScreenSurface& _screen);
                SDL_Thread
            * createThrd();
                
            void show() const;
                
            void reset();
            };
            其中SurfaceClass.hpp請參考:
            http://m.shnenglu.com/lf426/archive/2008/04/14/47038.html
            實現函數如下:
            #include "amn.hpp"

            AmnArg::AmnArg(
            int begin_x, int begin_y, int end_x, int end_y, const ScreenSurface& _screen):
            beginX(begin_x), beginY(begin_y), endX(end_x), endY(end_y), screen(_screen)
            {}

            SDL_Thread
            * AmnArg::createThrd()
            {
                
            return SDL_CreateThread(amn, (void*)this);
            }

            void AmnArg::show() const
            {
                std::cout 
            << "Now x at: " << beginX << std::endl;
            }

            void AmnArg::reset()
            {
                beginX 
            = 0;
            }

            int AmnArg::amn(void* pThat)
            {
                AmnArg
            * pData = (AmnArg*)pThat;
                PictureSurface stand(
            "./images/am01.png", pData->screen);
                stand.colorKey();
                PictureSurface bg(
            "./images/background.png", pData->screen);

                
            const int SPEED_CTRL = 300;
                
            int speedX = (pData->endX - pData->beginX) / SPEED_CTRL;
                
            int speedY = (pData->endY - pData->beginY) / SPEED_CTRL;

                
            for ( int i = 0; i < SPEED_CTRL; i++ ){
                    pData
            ->beginX += speedX;
                    pData
            ->beginY += speedY;
                    bg.blit(pData
            ->beginX, pData->beginY, pData->beginX, pData->beginY, stand.point()->w, stand.point()->h, 22);
                    stand.blit(pData
            ->beginX, pData->beginY);
                    pData
            ->screen.flip();
                    SDL_Delay(
            10);
                }

                
            return 0;
            }
            最后,我們修改了主演示程序,并測試了show()和reset()的效果。我們可以看到,直接修改線程數據的reset()的結果也是不可預知的,所以,我們似乎更應該通過改變線程“流”的效果,而不是直接對數據進行修改。這個我們以后再討論了。
            #include "SurfaceClass.hpp"
            #include 
            "amn.hpp"

            int game(int argc ,char* argv[]);
            int main(int argc ,char* argv[])
            {
                
            int mainRtn = 0;
                
            try {
                    mainRtn 
            = game(argc, argv);
                }
                
            catch ( const ErrorInfo& info ) {
                    info.show();
                    
            return -1;
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << s << std::endl;
                    
            return -1;
                }
                
                
            return mainRtn;
            }

            int game(int argc ,char* argv[])
            {
                
            //Create a SDL screen.
                const int SCREEN_WIDTH = 640;
                
            const int SCREEN_HEIGHT = 480;
                
            const Uint32 SCREEN_FLAGS = 0//SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE
                const std::string WINDOW_NAME = "Amn Test";
                ScreenSurface screen(SCREEN_WIDTH, SCREEN_HEIGHT, WINDOW_NAME, 
            0, SCREEN_FLAGS);

                PictureSurface bg(
            "./images/background.png", screen);
                bg.blit(
            0);
                screen.flip();

                AmnArg test1(
            0250600250, screen);
                SDL_Thread
            * thread1 = test1.createThrd();
                
                AmnArg test2(
            004000, screen);
                SDL_Thread
            * thread2 = test2.createThrd();

                SDL_Event gameEvent;
                
            bool gameOver = false;
                
            while ( gameOver == false ){
                    
            while ( SDL_PollEvent(&gameEvent) != 0 ){
                        
            if ( gameEvent.type == SDL_QUIT ){
                            gameOver 
            = true;
                        }
                        
            if ( gameEvent.type == SDL_KEYDOWN ){
                            
            if ( gameEvent.key.keysym.sym == SDLK_ESCAPE ){
                                gameOver 
            = true;
                            }
                            
            if ( gameEvent.key.keysym.sym == SDLK_SPACE ){
                                test1.show();
                                test2.show();
                            }
                        }
                        screen.flip();
                    }
                    SDL_Delay(
            100);
                }

                SDL_KillThread(thread1);
                SDL_KillThread(thread2);

                
            return 0;
            }
            posted on 2008-04-28 14:24 lf426 閱讀(2955) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(十三):3、封裝多線程  2008-05-01 14:28 func
            完成之后,就出一份pdf文檔吧 :)  回復  更多評論
              
            # re: SDL入門教程(十三):3、封裝多線程 [未登錄] 2008-05-01 21:32 lf426
            恩,謝謝支持。任重而道遠啊……  回復  更多評論
              
            久久99精品国产麻豆宅宅| 国产高清国内精品福利99久久| 香蕉aa三级久久毛片| 久久综合鬼色88久久精品综合自在自线噜噜 | 精品无码久久久久国产| 精品久久人人爽天天玩人人妻| 久久久亚洲AV波多野结衣| 国产精品久久久久久久久免费| 久久人妻少妇嫩草AV蜜桃| 久久婷婷成人综合色综合| 久久影视国产亚洲| jizzjizz国产精品久久| 无码8090精品久久一区| 中文字幕一区二区三区久久网站| 国产精品久久久久免费a∨| 国内精品久久久久久中文字幕| 色婷婷综合久久久久中文一区二区| 51久久夜色精品国产| 成人妇女免费播放久久久| 日韩人妻无码一区二区三区久久99| 国产精品久久久久久久久久免费| 久久99国产精品99久久| 亚洲国产精品无码久久久蜜芽| 亚洲欧美久久久久9999| 精品久久久久久99人妻| 国产精久久一区二区三区| 久久久久久综合一区中文字幕| 久久午夜羞羞影院免费观看| 色天使久久综合网天天| 久久精品一本到99热免费| 久久久久久久精品妇女99| 奇米影视7777久久精品人人爽 | 99久久精品九九亚洲精品| 久久国产热精品波多野结衣AV| 亚洲国产小视频精品久久久三级| 色婷婷久久久SWAG精品| 94久久国产乱子伦精品免费 | 久久婷婷国产麻豆91天堂| 久久se精品一区精品二区| 中文字幕亚洲综合久久| 模特私拍国产精品久久|