• <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 長期尋找對(duì)戰(zhàn)略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關(guān)網(wǎng)站

            我的個(gè)人網(wǎng)頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493185
            • 排名 - 39

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            作者:龍飛

                    SDL創(chuàng)建多線程的函數(shù)SDL_CreateThread()所調(diào)用的是函數(shù)指針,這意味著我們不可以傳入(非靜態(tài))成員函數(shù)的指針。關(guān)于兩種函數(shù)指針我們之前已經(jīng)討論過:函數(shù)指針與成員函數(shù)指針,我們可以有兩種方法能讓具有普通函數(shù)指針(函數(shù)指針以及靜態(tài)成員函數(shù)指針)的函數(shù)調(diào)用類的私有成員,一是友元函數(shù),另外就是靜態(tài)成員函數(shù)。而能夠受到類私有保護(hù)的,只有靜態(tài)成員函數(shù)。所以,我們可以通過靜態(tài)成員函數(shù)調(diào)用一個(gè)對(duì)象數(shù)據(jù)的形式,實(shí)現(xiàn)對(duì)于創(chuàng)建多線程函數(shù)的封裝。
                    另外,我們希望測試在主線程中讀寫線程數(shù)據(jù)的效果,所以添加了兩個(gè)方法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請(qǐng)參考:
            http://m.shnenglu.com/lf426/archive/2008/04/14/47038.html
            實(shí)現(xiàn)函數(shù)如下:
            #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()的效果。我們可以看到,直接修改線程數(shù)據(jù)的reset()的結(jié)果也是不可預(yù)知的,所以,我們似乎更應(yīng)該通過改變線程“流”的效果,而不是直接對(duì)數(shù)據(jù)進(jìn)行修改。這個(gè)我們以后再討論了。
            #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) 評(píng)論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(十三):3、封裝多線程  2008-05-01 14:28 func
            完成之后,就出一份pdf文檔吧 :)  回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(十三):3、封裝多線程 [未登錄] 2008-05-01 21:32 lf426
            恩,謝謝支持。任重而道遠(yuǎn)啊……  回復(fù)  更多評(píng)論
              
            久久综合久久综合九色| 亚洲成av人片不卡无码久久| 亚洲午夜福利精品久久| 91精品日韩人妻无码久久不卡| 久久精品中文字幕无码绿巨人 | 狼狼综合久久久久综合网| 亚洲日韩欧美一区久久久久我| 久久99国产一区二区三区| 9191精品国产免费久久| 99热精品久久只有精品| 久久成人精品| 亚洲欧美国产日韩综合久久| 亚洲精品综合久久| 久久综合久久美利坚合众国| 99久久这里只精品国产免费| 精品久久久久久无码不卡| 狠狠色丁香久久婷婷综合_中 | 久久久国产精品| 无码8090精品久久一区| 久久久久亚洲AV成人网人人网站| 日韩欧美亚洲综合久久| 亚洲精品美女久久久久99| 丰满少妇高潮惨叫久久久| 999久久久国产精品| 久久综合狠狠综合久久97色| 久久精品中文字幕一区| 国内精品久久国产大陆| 色综合久久中文字幕综合网| 欧美日韩精品久久免费| 东京热TOKYO综合久久精品| 国产精品一区二区久久精品无码| 久久久久无码国产精品不卡| 亚洲乱码精品久久久久..| 94久久国产乱子伦精品免费| 久久精品国产亚洲αv忘忧草 | 久久精品99无色码中文字幕| 99久久精品免费看国产一区二区三区 | 中文字幕精品无码久久久久久3D日动漫| 亚洲色大成网站www久久九| 老司机国内精品久久久久| 狠狠色婷婷久久一区二区|