• <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年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492145
            • 排名 - 38

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

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

            FeedBack:
            # re: SDL入門教程(十三):3、封裝多線程  2008-05-01 14:28 func
            完成之后,就出一份pdf文檔吧 :)  回復  更多評論
              
            # re: SDL入門教程(十三):3、封裝多線程 [未登錄] 2008-05-01 21:32 lf426
            恩,謝謝支持。任重而道遠啊……  回復  更多評論
              
            99精品久久精品一区二区| 久久久久无码中| 7国产欧美日韩综合天堂中文久久久久| 久久99精品综合国产首页| 欧美麻豆久久久久久中文| 久久亚洲中文字幕精品有坂深雪 | 日本精品久久久久影院日本| 久久精品国产亚洲7777| 亚洲成色www久久网站夜月| 精品久久久久久无码人妻热 | 国产亚洲精品美女久久久| 久久高潮一级毛片免费| 久久久久久亚洲Av无码精品专口| 国产亚洲色婷婷久久99精品91| 伊人久久综合精品无码AV专区| 99久久国产免费福利| 蜜臀av性久久久久蜜臀aⅴ| 香蕉久久永久视频| 91精品国产色综久久| 91精品国产综合久久精品| 2021国产精品久久精品| 久久99精品久久久久久水蜜桃| 久久久久亚洲AV无码专区体验| 久久久国产亚洲精品| 久久精品国产99久久久香蕉| 久久精品国产精品亚洲精品| 热re99久久精品国99热| 精品久久人人妻人人做精品| 成人久久久观看免费毛片| 久久香综合精品久久伊人| 久久播电影网| 精品久久久久中文字幕一区| 国产高清美女一级a毛片久久w| 久久国产乱子伦免费精品| 人妻无码αv中文字幕久久| 国产成人精品久久| 国产精品99久久久精品无码 | 久久亚洲精品成人无码网站| 久久99久久成人免费播放| 久久精品国产黑森林| 久久精品成人影院|