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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

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

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

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492138
            • 排名 - 38

            最新評(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ù)的封裝。
                    另外,我們希望測(cè)試在主線程中讀寫線程數(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://www.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;
            }
            最后,我們修改了主演示程序,并測(cè)試了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 閱讀(2945) 評(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)論
              
            亚洲精品97久久中文字幕无码| 成人国内精品久久久久影院| 国内精品久久久久久久97牛牛| 久久国产亚洲精品| 久久e热在这里只有国产中文精品99 | 国内精品久久久久久99蜜桃 | 久久无码人妻精品一区二区三区| 精品久久久久久久| 久久九九青青国产精品| 国产麻豆精品久久一二三| 丰满少妇人妻久久久久久| 91精品国产综合久久精品| 精品久久久久久国产| 国产99久久久国产精品~~牛| 国产精品免费久久| 久久久久99精品成人片牛牛影视| 人妻精品久久久久中文字幕| 久久精品青青草原伊人| 久久亚洲日韩精品一区二区三区| 91精品国产高清久久久久久国产嫩草 | 99久久精品毛片免费播放| 久久婷婷综合中文字幕| 久久午夜福利电影| 亚洲精品无码久久千人斩| 99久久精品午夜一区二区| 久久久受www免费人成| 伊人色综合久久天天人手人婷| 久久精品国产精品国产精品污 | 思思久久99热免费精品6| 欧美一区二区三区久久综合| 久久97久久97精品免视看秋霞| 伊人久久大香线蕉av一区| 伊人色综合久久天天| 久久精品人妻中文系列| 亚洲嫩草影院久久精品| 亚洲精品乱码久久久久久自慰| 日本免费久久久久久久网站| 国产69精品久久久久9999APGF | 91精品国产9l久久久久| 性高朝久久久久久久久久| 久久久久综合网久久|