• <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
            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

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

            我的個人網(wǎng)頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493597
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

                    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ù)。而能夠受到類私有保護的,只有靜態(tài)成員函數(shù)。所以,我們可以通過靜態(tài)成員函數(shù)調(diào)用一個對象數(shù)據(jù)的形式,實現(xiàn)對于創(chuàng)建多線程函數(shù)的封裝。
                    另外,我們希望測試在主線程中讀寫線程數(shù)據(jù)的效果,所以添加了兩個方法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
            實現(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)該通過改變線程“流”的效果,而不是直接對數(shù)據(jù)進行修改。這個我們以后再討論了。
            #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 閱讀(2959) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(十三):3、封裝多線程  2008-05-01 14:28 func
            完成之后,就出一份pdf文檔吧 :)  回復(fù)  更多評論
              
            # re: SDL入門教程(十三):3、封裝多線程 [未登錄] 2008-05-01 21:32 lf426
            恩,謝謝支持。任重而道遠啊……  回復(fù)  更多評論
              
            久久人妻少妇嫩草AV蜜桃| 国产精品免费久久久久影院| 久久久久亚洲av无码专区导航| 久久99精品久久久久久久不卡 | 久久国产成人| 久久精品国产久精国产果冻传媒| 99久久人妻无码精品系列蜜桃| 国产L精品国产亚洲区久久| 久久久久久久综合狠狠综合| 丰满少妇高潮惨叫久久久| 国产一区二区久久久| AA级片免费看视频久久| 国产亚洲综合久久系列| 久久人与动人物a级毛片| 国内精品久久国产大陆| 亚洲国产精品无码久久98| 亚洲欧洲久久av| 久久最新免费视频| 精品久久人人做人人爽综合| 久久久精品国产sm调教网站| 狠狠色丁香久久婷婷综合蜜芽五月| 中文字幕亚洲综合久久| 色欲久久久天天天综合网精品| 久久综合视频网| 一本一本久久a久久精品综合麻豆| 国产精品无码久久四虎| 91性高湖久久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 精品久久久久久成人AV| 国内高清久久久久久| 国内精品久久久久久久久电影网 | 久久精品国产男包| 久久精品国产亚洲AV蜜臀色欲| 久久精品国产亚洲AV无码偷窥| 久久人人爽人人人人爽AV| 亚洲欧美成人综合久久久| 久久亚洲春色中文字幕久久久| 久久久一本精品99久久精品66| 人妻精品久久无码专区精东影业| 久久人妻少妇嫩草AV无码专区| 99999久久久久久亚洲|